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();
}
}
}),