Browse Source

Fix synchronization in LocalCheckpointTracker#contains (#38755)

We are accessing the `CountedBitSet` in `LocalCheckpointTracker#contains`
without proper synchronization.

Relates #33871
Nhat Nguyen 6 years ago
parent
commit
90e6fb0a56

+ 3 - 3
server/src/main/java/org/elasticsearch/index/seqno/LocalCheckpointTracker.java

@@ -157,11 +157,11 @@ public class LocalCheckpointTracker {
             return true;
             return true;
         }
         }
         final long bitSetKey = getBitSetKey(seqNo);
         final long bitSetKey = getBitSetKey(seqNo);
-        final CountedBitSet bitSet;
+        final int bitSetOffset = seqNoToBitSetOffset(seqNo);
         synchronized (this) {
         synchronized (this) {
-            bitSet = processedSeqNo.get(bitSetKey);
+            final CountedBitSet bitSet = processedSeqNo.get(bitSetKey);
+            return bitSet != null && bitSet.get(bitSetOffset);
         }
         }
-        return bitSet != null && bitSet.get(seqNoToBitSetOffset(seqNo));
     }
     }
 
 
     /**
     /**