Repository: bookkeeper
Updated Branches:
  refs/heads/master f2928dca4 -> 68c5b5a40


BOOKKEEPER-840: Deadlock on flushLock on compaction (sijie)


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

Branch: refs/heads/master
Commit: 68c5b5a40c33b813482e8a2371eedcb2e0d224e8
Parents: f2928dc
Author: Sijie Guo <si...@apache.org>
Authored: Tue Mar 17 22:23:37 2015 -0700
Committer: Sijie Guo <si...@apache.org>
Committed: Tue Mar 17 22:23:37 2015 -0700

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 ++
 .../bookie/GarbageCollectorThread.java          | 23 ++++++++++----------
 2 files changed, 14 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bookkeeper/blob/68c5b5a4/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 0337185..e24aa40 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -32,6 +32,8 @@ Trunk (unreleased changes)
 
       BOOKKEEPER-839: AuditorPeriodicCheckTest timeout (rakeshr via sijie)
 
+      BOOKKEEPER-840: Deadlock on flushLock on compaction (sijie)
+
     IMPROVEMENTS:
 
       BOOKKEEPER-800: Expose whether a ledger is closed or not (ivank)

http://git-wip-us.apache.org/repos/asf/bookkeeper/blob/68c5b5a4/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java
----------------------------------------------------------------------
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java
index a1f044f..299fb3e 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java
@@ -168,7 +168,7 @@ public class GarbageCollectorThread extends BookieThread {
             };
         }
 
-        Object flushLock = new Object();
+        final Object flushLock = new Object();
 
         @Override
         public void onRotateEntryLog() {
@@ -183,18 +183,19 @@ public class GarbageCollectorThread extends BookieThread {
                     LOG.debug("Skipping entry log flushing, as there is no 
offset!");
                     return;
                 }
-                synchronized (flushLock) {
-                    Offset lastOffset = offsets.get(offsets.size()-1);
-                    long lastOffsetLogId = 
EntryLogger.logIdForOffset(lastOffset.offset);
-                    while (lastOffsetLogId < 
entryLogger.getLeastUnflushedLogId() && running) {
-                        flushLock.wait(1000);
 
-                        lastOffset = offsets.get(offsets.size()-1);
-                        lastOffsetLogId = 
EntryLogger.logIdForOffset(lastOffset.offset);
-                    }
-                    if (lastOffsetLogId >= 
entryLogger.getLeastUnflushedLogId() && !running) {
-                        throw new IOException("Shutdown before flushed");
+                Offset lastOffset = offsets.get(offsets.size()-1);
+                long lastOffsetLogId = 
EntryLogger.logIdForOffset(lastOffset.offset);
+                while (lastOffsetLogId < entryLogger.getLeastUnflushedLogId() 
&& running) {
+                    synchronized (flushLock) {
+                        flushLock.wait(1000);
                     }
+
+                    lastOffset = offsets.get(offsets.size()-1);
+                    lastOffsetLogId = 
EntryLogger.logIdForOffset(lastOffset.offset);
+                }
+                if (lastOffsetLogId >= entryLogger.getLeastUnflushedLogId() && 
!running) {
+                    throw new IOException("Shutdown before flushed");
                 }
             } catch (InterruptedException ie) {
                 Thread.currentThread().interrupt();

Reply via email to