You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by da...@apache.org on 2020/09/01 07:30:22 UTC

[lucene-solr] 04/08: remove busy wait

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

datcm pushed a commit to branch datcm/bloomberg-abdicate-leadership
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit 7081da397024f9e826658429606094c08e611f78
Author: Cao Manh Dat <da...@apache.org>
AuthorDate: Fri Aug 28 10:18:12 2020 +0700

    remove busy wait
---
 .../java/org/apache/solr/cloud/ZkController.java   |  1 -
 .../java/org/apache/solr/core/CoreDescriptor.java  | 39 ++++++++++------------
 .../solr/handler/admin/CoreAdminOperation.java     |  7 ++--
 3 files changed, 20 insertions(+), 27 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
index 2be2f11..8bd9f69 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -92,7 +92,6 @@ import org.apache.solr.common.cloud.ZooKeeperException;
 import org.apache.solr.common.params.CollectionParams;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.CoreAdminParams;
-import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.ExecutorUtil;
 import org.apache.solr.common.util.IOUtils;
diff --git a/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java b/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java
index a51d979..e5273a4 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java
@@ -28,7 +28,7 @@ import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.Phaser;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -145,7 +145,7 @@ public class CoreDescriptor {
   /** If true then all update requests will be refused */
   protected volatile boolean pausedAcceptingIndexing = false;
 
-  protected final AtomicInteger inflightUpdatesCounter = new AtomicInteger();
+  protected final Phaser inflightUpdatesCounter = new Phaser();
 
   /** TESTS ONLY */
   public CoreDescriptor(String name, Path instanceDir, CoreContainer coreContainer, String... coreProps) {
@@ -340,35 +340,30 @@ public class CoreDescriptor {
     return Boolean.parseBoolean(tmp);
   }
 
-  public void setPausedAcceptingIndexing(boolean pausedAcceptingIndexing) {
-    this.pausedAcceptingIndexing = pausedAcceptingIndexing;
+  public void pauseUpdatesAndWaitForInflightFinish() {
+    synchronized (inflightUpdatesCounter) {
+      pausedAcceptingIndexing = true;
+      inflightUpdatesCounter.register();
+      inflightUpdatesCounter.arriveAndAwaitAdvance();
+    }
   }
 
-  public boolean isPausedAcceptingIndexing() {
-    return pausedAcceptingIndexing;
+  public void unpauseUpdates() {
+    this.pausedAcceptingIndexing = false;
   }
 
   public boolean incInflightUpdateCounter() {
-    if (isPausedAcceptingIndexing()) {
-      return false;
+    synchronized (inflightUpdatesCounter) {
+      if (pausedAcceptingIndexing) {
+        return false;
+      }
+      inflightUpdatesCounter.register();
+      return true;
     }
-    inflightUpdatesCounter.incrementAndGet();
-    return true;
   }
 
   public void decInFlightUpdateCounter() {
-    inflightUpdatesCounter.decrementAndGet();
-  }
-
-  public void waitForNoInflightUpdates() {
-    while (inflightUpdatesCounter.get() != 0) {
-      try {
-        Thread.sleep(500);
-      } catch (InterruptedException e) {
-        Thread.currentThread().interrupt();
-        return;
-      }
-    }
+    inflightUpdatesCounter.arriveAndDeregister();
   }
 
   public boolean isTransient() {
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminOperation.java b/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminOperation.java
index 6c0021b..08c1172 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminOperation.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminOperation.java
@@ -266,11 +266,10 @@ enum CoreAdminOperation implements CoreAdminOp {
           log().info("Skipping abdicate leadership of core:{} since it is the only one active replica", cd.getName());
         }
 
-        cd.setPausedAcceptingIndexing(true);
-        cd.waitForNoInflightUpdates();
+        cd.pauseUpdatesAndWaitForInflightFinish();
         cc.getZkController().rejoinShardLeaderElection(cd, false);
       } finally {
-        cd.setPausedAcceptingIndexing(false);
+        cd.unpauseUpdates();
         // after this point this core can still receive more updates since it did not explicitly
         // unset its leader role from cluster state, but that fine since it already unset its leader role locally
         // (by setting cloudDescriptor.isLeader() flag) so it gonna keep refusing updates or routing update requests
@@ -283,7 +282,7 @@ enum CoreAdminOperation implements CoreAdminOp {
     CoreContainer cc = it.handler.coreContainer;
     for (CoreDescriptor cd : cc.getCoreDescriptors()) {
       if (cd != null) {
-        cd.setPausedAcceptingIndexing(false);
+        cd.unpauseUpdates();
       }
     }
   }),