Просмотр исходного кода

Replace CAS loop by updateAndGet to improve readability

Relates #28737
Nhat Nguyen 7 лет назад
Родитель
Сommit
0c2871c4d2

+ 3 - 10
server/src/main/java/org/elasticsearch/index/engine/InternalEngine.java

@@ -1020,21 +1020,14 @@ public class InternalEngine extends Engine {
      */
     private boolean mayHaveBeenIndexedBefore(Index index) {
         assert canOptimizeAddDocument(index);
-        boolean mayHaveBeenIndexBefore;
-        long deOptimizeTimestamp = maxUnsafeAutoIdTimestamp.get();
+        final boolean mayHaveBeenIndexBefore;
         if (index.isRetry()) {
             mayHaveBeenIndexBefore = true;
-            do {
-                deOptimizeTimestamp = maxUnsafeAutoIdTimestamp.get();
-                if (deOptimizeTimestamp >= index.getAutoGeneratedIdTimestamp()) {
-                    break;
-                }
-            } while (maxUnsafeAutoIdTimestamp.compareAndSet(deOptimizeTimestamp,
-                index.getAutoGeneratedIdTimestamp()) == false);
+            maxUnsafeAutoIdTimestamp.updateAndGet(curr -> Math.max(index.getAutoGeneratedIdTimestamp(), curr));
             assert maxUnsafeAutoIdTimestamp.get() >= index.getAutoGeneratedIdTimestamp();
         } else {
             // in this case we force
-            mayHaveBeenIndexBefore = deOptimizeTimestamp >= index.getAutoGeneratedIdTimestamp();
+            mayHaveBeenIndexBefore = maxUnsafeAutoIdTimestamp.get() >= index.getAutoGeneratedIdTimestamp();
         }
         return mayHaveBeenIndexBefore;
     }