You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2013/12/05 14:51:20 UTC

svn commit: r1548137 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java

Author: jukka
Date: Thu Dec  5 13:51:19 2013
New Revision: 1548137

URL: http://svn.apache.org/r1548137
Log:
OAK-593: Segment-based MK

Fix another deadlock in FileStore.close vs. the flush thread:
the flushThread.join() call must not be within a synchronized block.

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java?rev=1548137&r1=1548136&r2=1548137&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java Thu Dec  5 13:51:19 2013
@@ -152,7 +152,8 @@ public class FileStore extends AbstractS
                         try {
                             flush();
                         } catch (IOException e) {
-                            log.warn("Failed to flush TarMK state", e);
+                            log.warn("Failed to flush the TarMK at" +
+                                    FileStore.this.directory, e);
                         }
                         timeToClose.await(5, SECONDS);
                     }
@@ -193,28 +194,38 @@ public class FileStore extends AbstractS
     }
 
     @Override
-    public synchronized void close() {
+    public void close() {
         try {
-            super.close();
-
+            // avoid deadlocks while joining the flush thread
             timeToClose.countDown();
-            flushThread.join();
-            flush();
+            try {
+                flushThread.join();
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                log.warn("Interrupted while joining the TarMK flush thread", e);
+            }
 
-            journalFile.close();
+            synchronized (this) {
+                super.close();
 
-            for (TarFile file : bulkFiles) {
-                file.close();
-            }
-            bulkFiles.clear();
-            for (TarFile file : dataFiles) {
-                file.close();
-            }
-            dataFiles.clear();
+                flush();
 
-            System.gc(); // for any memory-mappings that are no longer used
-        } catch (Exception e) {
-            throw new RuntimeException(e);
+                journalFile.close();
+
+                for (TarFile file : bulkFiles) {
+                    file.close();
+                }
+                bulkFiles.clear();
+                for (TarFile file : dataFiles) {
+                    file.close();
+                }
+                dataFiles.clear();
+
+                System.gc(); // for any memory-mappings that are no longer used
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(
+                    "Failed to close the TarMK at " + directory, e);
         }
     }