You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by al...@apache.org on 2021/11/19 19:21:53 UTC

[kudu] 02/02: [client] fix custom hash schema criterion in KuduTableCreator::Create()

This is an automated email from the ASF dual-hosted git repository.

alexey pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git

commit e05ff65951e72dcb216abf5472af9577fbe38fce
Author: Alexey Serbin <al...@apache.org>
AuthorDate: Thu Nov 18 20:16:05 2021 -0800

    [client] fix custom hash schema criterion in KuduTableCreator::Create()
    
    This patch fixes a bug in KuduTableCreator::Create(): the criterion
    for the presence of custom hash schemas per range flag should account
    for the case when the table-wide hash schema is non-empty, but there is
    a range partition with empty hash schema.
    
    This patch also contains a new test to cover the related functionality.
    I verified that the test was failing before this patch, and with this
    patch it's now passing.
    
    Change-Id: I51fb745cfe7afb861b4bba54e56d79eca4832605
    Reviewed-on: http://gerrit.cloudera.org:8080/18039
    Tested-by: Alexey Serbin <as...@cloudera.com>
    Reviewed-by: Mahesh Reddy <mr...@cloudera.com>
    Reviewed-by: Andrew Wong <aw...@cloudera.com>
---
 src/kudu/client/client.cc                        |  2 +-
 src/kudu/client/flex_partitioning_client-test.cc | 55 +++++++++++++++++++++++-
 2 files changed, 54 insertions(+), 3 deletions(-)

diff --git a/src/kudu/client/client.cc b/src/kudu/client/client.cc
index 757a598..e26a46c 100644
--- a/src/kudu/client/client.cc
+++ b/src/kudu/client/client.cc
@@ -947,7 +947,7 @@ Status KuduTableCreator::Create() {
 
   bool has_range_with_custom_hash_schema = false;
   for (const auto& p : data_->range_partitions_) {
-    if (!p->data_->hash_schema_.empty()) {
+    if (!p->data_->is_table_wide_hash_schema_) {
       has_range_with_custom_hash_schema = true;
       break;
     }
diff --git a/src/kudu/client/flex_partitioning_client-test.cc b/src/kudu/client/flex_partitioning_client-test.cc
index ed38612..b4967f0 100644
--- a/src/kudu/client/flex_partitioning_client-test.cc
+++ b/src/kudu/client/flex_partitioning_client-test.cc
@@ -353,7 +353,59 @@ TEST_F(FlexPartitioningCreateTableTest, EmptyTableWideHashSchema) {
   // There should be 2 tablets total: one per each range created.
   NO_FATALS(CheckTabletCount(kTableName, 2));
   ASSERT_OK(InsertTestRows(kTableName, -111, 222, KuduSession::MANUAL_FLUSH));
-  NO_FATALS(CheckTableRowsNum(kTableName, 333));
+  NO_FATALS(CheckLiveRowCount(kTableName, 333));
+  // TODO(aserbin): uncomment the line below once PartitionPruner handles such
+  //                cases properly
+  //NO_FATALS(CheckTableRowsNum(kTableName, 333));
+}
+
+TEST_F(FlexPartitioningCreateTableTest, SingleCustomRangeEmptyHashSchema) {
+  // Create a table with the following partitions:
+  //
+  //           hash bucket
+  //   key    0           1
+  //         -------------------------
+  //  <111    x:{key}     x:{key}
+  // 111-222  -           -
+  constexpr const char* const kTableName = "SingleCustomRangeEmptyHashSchema";
+
+  unique_ptr<KuduTableCreator> table_creator(client_->NewTableCreator());
+  table_creator->table_name(kTableName)
+      .schema(&schema_)
+      .num_replicas(1)
+      .add_hash_partitions({ kKeyColumn }, 2)
+      .set_range_partition_columns({ kKeyColumn });
+
+  // Add a range partition with the table-wide hash partitioning rules.
+  {
+    unique_ptr<KuduPartialRow> lower(schema_.NewRow());
+    ASSERT_OK(lower->SetInt32(kKeyColumn, INT32_MIN));
+    unique_ptr<KuduPartialRow> upper(schema_.NewRow());
+    ASSERT_OK(upper->SetInt32(kKeyColumn, 111));
+    table_creator->add_range_partition(lower.release(), upper.release());
+  }
+
+  // Add a range partition with no hash bucketing. Not calling
+  // KuduRangePartition::add_hash_partitions() on the newly created range means
+  // the range doesn't have any hash bucketing.
+  {
+    auto p = CreateRangePartition(111, 222);
+    table_creator->add_custom_range_partition(p.release());
+  }
+
+  ASSERT_OK(table_creator->Create());
+  NO_FATALS(CheckTabletCount(kTableName, 3));
+
+  // Make sure it's possible to insert rows into the table for all the existing
+  // the partitions: first check the range of table-wide schema, then check
+  // the ranges with custom hash schemas.
+  ASSERT_OK(InsertTestRows(kTableName, -111, 0));
+  NO_FATALS(CheckLiveRowCount(kTableName, 111));
+  ASSERT_OK(InsertTestRows(kTableName, 111, 222));
+  NO_FATALS(CheckLiveRowCount(kTableName, 222));
+  // TODO(aserbin): uncomment the line below once PartitionPruner handles such
+  //                cases properly
+  //NO_FATALS(CheckTableRowsNum(kTableName, 222));
 }
 
 // Create a table with mixed set of range partitions, using both table-wide and
@@ -362,7 +414,6 @@ TEST_F(FlexPartitioningCreateTableTest, EmptyTableWideHashSchema) {
 // TODO(aserbin): add verification based on PartitionSchema provided by
 //                KuduTable::partition_schema() once PartitionPruner
 //                recognized custom hash bucket schema for ranges
-// TODO(aserbin): add InsertTestRows() when proper key encoding is implemented
 TEST_F(FlexPartitioningCreateTableTest, DefaultAndCustomHashSchemas) {
   // Create a table with the following partitions:
   //