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 2022/05/02 17:44:25 UTC

[kudu] branch master updated: [client] fix toggling fault-tolerance for a scanner

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


The following commit(s) were added to refs/heads/master by this push:
     new 54d0f0b22 [client] fix toggling fault-tolerance for a scanner
54d0f0b22 is described below

commit 54d0f0b227b82a5ae5bb6095877858e6cbb7c9c8
Author: Alexey Serbin <al...@apache.org>
AuthorDate: Fri Apr 29 17:29:24 2022 -0700

    [client] fix toggling fault-tolerance for a scanner
    
    Change-Id: Ic50f9d62623d8b9ced7d854ce0e80a0faaa60ad3
    Reviewed-on: http://gerrit.cloudera.org:8080/18462
    Reviewed-by: Andrew Wong <aw...@cloudera.com>
    Tested-by: Alexey Serbin <al...@apache.org>
---
 .../kudu/client/AbstractKuduScannerBuilder.java    |  2 +-
 .../java/org/apache/kudu/client/TestScanToken.java | 22 ++++++++++++++++
 src/kudu/client/scan_configuration.cc              |  6 +++--
 src/kudu/client/scan_token-test.cc                 | 30 ++++++++++++++++++++++
 4 files changed, 57 insertions(+), 3 deletions(-)

diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/AbstractKuduScannerBuilder.java b/java/kudu-client/src/main/java/org/apache/kudu/client/AbstractKuduScannerBuilder.java
index 0e6b2d7cc..2c9b4aa36 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/AbstractKuduScannerBuilder.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/AbstractKuduScannerBuilder.java
@@ -96,7 +96,7 @@ public abstract class AbstractKuduScannerBuilder
   public S setFaultTolerant(boolean isFaultTolerant) {
     this.isFaultTolerant = isFaultTolerant;
     if (isFaultTolerant) {
-      readMode = AsyncKuduScanner.ReadMode.READ_AT_SNAPSHOT;
+      this.readMode = AsyncKuduScanner.ReadMode.READ_AT_SNAPSHOT;
     }
     return (S) this;
   }
diff --git a/java/kudu-client/src/test/java/org/apache/kudu/client/TestScanToken.java b/java/kudu-client/src/test/java/org/apache/kudu/client/TestScanToken.java
index 3ec8f173b..4ed897085 100644
--- a/java/kudu-client/src/test/java/org/apache/kudu/client/TestScanToken.java
+++ b/java/kudu-client/src/test/java/org/apache/kudu/client/TestScanToken.java
@@ -27,6 +27,7 @@ import static org.apache.kudu.test.ClientTestUtil.loadDefaultTable;
 import static org.apache.kudu.test.MetricTestUtils.totalRequestCount;
 import static org.apache.kudu.test.MetricTestUtils.validateRequestCount;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -865,4 +866,25 @@ public class TestScanToken {
     KuduScanner scanner = tokens.get(0).intoScanner(newClient);
     assertEquals(1, countRowsInScan(scanner));
   }
+
+  @Test
+  public void testScannerBuilderFaultToleranceToggle() throws IOException {
+    KuduTable table = createDefaultTable(client, testTableName);
+    KuduScanner.KuduScannerBuilder scannerBuilder =
+        new KuduScanner.KuduScannerBuilder(asyncClient, table);
+    assertFalse(scannerBuilder.isFaultTolerant);
+    assertEquals(AsyncKuduScanner.ReadMode.READ_LATEST, scannerBuilder.readMode);
+
+    scannerBuilder.setFaultTolerant(true);
+    assertTrue(scannerBuilder.isFaultTolerant);
+    assertEquals(AsyncKuduScanner.ReadMode.READ_AT_SNAPSHOT, scannerBuilder.readMode);
+
+    scannerBuilder.setFaultTolerant(false);
+    assertFalse(scannerBuilder.isFaultTolerant);
+    assertEquals(AsyncKuduScanner.ReadMode.READ_AT_SNAPSHOT, scannerBuilder.readMode);
+
+    scannerBuilder.readMode(AsyncKuduScanner.ReadMode.READ_YOUR_WRITES);
+    assertFalse(scannerBuilder.isFaultTolerant);
+    assertEquals(AsyncKuduScanner.ReadMode.READ_YOUR_WRITES, scannerBuilder.readMode);
+  }
 }
diff --git a/src/kudu/client/scan_configuration.cc b/src/kudu/client/scan_configuration.cc
index 32bc78470..707efc297 100644
--- a/src/kudu/client/scan_configuration.cc
+++ b/src/kudu/client/scan_configuration.cc
@@ -167,8 +167,10 @@ Status ScanConfiguration::SetReadMode(KuduScanner::ReadMode read_mode) {
 }
 
 Status ScanConfiguration::SetFaultTolerant(bool fault_tolerant) {
-  RETURN_NOT_OK(SetReadMode(KuduScanner::READ_AT_SNAPSHOT));
-  is_fault_tolerant_ = true;
+  if (fault_tolerant) {
+    RETURN_NOT_OK(SetReadMode(KuduScanner::READ_AT_SNAPSHOT));
+  }
+  is_fault_tolerant_ = fault_tolerant;
   return Status::OK();
 }
 
diff --git a/src/kudu/client/scan_token-test.cc b/src/kudu/client/scan_token-test.cc
index ac75b4503..77c00b99b 100644
--- a/src/kudu/client/scan_token-test.cc
+++ b/src/kudu/client/scan_token-test.cc
@@ -1060,5 +1060,35 @@ TEST_P(StaleScanTokensParamTest, DroppingFirstRange) {
 INSTANTIATE_TEST_SUITE_P(FirstRangeDropped, StaleScanTokensParamTest,
                          testing::Range(FirstRangeChangeMode::BEGIN,
                                         FirstRangeChangeMode::END));
+
+TEST_F(ScanTokenTest, ToggleFaultToleranceForScanConfiguration) {
+  constexpr const char* const kTableName = "fault_tolerance_toggle";
+  KuduSchema schema;
+  {
+    KuduSchemaBuilder builder;
+    builder.AddColumn("key")->NotNull()->Type(KuduColumnSchema::INT64)->PrimaryKey();
+    ASSERT_OK(builder.Build(&schema));
+  }
+
+  shared_ptr<KuduTable> table;
+  ASSERT_OK(CreateAndOpenTable(kTableName, schema, &table));
+  ScanConfiguration sc(table.get());
+  ASSERT_FALSE(sc.is_fault_tolerant());
+  ASSERT_EQ(KuduScanner::READ_LATEST, sc.read_mode());
+
+  ASSERT_OK(sc.SetFaultTolerant(true));
+  ASSERT_TRUE(sc.is_fault_tolerant());
+  ASSERT_EQ(KuduScanner::READ_AT_SNAPSHOT, sc.read_mode());
+
+  ASSERT_OK(sc.SetFaultTolerant(false));
+  ASSERT_FALSE(sc.is_fault_tolerant());
+  ASSERT_EQ(KuduScanner::READ_AT_SNAPSHOT, sc.read_mode());
+
+  ASSERT_OK(sc.SetReadMode(KuduScanner::READ_YOUR_WRITES));
+  ASSERT_OK(sc.SetFaultTolerant(false));
+  ASSERT_FALSE(sc.is_fault_tolerant());
+  ASSERT_EQ(KuduScanner::READ_YOUR_WRITES, sc.read_mode());
+}
+
 } // namespace client
 } // namespace kudu