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 23908bdbe753c25aa2a33796559ecf64f0197949
Author: Alexey Serbin <ale...@apache.org>
AuthorDate: Fri Jul 8 17:01:34 2022 -0700

    KUDU-2671 fix consistency check in KuduScanner::NextBatch()
    
    KuduScanner::Data::OpenTablet() can return earlier when the metacache
    returns a tablet covering the partition key range past the partition key
    provided.  In such case, the 'proxy_' member of KuduScanner::Data isn't
    set, and that's expected since the upper level code should continue with
    the next tablet.  The new test sub-scenarios introduced in [1] triggered
    the consistency check on the 'data_->proxy_' member in
    KuduScanner::NextBatch(), so this patch addresses the issue.
    
    Also, this patch re-enables a few test sub-scenarios introduced in
    [1] and [2].
    
    [1] 
https://github.com/apache/kudu/commit/b746978c71ce4a95b69d49c43d0ac852909a8b4e
    [2] 
https://github.com/apache/kudu/commit/1889d4c44385fec5efeeb2d287d9ab7a3544dcfe
    
    Change-Id: Icfbdfac46f35d4d143f37845d158795bf1793da7
    Reviewed-on: http://gerrit.cloudera.org:8080/18715
    Reviewed-by: Khazar Mammadli <mammadli.kha...@cloudera.com>
    Tested-by: Alexey Serbin <ale...@apache.org>
    Reviewed-by: Mahesh Reddy <mre...@cloudera.com>
    Reviewed-by: Abhishek Chennaka <achenn...@cloudera.com>
    Reviewed-by: Attila Bukor <abu...@apache.org>
---
 src/kudu/client/client.cc                        |  3 +-
 src/kudu/client/flex_partitioning_client-test.cc | 37 +++++++++---------------
 src/kudu/client/scanner-internal.cc              |  1 +
 3 files changed, 17 insertions(+), 24 deletions(-)

diff --git a/src/kudu/client/client.cc b/src/kudu/client/client.cc
index 46b9a53da..7adc33800 100644
--- a/src/kudu/client/client.cc
+++ b/src/kudu/client/client.cc
@@ -2027,7 +2027,6 @@ Status 
KuduScanner::NextBatch(internal::ScanBatchDataInterface* batch_data) {
   // need to do some swapping of the response objects around to avoid
   // stomping on the memory the user is looking at.
   CHECK(data_->open_);
-  CHECK(data_->proxy_);
 
   batch_data->Clear();
 
@@ -2037,6 +2036,7 @@ Status 
KuduScanner::NextBatch(internal::ScanBatchDataInterface* batch_data) {
 
   if (data_->data_in_open_) {
     // We have data from a previous scan.
+    CHECK(data_->proxy_);
     VLOG(2) << "Extracting data from " << data_->DebugString();
     data_->data_in_open_ = false;
     return batch_data->Reset(&data_->controller_,
@@ -2048,6 +2048,7 @@ Status 
KuduScanner::NextBatch(internal::ScanBatchDataInterface* batch_data) {
 
   if (data_->last_response_.has_more_results()) {
     // More data is available in this tablet.
+    CHECK(data_->proxy_);
     VLOG(2) << "Continuing " << data_->DebugString();
 
     MonoTime batch_deadline = MonoTime::Now() + 
data_->configuration().timeout();
diff --git a/src/kudu/client/flex_partitioning_client-test.cc 
b/src/kudu/client/flex_partitioning_client-test.cc
index 35a10a54f..17ed4baa0 100644
--- a/src/kudu/client/flex_partitioning_client-test.cc
+++ b/src/kudu/client/flex_partitioning_client-test.cc
@@ -253,9 +253,9 @@ class FlexPartitioningTest : public KuduTest {
     }
     ASSERT_OK(scanner.Open());
 
-    KuduScanBatch batch;
     int64_t count = 0;
     while (scanner.HasMoreRows()) {
+      KuduScanBatch batch;
       ASSERT_OK(scanner.NextBatch(&batch));
       count += batch.NumRows();
     }
@@ -300,7 +300,7 @@ class FlexPartitioningTest : public KuduTest {
     ASSERT_OK(scanner.AddConjunctPredicate(table->NewComparisonPredicate(
         col_name, KuduPredicate::GREATER_EQUAL, KuduValue::FromInt(lower))));
     ASSERT_OK(scanner.AddConjunctPredicate(table->NewComparisonPredicate(
-        col_name, KuduPredicate::LESS_EQUAL, KuduValue::FromInt(upper))));
+        col_name, KuduPredicate::LESS, KuduValue::FromInt(upper))));
 
     ASSERT_OK(scanner.Open());
     KuduScanBatch batch;
@@ -444,19 +444,13 @@ TEST_F(FlexPartitioningCreateTableTest, 
DISABLED_SingleCustomRangeEmptyHashSchem
   // 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(CheckTableRowsNum(kTableName, 111));
+  NO_FATALS(CheckTableRowsNum(kTableName, 111));
   ASSERT_OK(InsertTestRows(kTableName, 111, 222));
-  // TODO(aserbin): uncomment the line below once PartitionPruner handles such
-  //                cases properly
-  //NO_FATALS(CheckTableRowsNum(kTableName, 222));
+  NO_FATALS(CheckTableRowsNum(kTableName, 222));
 }
 
 // Create a table with mixed set of range partitions, using both table-wide and
 // custom hash bucket schemas.
-//
-// TODO(aserbin): add verification based on PartitionSchema provided by
-//                KuduTable::partition_schema() once PartitionPruner
-//                recognizes custom hash bucket schema per range
 TEST_F(FlexPartitioningCreateTableTest, DefaultAndCustomHashSchemas) {
   // Create a table with the following partitions:
   //
@@ -991,8 +985,8 @@ TEST_F(FlexPartitioningCreateTableTest, 
ScansWithRangePredicates) {
   CheckScanWithColumnPredicate(kTableName, "key", 83, 3, 250, 333);
   CheckScanWithColumnPredicate(kTableName, "key", 1, 1, 0, 1);
   CheckScanWithColumnPredicate(kTableName, "key", 2, 6, 110, 112);
-  //CheckScanWithColumnPredicate(kTableName, "key", 0, 0, -10, -5);
-  //CheckScanWithColumnPredicate(kTableName, "key", 0, 0, 350, 400);
+  CheckScanWithColumnPredicate(kTableName, "key", 0, 0, -10, -5);
+  CheckScanWithColumnPredicate(kTableName, "key", 0, 0, 350, 400);
   CheckScanWithColumnPredicate(kTableName, "key", 1, 1, 332, 333);
   CheckScanWithColumnPredicate(kTableName, "key", 0, 0, 333, 334);
   CheckScanWithColumnPredicate(kTableName, "key", 100, 2, lower_filler, 100);
@@ -1003,7 +997,7 @@ TEST_F(FlexPartitioningCreateTableTest, 
ScansWithRangePredicates) {
   CheckScanWithColumnPredicate(kTableName, "key", 233, 9, 100, upper_filler);
   CheckScanWithColumnPredicate(kTableName, "key", 133, 7, 200, upper_filler);
   CheckScanWithColumnPredicate(kTableName, "key", 83, 3, 250, upper_filler);
-  //CheckScanWithColumnPredicate(kTableName, "key", 0, 0, 333, upper_filler);
+  CheckScanWithColumnPredicate(kTableName, "key", 0, 0, 333, upper_filler);
 
   // Meanwhile, inserting into non-covered ranges should result in a proper
   // error status return to the client attempting such an operation.
@@ -1095,8 +1089,8 @@ TEST_F(FlexPartitioningCreateTableTest, 
ScansWithRangePredicatesWithSameHashBuck
   CheckScanWithColumnPredicate(kTableName, "key", 3, 6, 110, 113);
   CheckScanWithColumnPredicate(kTableName, "key", 1, 1, 332, 333);
   CheckScanWithColumnPredicate(kTableName, "key", 0, 0, 333, 334);
-  //CheckScanWithColumnPredicate(kTableName, "key", 0, 0, -10, -5);
-  //CheckScanWithColumnPredicate(kTableName, "key", 0, 0, 350, 400);
+  CheckScanWithColumnPredicate(kTableName, "key", 0, 0, -10, -5);
+  CheckScanWithColumnPredicate(kTableName, "key", 0, 0, 350, 400);
   CheckScanWithColumnPredicate(kTableName, "key", 100, 3, lower_filler, 100);
   CheckScanWithColumnPredicate(kTableName, "key", 250, 9, lower_filler, 250);
   CheckScanWithColumnPredicate(kTableName, "key", 333, 9, lower_filler, 333);
@@ -1105,7 +1099,7 @@ TEST_F(FlexPartitioningCreateTableTest, 
ScansWithRangePredicatesWithSameHashBuck
   CheckScanWithColumnPredicate(kTableName, "key", 233, 9, 100, upper_filler);
   CheckScanWithColumnPredicate(kTableName, "key", 133, 6, 200, upper_filler);
   CheckScanWithColumnPredicate(kTableName, "key", 83, 3, 250, upper_filler);
-  //CheckScanWithColumnPredicate(kTableName, "key", 0, 0, 333, upper_filler);
+  CheckScanWithColumnPredicate(kTableName, "key", 0, 0, 333, upper_filler);
 
   // Meanwhile, inserting into non-covered ranges should result in a proper
   // error status return to the client attempting such an operation.
@@ -1190,8 +1184,8 @@ TEST_F(FlexPartitioningCreateTableTest, 
ScansWithNonCoveringRanges) {
   CheckScanWithColumnPredicate(kTableName, "key", 333, 9, -50, 600);
   CheckScanWithColumnPredicate(kTableName, "key", 222, 5, 150, 600);
   CheckScanWithColumnPredicate(kTableName, "key", 1, 1, 0, 1);
-  //CheckScanWithColumnPredicate(kTableName, "key", 0, 0, -10, -5);
-  //CheckScanWithColumnPredicate(kTableName, "key", 0, 0, 600, 650);
+  CheckScanWithColumnPredicate(kTableName, "key", 0, 0, -10, -5);
+  CheckScanWithColumnPredicate(kTableName, "key", 0, 0, 600, 650);
   CheckScanWithColumnPredicate(kTableName, "key", 1, 1, 554, 555);
   CheckScanWithColumnPredicate(kTableName, "key", 0, 0, 555, 556);
   CheckScanWithColumnPredicate(kTableName, "key", 111, 4, lower_filler, 150);
@@ -1538,10 +1532,8 @@ TEST_F(FlexPartitioningAlterTableTest, 
ReadAndWriteToCustomRangePartition) {
   ASSERT_OK(InsertTestRows(kTableName, 111, 444));
   NO_FATALS(CheckTableRowsNum(kTableName, 444));
 
-  // WIP: Scan the data present after rebasing on pruning patches
-  /*
-   NO_FATALS(CheckTableRowsNum(kTableName, kKeyColumn, 111, 222, 111));
-   NO_FATALS(CheckTableRowsNum(kTableName, kKeyColumn, 0, 444, 444));
+  NO_FATALS(CheckTableRowsNum(kTableName, kKeyColumn, 111, 222, 111));
+  NO_FATALS(CheckTableRowsNum(kTableName, kKeyColumn, 0, 444, 444));
   // Drop a partition and re-scan
   {
     unique_ptr<KuduTableAlterer> 
table_alterer_drop(client_->NewTableAlterer(kTableName));
@@ -1553,7 +1545,6 @@ TEST_F(FlexPartitioningAlterTableTest, 
ReadAndWriteToCustomRangePartition) {
     ASSERT_OK(table_alterer_drop->Alter());
   }
   NO_FATALS(CheckTableRowsNum(kTableName, kKeyColumn, 0, 444, 333));
-  */
 
   // Meanwhile, inserting into non-covered ranges should result in a proper
   // error status return to the client attempting such an operation.
diff --git a/src/kudu/client/scanner-internal.cc 
b/src/kudu/client/scanner-internal.cc
index 18a436fba..a5ad65bb4 100644
--- a/src/kudu/client/scanner-internal.cc
+++ b/src/kudu/client/scanner-internal.cc
@@ -511,6 +511,7 @@ Status KuduScanner::Data::OpenTablet(const PartitionKey& 
partition_key,
     if (s.IsNotFound()) {
       // No more tablets in the table.
       partition_pruner_.RemovePartitionKeyRange({});
+      DCHECK(!partition_pruner_.HasMorePartitionKeyRanges());
       return Status::OK();
     }
     RETURN_NOT_OK(s);

Reply via email to