Michael Blow has submitted this change and it was merged. Change subject: [NO ISSUE][*DB][CLUS] Fix intermittent deadlock on nc join ......................................................................
[NO ISSUE][*DB][CLUS] Fix intermittent deadlock on nc join Eliminate synchronization in ResourceIdManager to avoid deadlocks between it and ClusterStateManager Change-Id: I691fc06da3f5641904e02ece8ae1b5fe3fc286a3 Reviewed-on: https://asterix-gerrit.ics.uci.edu/2062 Sonar-Qube: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Contrib: Jenkins <[email protected]> Reviewed-by: Murtadha Hubail <[email protected]> --- M asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/transaction/ResourceIdManager.java 1 file changed, 9 insertions(+), 27 deletions(-) Approvals: Jenkins: Verified; No violations found; Murtadha Hubail: Looks good to me, approved diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/transaction/ResourceIdManager.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/transaction/ResourceIdManager.java index afa626d..0bb862d 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/transaction/ResourceIdManager.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/transaction/ResourceIdManager.java @@ -18,8 +18,8 @@ */ package org.apache.asterix.runtime.transaction; -import java.util.HashSet; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; import org.apache.asterix.common.cluster.IClusterStateManager; @@ -30,8 +30,7 @@ private final IClusterStateManager csm; private final AtomicLong globalResourceId = new AtomicLong(); - private volatile Set<String> reportedNodes = new HashSet<>(); - private volatile boolean allReported = false; + private Set<String> reportedNodes = ConcurrentHashMap.newKeySet(); public ResourceIdManager(IClusterStateManager csm) { this.csm = csm; @@ -39,36 +38,19 @@ @Override public long createResourceId() { - if (!allReported) { - synchronized (this) { - if (!allReported) { - if (reportedNodes.size() < csm.getNumberOfNodes()) { - return -1; - } else { - reportedNodes = null; - allReported = true; - } - } - } - } - return globalResourceId.incrementAndGet(); + return csm.isClusterActive() ? globalResourceId.incrementAndGet() : -1; } @Override - public synchronized boolean reported(String nodeId) { - return allReported || reportedNodes.contains(nodeId); + public boolean reported(String nodeId) { + return reportedNodes.contains(nodeId); } @Override - public synchronized void report(String nodeId, long maxResourceId) throws HyracksDataException { - if (!allReported) { - globalResourceId.set(Math.max(maxResourceId, globalResourceId.get())); - reportedNodes.add(nodeId); - if (reportedNodes.size() == csm.getNumberOfNodes()) { - reportedNodes = null; - allReported = true; - csm.refreshState(); - } + public void report(String nodeId, long maxResourceId) throws HyracksDataException { + globalResourceId.updateAndGet(prev -> Math.max(maxResourceId, prev)); + if (reportedNodes.add(nodeId)) { + csm.refreshState(); } } -- To view, visit https://asterix-gerrit.ics.uci.edu/2062 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: I691fc06da3f5641904e02ece8ae1b5fe3fc286a3 Gerrit-PatchSet: 5 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Michael Blow <[email protected]> Gerrit-Reviewer: Jenkins <[email protected]> Gerrit-Reviewer: Michael Blow <[email protected]> Gerrit-Reviewer: Murtadha Hubail <[email protected]>
