You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by tk...@apache.org on 2024/09/28 18:39:44 UTC

(phoenix) branch master updated: PHOENIX-7239: Fix issues when data and index have different salt buckets (#1988)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 75b18ffabb PHOENIX-7239: Fix issues when data and index have different salt buckets (#1988)
75b18ffabb is described below

commit 75b18ffabbf49094e8fcceb1a26305cb01439d44
Author: Hari Krishna Dara <ha...@gmail.com>
AuthorDate: Sun Sep 29 00:09:39 2024 +0530

    PHOENIX-7239: Fix issues when data and index have different salt buckets (#1988)
    
    @PHOENIX-7239: Fix issues when data and index have different salt buckets
---
 .../java/org/apache/phoenix/index/IndexMaintainer.java | 18 +++++++++++-------
 .../main/java/org/apache/phoenix/schema/PTable.java    |  1 +
 .../java/org/apache/phoenix/schema/PTableImpl.java     |  1 -
 .../src/main/protobuf/ServerCachingService.proto       |  1 +
 4 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/phoenix-core-client/src/main/java/org/apache/phoenix/index/IndexMaintainer.java b/phoenix-core-client/src/main/java/org/apache/phoenix/index/IndexMaintainer.java
index c4641263ab..97a0ca785c 100644
--- a/phoenix-core-client/src/main/java/org/apache/phoenix/index/IndexMaintainer.java
+++ b/phoenix-core-client/src/main/java/org/apache/phoenix/index/IndexMaintainer.java
@@ -404,6 +404,7 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> {
     private RowKeyMetaData rowKeyMetaData;
     private byte[] indexTableName;
     private int nIndexSaltBuckets;
+    private int nDataTableSaltBuckets;
     private byte[] dataEmptyKeyValueCF;
     private ImmutableBytesPtr emptyKeyValueCFPtr;
     private int nDataCFs;
@@ -477,6 +478,7 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> {
         this.immutableStorageScheme = index.getImmutableStorageScheme() == null ? ImmutableStorageScheme.ONE_CELL_PER_COLUMN : index.getImmutableStorageScheme();
         this.dataEncodingScheme = dataTable.getEncodingScheme() == null ? QualifierEncodingScheme.NON_ENCODED_QUALIFIERS : dataTable.getEncodingScheme();
         this.dataImmutableStorageScheme = dataTable.getImmutableStorageScheme() == null ? ImmutableStorageScheme.ONE_CELL_PER_COLUMN : dataTable.getImmutableStorageScheme();
+        this.nDataTableSaltBuckets = isDataTableSalted ? dataTable.getBucketNum() : PTable.NO_SALTING;
 
         byte[] indexTableName = index.getPhysicalName().getBytes();
         // Use this for the nDataSaltBuckets as we need this for local indexes
@@ -545,7 +547,7 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> {
         this.indexedColumnTypes = Lists.<PDataType>newArrayListWithExpectedSize(nIndexPKColumns-nDataPKColumns);
         this.indexedExpressions = Lists.newArrayListWithExpectedSize(nIndexPKColumns-nDataPKColumns);
         this.coveredColumnsMap = Maps.newHashMapWithExpectedSize(nIndexColumns - nIndexPKColumns);
-        this.nIndexSaltBuckets  = nIndexSaltBuckets == null ? 0 : nIndexSaltBuckets;
+        this.nIndexSaltBuckets  = nIndexSaltBuckets == null ? PTable.NO_SALTING : nIndexSaltBuckets;
         this.dataEmptyKeyValueCF = SchemaUtil.getEmptyColumnFamily(dataTable);
         this.emptyKeyValueCFPtr = SchemaUtil.getEmptyColumnFamilyPtr(index);
         this.nDataCFs = dataTable.getColumnFamilies().size();
@@ -977,14 +979,11 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> {
                 trailingVariableWidthColumnNum--;
                 indexColumnIdx--;
             }
-            // TODO: need to capture nDataSaltBuckets instead of just a boolean. For now,
-            // we store this in nIndexSaltBuckets, as we only use this function for local indexes
-            // in which case nIndexSaltBuckets would never be used. Note that when we do add this
-            // to be serialized, we have to add it at the end and allow for the value not being
-            // there to maintain compatibility between an old client and a new server.
             if (isDataTableSalted) {
                 // Set salt byte
-                byte saltByte = SaltingUtil.getSaltingByte(dataRowKey, SaltingUtil.NUM_SALTING_BYTES, length-SaltingUtil.NUM_SALTING_BYTES, nIndexSaltBuckets);
+                byte saltByte = SaltingUtil.getSaltingByte(dataRowKey,
+                        SaltingUtil.NUM_SALTING_BYTES, length-SaltingUtil.NUM_SALTING_BYTES,
+                        nDataTableSaltBuckets);
                 dataRowKey[0] = saltByte;
             }
             return dataRowKey.length == length ? dataRowKey : Arrays.copyOf(dataRowKey, length);
@@ -1848,6 +1847,8 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> {
         } else {
             maintainer.isCDCIndex = false;
         }
+        maintainer.nDataTableSaltBuckets = proto.hasDataTableSaltBuckets() ?
+                proto.getDataTableSaltBuckets() : -1;
         maintainer.initCachedState();
         return maintainer;
     }
@@ -1992,6 +1993,9 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> {
             }
         }
         builder.setIsCDCIndex(maintainer.isCDCIndex);
+        if (maintainer.isDataTableSalted) {
+            builder.setDataTableSaltBuckets(maintainer.nDataTableSaltBuckets);
+        }
         return builder.build();
     }
 
diff --git a/phoenix-core-client/src/main/java/org/apache/phoenix/schema/PTable.java b/phoenix-core-client/src/main/java/org/apache/phoenix/schema/PTable.java
index 9c487f5bd0..4ace717a06 100644
--- a/phoenix-core-client/src/main/java/org/apache/phoenix/schema/PTable.java
+++ b/phoenix-core-client/src/main/java/org/apache/phoenix/schema/PTable.java
@@ -63,6 +63,7 @@ public interface PTable extends PMetaDataEntity {
     public static final String IS_IMMUTABLE_ROWS_PROP_NAME = "IMMUTABLE_ROWS";
     public static final boolean DEFAULT_DISABLE_WAL = false;
     public static final boolean DEFAULT_IMMUTABLE_ROWS = false;
+    static final Integer NO_SALTING = -1;
 
     public enum ViewType {
         MAPPED((byte)1),
diff --git a/phoenix-core-client/src/main/java/org/apache/phoenix/schema/PTableImpl.java b/phoenix-core-client/src/main/java/org/apache/phoenix/schema/PTableImpl.java
index d1b5ee4ceb..8caa0f72e6 100644
--- a/phoenix-core-client/src/main/java/org/apache/phoenix/schema/PTableImpl.java
+++ b/phoenix-core-client/src/main/java/org/apache/phoenix/schema/PTableImpl.java
@@ -206,7 +206,6 @@ import org.apache.phoenix.util.TrustedByteArrayOutputStream;
  * @since 0.1
  */
 public class PTableImpl implements PTable {
-    private static final Integer NO_SALTING = -1;
     private static final int VIEW_MODIFIED_UPDATE_CACHE_FREQUENCY_BIT_SET_POS = 0;
     private static final int VIEW_MODIFIED_USE_STATS_FOR_PARALLELIZATION_BIT_SET_POS = 1;
     private IndexMaintainer indexMaintainer;
diff --git a/phoenix-core-client/src/main/protobuf/ServerCachingService.proto b/phoenix-core-client/src/main/protobuf/ServerCachingService.proto
index c28695ff7d..d8e1945527 100644
--- a/phoenix-core-client/src/main/protobuf/ServerCachingService.proto
+++ b/phoenix-core-client/src/main/protobuf/ServerCachingService.proto
@@ -72,6 +72,7 @@ message IndexMaintainer {
   optional bytes indexWhere = 29;
   repeated ColumnReference indexWhereColumns = 30;
   optional bool isCDCIndex = 31;
+  optional int32 dataTableSaltBuckets = 32;
 }
 
 message TransformMaintainer {