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

jinwoo pushed a commit to branch support/1.15
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/support/1.15 by this push:
     new 37292f49dd GEODE-10453 - in case of 
REMOVE_DUE_TO_GII_TOMBSTONE_CLEANUP and CompactRangeIndex, specify not to 
lookup old key, which is very expensive operation. It's actually broken and 
regression. All the tombstone entries are going to be NullToken and cause class 
cast exception for every single remove compare if looking up old key. There is 
no old key during initial tombstone image sync up from lead peer. (#7890)
37292f49dd is described below

commit 37292f49dde93583ef647c14f156d123e346d465
Author: leonfin <[email protected]>
AuthorDate: Wed Aug 27 16:34:54 2025 -0400

    GEODE-10453 - in case of REMOVE_DUE_TO_GII_TOMBSTONE_CLEANUP and 
CompactRangeIndex, specify not to lookup old key, which is very expensive 
operation. It's actually broken and regression. All the tombstone entries are 
going to be NullToken and cause class cast exception for every single remove 
compare if looking up old key. There is no old key during initial tombstone 
image sync up from lead peer. (#7890)
    
    Co-authored-by: Leon Finker <[email protected]>
    (cherry picked from commit d834e947cc892a6677f7f82b45cd9d419c13f824)
---
 .../geode/cache/query/internal/index/CompactRangeIndex.java  |  4 ++--
 .../apache/geode/cache/query/internal/index/IndexStore.java  |  7 +++++++
 .../geode/cache/query/internal/index/MapIndexStore.java      |  5 +++++
 .../geode/cache/query/internal/index/MemoryIndexStore.java   | 12 +++++++++++-
 4 files changed, 25 insertions(+), 3 deletions(-)

diff --git 
a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/CompactRangeIndex.java
 
b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/CompactRangeIndex.java
index 5d27434488..c0497d8ff6 100644
--- 
a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/CompactRangeIndex.java
+++ 
b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/CompactRangeIndex.java
@@ -167,10 +167,10 @@ public class CompactRangeIndex extends AbstractIndex {
         if (oldKeyValue.get() == null) {
           return;
         }
-        indexStore.removeMapping(oldKeyValue.get().getOldKey(), entry);
+        indexStore.removeMappingGII(oldKeyValue.get().getOldKey(), entry);
       } else {
         // rely on reverse map in the index store to figure out the real key
-        indexStore.removeMapping(IndexManager.NULL, entry);
+        indexStore.removeMappingGII(IndexManager.NULL, entry);
       }
     } else if (opCode == CLEAN_UP_THREAD_LOCALS) {
       if (oldKeyValue != null) {
diff --git 
a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/IndexStore.java
 
b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/IndexStore.java
index 8ec99b1d6b..a91c00f372 100644
--- 
a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/IndexStore.java
+++ 
b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/IndexStore.java
@@ -38,6 +38,13 @@ public interface IndexStore {
    */
   void removeMapping(Object indexKey, RegionEntry re) throws IMQException;
 
+  /**
+   * Remove a mapping from the index store If entry at indexKey is not found, 
we must crawl the
+   * index to be sure the region entry does not exist
+   *
+   */
+  void removeMappingGII(Object indexKey, RegionEntry re) throws IMQException;
+
   /**
    * Update a mapping in the index store. This method adds a new mapping and 
removes the old mapping
    *
diff --git 
a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/MapIndexStore.java
 
b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/MapIndexStore.java
index 745bed28f5..0c7e8abac2 100644
--- 
a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/MapIndexStore.java
+++ 
b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/MapIndexStore.java
@@ -58,6 +58,11 @@ public class MapIndexStore implements IndexStore {
     addMapping(indexKey, re);
   }
 
+  @Override
+  public void removeMappingGII(Object indexKey, RegionEntry re) {
+    removeMapping(indexKey, re);
+  }
+
   @Override
   public void removeMapping(Object indexKey, RegionEntry re) {
     indexMap.remove(indexKey, re.getKey());
diff --git 
a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/MemoryIndexStore.java
 
b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/MemoryIndexStore.java
index 736de22a2d..e25464abc3 100644
--- 
a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/MemoryIndexStore.java
+++ 
b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/MemoryIndexStore.java
@@ -292,10 +292,20 @@ public class MemoryIndexStore implements IndexStore {
     updateMapping(indexKey, null, re, null);
   }
 
+  @Override
+  public void removeMappingGII(Object indexKey, RegionEntry re) throws 
IMQException {
+    doRemoveMapping(indexKey, re, false);
+  }
+
   @Override
   public void removeMapping(Object indexKey, RegionEntry re) throws 
IMQException {
+    doRemoveMapping(indexKey, re, true);
+  }
+
+  private void doRemoveMapping(Object indexKey, RegionEntry re, boolean 
findOldKey)
+      throws IMQException {
     // Remove from forward map
-    boolean found = basicRemoveMapping(indexKey, re, true);
+    boolean found = basicRemoveMapping(indexKey, re, findOldKey);
     // Remove from reverse map.
     // We do NOT need to synchronize here as different RegionEntries will be
     // operating concurrently i.e. different keys in entryToValuesMap which

Reply via email to