You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by jo...@apache.org on 2021/04/08 20:47:00 UTC

[impala] 01/03: IMPALA-10637: Fixes bug in ValidWriteIdList comparison

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

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

commit 5d307cbb7b2ec3432bebd7759b0bcebf54a6cc22
Author: Sourabh Goyal <so...@cloudera.com>
AuthorDate: Tue Apr 6 12:31:14 2021 -0700

    IMPALA-10637: Fixes bug in ValidWriteIdList comparison
    
    For a transactional table, catalogd compares previous and current ValidWriteList
    to determine more recent version out of the two and reloads table cache accordingly.
    Because of a bug in ValidWriteIdList comparison, catalogD was not refreshing table
    metadata in the cache with more recent changes. As a result of which we were seeing
    inconsistencies in read after write into the table.
    
    Tested by
      1. Adding a unit test to compare WriteIDLists.
    
    Change-Id: Idaa4bcdbda1757a6451122efc505d1d483c879cc
    Reviewed-on: http://gerrit.cloudera.org:8080/17276
    Reviewed-by: Sourabh Goyal <so...@cloudera.com>
    Reviewed-by: Vihang Karajgaonkar <vi...@cloudera.com>
    Tested-by: Impala Public Jenkins <im...@cloudera.com>
---
 fe/src/main/java/org/apache/impala/util/AcidUtils.java    |  2 +-
 .../test/java/org/apache/impala/util/AcidUtilsTest.java   | 15 +++++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/fe/src/main/java/org/apache/impala/util/AcidUtils.java b/fe/src/main/java/org/apache/impala/util/AcidUtils.java
index b9fef23..cff46ad 100644
--- a/fe/src/main/java/org/apache/impala/util/AcidUtils.java
+++ b/fe/src/main/java/org/apache/impala/util/AcidUtils.java
@@ -749,7 +749,7 @@ public class AcidUtils {
       }
     } else {
       if (b.getHighWatermark() != a.getInvalidWriteIds()[minLen] - 1) {
-        return Long.signum(b.getHighWatermark() - (a.getInvalidWriteIds()[minLen] - 1));
+        return Long.signum((a.getInvalidWriteIds()[minLen] - 1) - b.getHighWatermark());
       }
       if (allInvalidFrom(a.getInvalidWriteIds(), minLen, a.getHighWatermark())) {
         return 0;
diff --git a/fe/src/test/java/org/apache/impala/util/AcidUtilsTest.java b/fe/src/test/java/org/apache/impala/util/AcidUtilsTest.java
index 5330276..6a17b82 100644
--- a/fe/src/test/java/org/apache/impala/util/AcidUtilsTest.java
+++ b/fe/src/test/java/org/apache/impala/util/AcidUtilsTest.java
@@ -31,6 +31,7 @@ import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hive.common.ValidReadTxnList;
 import org.apache.hadoop.hive.common.ValidWriteIdList;
+import org.apache.hadoop.hive.common.ValidReaderWriteIdList;
 import org.apache.hadoop.hive.metastore.api.MetaException;
 import org.apache.impala.catalog.CatalogException;
 import org.apache.impala.compat.MetastoreShim;
@@ -595,4 +596,18 @@ public class AcidUtilsTest {
             "delta_0000012_0000012_0000/0000_0",
             "delta_0000012_0000012_0000/0000_1"});
   }
+
+  @Test
+  public void testWriteIdListCompare() {
+    ValidWriteIdList a =
+            new ValidReaderWriteIdList("default.test:1:1:1:");
+    ValidWriteIdList b =
+            new ValidReaderWriteIdList("default.test:1:9223372036854775807::");
+
+    // should return -1 since b is more recent
+    assert(AcidUtils.compare(a, b) == -1);
+
+    //Should return 1 since b is more recent
+    assert(AcidUtils.compare(b,a) == 1);
+  }
 }