You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by nk...@apache.org on 2014/06/24 11:37:48 UTC

git commit: HBASE-11403 Fix race conditions around Object#notify

Repository: hbase
Updated Branches:
  refs/heads/master e991fd805 -> ab72babd9


HBASE-11403 Fix race conditions around Object#notify


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

Branch: refs/heads/master
Commit: ab72babd97838317fa0a380fc4d49bf2703ad17c
Parents: e991fd8
Author: Nicolas Liochon <nk...@gmail.com>
Authored: Tue Jun 24 11:37:02 2014 +0200
Committer: Nicolas Liochon <nk...@gmail.com>
Committed: Tue Jun 24 11:37:02 2014 +0200

----------------------------------------------------------------------
 .../main/java/org/apache/hadoop/hbase/client/AsyncProcess.java  | 2 ++
 .../src/main/java/org/apache/hadoop/hbase/ipc/RpcClient.java    | 1 +
 .../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java    | 3 ++-
 .../src/main/java/org/apache/hadoop/hbase/master/HMaster.java   | 4 ++--
 .../main/java/org/apache/hadoop/hbase/master/ServerManager.java | 5 +++--
 .../java/org/apache/hadoop/hbase/regionserver/LogRoller.java    | 2 +-
 .../hadoop/hbase/regionserver/handler/OpenRegionHandler.java    | 2 +-
 7 files changed, 12 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/ab72babd/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncProcess.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncProcess.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncProcess.java
index 42c1546..7b153ec 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncProcess.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncProcess.java
@@ -901,6 +901,7 @@ class AsyncProcess {
             LOG.info("#" + id + ", waiting for " + currentInProgress + "  actions to finish");
           }
           synchronized (actionsInProgress) {
+            if (actionsInProgress.get() == 0) break;
             actionsInProgress.wait(100);
           }
         }
@@ -979,6 +980,7 @@ class AsyncProcess {
       oldInProgress = currentInProgress;
       try {
         synchronized (this.tasksInProgress) {
+          if (tasksInProgress.get() != oldInProgress) break;
           this.tasksInProgress.wait(100);
         }
       } catch (InterruptedException e) {

http://git-wip-us.apache.org/repos/asf/hbase/blob/ab72babd/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClient.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClient.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClient.java
index 91ea690..4802f1d 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClient.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClient.java
@@ -1488,6 +1488,7 @@ public class RpcClient {
       }
       try {
         synchronized (call) {
+          if (call.done) break;
           call.wait(Math.min(call.remainingTime(), 1000) + 1);
         }
       } catch (InterruptedException e) {

http://git-wip-us.apache.org/repos/asf/hbase/blob/ab72babd/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
index 411cb70..a1f9a50 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
@@ -334,7 +334,8 @@ public class BucketCache implements BlockCache, HeapSize {
     if (!successfulAddition && wait) {
       synchronized (cacheWaitSignals[queueNum]) {
         try {
-          cacheWaitSignals[queueNum].wait(DEFAULT_CACHE_WAIT_TIME);
+          successfulAddition = bq.offer(re);
+          if (!successfulAddition) cacheWaitSignals[queueNum].wait(DEFAULT_CACHE_WAIT_TIME);
         } catch (InterruptedException ie) {
           Thread.currentThread().interrupt();
         }

http://git-wip-us.apache.org/repos/asf/hbase/blob/ab72babd/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
index c92c020..e7b9db8 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
@@ -543,8 +543,8 @@ public class HMaster extends HRegionServer implements MasterServices, Server {
     this.initializationBeforeMetaAssignment = true;
 
     // Wait for regionserver to finish initialization.
-    while (!isStopped() && !isOnline()) {
-      synchronized (online) {
+    synchronized (online) {
+      while (!isStopped() && !isOnline()) {
         online.wait(100);
       }
     }

http://git-wip-us.apache.org/repos/asf/hbase/blob/ab72babd/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
index 3591188..b20231b 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
@@ -511,7 +511,8 @@ public class ServerManager {
     long previousLogTime = 0;
     ServerName sn = master.getServerName();
     ZooKeeperWatcher zkw = master.getZooKeeper();
-    while (!onlineServers.isEmpty()) {
+    int onlineServersCt;
+    while ((onlineServersCt = onlineServers.size()) > 0){
 
       if (System.currentTimeMillis() > (previousLogTime + 1000)) {
         Set<ServerName> remainingServers = onlineServers.keySet();
@@ -548,7 +549,7 @@ public class ServerManager {
       }
       synchronized (onlineServers) {
         try {
-          onlineServers.wait(100);
+          if (onlineServersCt == onlineServers.size()) onlineServers.wait(100);
         } catch (InterruptedException ignored) {
           // continue
         }

http://git-wip-us.apache.org/repos/asf/hbase/blob/ab72babd/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/LogRoller.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/LogRoller.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/LogRoller.java
index c8d3b6a..6244175 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/LogRoller.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/LogRoller.java
@@ -75,7 +75,7 @@ class LogRoller extends HasThread implements WALActionsListener {
         if (!periodic) {
           synchronized (rollLog) {
             try {
-              rollLog.wait(this.threadWakeFrequency);
+              if (!rollLog.get()) rollLog.wait(this.threadWakeFrequency);
             } catch (InterruptedException e) {
               // Fall through
             }

http://git-wip-us.apache.org/repos/asf/hbase/blob/ab72babd/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
index d0005bc..2749b18 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
@@ -264,7 +264,7 @@ public class OpenRegionHandler extends EventHandler {
         try {
           // Wait for 10 seconds, so that server shutdown
           // won't take too long if this thread happens to run.
-          signaller.wait(10000);
+          if (!signaller.get()) signaller.wait(10000);
         } catch (InterruptedException e) {
           // Go to the loop check.
         }