You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by mb...@apache.org on 2012/07/17 14:50:46 UTC

svn commit: r1362473 - /hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java

Author: mbautin
Date: Tue Jul 17 12:50:46 2012
New Revision: 1362473

URL: http://svn.apache.org/viewvc?rev=1362473&view=rev
Log:
[master] fix assertion failure in hflush

Author: pkhemani

Summary: follow up to D507512

Test Plan: unit tests

Reviewers: mbautin, kranganathan

Reviewed By: mbautin

CC: hbase-eng@

Differential Revision: https://phabricator.fb.com/D520949

Modified:
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java

Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java?rev=1362473&r1=1362472&r2=1362473&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java Tue Jul 17 12:50:46 2012
@@ -1021,15 +1021,17 @@ public class HLog implements Syncable {
           // writes are waiting to acquire it in addToSyncQueue while the ones
           // we hflush are waiting on await()
           hflush();
-          assert unflushedEntries.get() == syncTillHere :
-              "hflush should not have returned without flushing everything!";
           lastHFlushAt = EnvironmentEdgeManager.currentTimeMillis();
 
           // Release all the clients waiting on the hflush. Notice that we still
           // own the lock until we get back to await at which point all the
           // other threads waiting will first acquire and release locks
           syncDone.signalAll();
-        } while (!syncerShuttingDown);
+        } while (!syncerShuttingDown ||
+            (unflushedEntries.get() != syncTillHere));
+        // The check above involves synchronization between syncerShuttingDown
+        // and unflushedEntries in append(). The check for syncerShutDown has to
+        // come before.
       } catch (InterruptedException e) {
         LOG.debug(getName() + " interrupted while waiting for sync requests");
         if (unflushedEntries.get() != syncTillHere) {
@@ -1126,6 +1128,10 @@ public class HLog implements Syncable {
             // case this.writer will be NULL
             this.writer.sync();
           }
+          // A better name for syncTillHere variable would have been
+          // syncedAtLeastTillHere. Between the time unflushedEntries is
+          // snapshotted and writer.sync() is called, append can append more
+          // entries to the log.
           this.syncTillHere = doneUpto;
           syncTime.inc(System.currentTimeMillis() - now);