You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mb...@apache.org on 2017/10/11 01:57:38 UTC

asterixdb git commit: [NO ISSUE][*DB][CLUS] Fix intermittent deadlock on nc join

Repository: asterixdb
Updated Branches:
  refs/heads/master f07e73ae4 -> c0aa3217f


[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 <je...@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <je...@fulliautomatix.ics.uci.edu>
Reviewed-by: Murtadha Hubail <mh...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/c0aa3217
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/c0aa3217
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/c0aa3217

Branch: refs/heads/master
Commit: c0aa3217f775881b564b0d24de994b0a844fc071
Parents: f07e73a
Author: Michael Blow <mi...@couchbase.com>
Authored: Tue Oct 10 14:55:14 2017 -0400
Committer: Michael Blow <mb...@apache.org>
Committed: Tue Oct 10 18:57:02 2017 -0700

----------------------------------------------------------------------
 .../runtime/transaction/ResourceIdManager.java  | 36 +++++---------------
 1 file changed, 9 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c0aa3217/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/transaction/ResourceIdManager.java
----------------------------------------------------------------------
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 @@ public class ResourceIdManager implements IResourceIdManager {
 
     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 @@ public class ResourceIdManager implements IResourceIdManager {
 
     @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();
         }
     }