You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jx...@apache.org on 2012/07/19 02:00:41 UTC

svn commit: r1363180 - /hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java

Author: jxiang
Date: Thu Jul 19 00:00:40 2012
New Revision: 1363180

URL: http://svn.apache.org/viewvc?rev=1363180&view=rev
Log:
HBASE-6420 Gracefully shutdown logsyncer

Modified:
    hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java

Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java?rev=1363180&r1=1363179&r2=1363180&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java Thu Jul 19 00:00:40 2012
@@ -41,6 +41,7 @@ import java.util.TreeSet;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.Lock;
@@ -984,7 +985,6 @@ public class HLog implements Syncable {
    */
   public void close() throws IOException {
     try {
-      logSyncerThread.interrupt();
       logSyncerThread.close();
       // Make sure we synced everything
       logSyncerThread.join(this.optionalFlushInterval*2);
@@ -1197,8 +1197,8 @@ public class HLog implements Syncable {
    class LogSyncer extends HasThread {
 
     private final long optionalFlushInterval;
-    
-    private boolean closeLogSyncer = false;
+
+    private AtomicBoolean closeLogSyncer = new AtomicBoolean(false);
 
     // List of pending writes to the HLog. There corresponds to transactions
     // that have not yet returned to the client. We keep them cached here
@@ -1217,11 +1217,13 @@ public class HLog implements Syncable {
       try {
         // awaiting with a timeout doesn't always
         // throw exceptions on interrupt
-        while(!this.isInterrupted() && !closeLogSyncer) {
+        while(!this.isInterrupted() && !closeLogSyncer.get()) {
 
           try {
             if (unflushedEntries.get() <= syncedTillHere) {
-              Thread.sleep(this.optionalFlushInterval);
+              synchronized (closeLogSyncer) {
+                closeLogSyncer.wait(this.optionalFlushInterval);
+              }
             }
             sync();
           } catch (IOException e) {
@@ -1260,9 +1262,12 @@ public class HLog implements Syncable {
         writer.append(e);
       }
     }
-    
-    void close(){
-      closeLogSyncer = true;
+
+    void close() {
+      synchronized (closeLogSyncer) {
+        closeLogSyncer.set(true);
+        closeLogSyncer.notifyAll();
+      }
     }
   }