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 2014/04/14 05:15:41 UTC

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

Author: jukka
Date: Mon Apr 14 03:15:40 2014
New Revision: 1587130

URL: http://svn.apache.org/r1587130
Log:
OAK-1696: Repository fails to restart on Windows

Use file locking to prevent anyone else from opening an already open TarMK

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=1587130&r1=1587129&r2=1587130&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 Mon Apr 14 03:15:40 2014
@@ -33,6 +33,7 @@ import java.io.File;
 import java.io.IOException;
 import java.io.RandomAccessFile;
 import java.nio.ByteBuffer;
+import java.nio.channels.FileLock;
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -96,6 +97,8 @@ public class FileStore implements Segmen
 
     private final RandomAccessFile journalFile;
 
+    private final FileLock journalLock;
+
     /**
      * The latest head state.
      */
@@ -164,6 +167,10 @@ public class FileStore implements Segmen
         this.maxFileSize = maxFileSizeMB * MB;
         this.memoryMapping = memoryMapping;
 
+        journalFile = new RandomAccessFile(
+                new File(directory, JOURNAL_FILE_NAME), "rw");
+        journalLock = journalFile.getChannel().lock();
+
         Map<Integer, Map<Character, File>> map = collectFiles(directory);
         this.readers = newArrayListWithCapacity(map.size());
         Integer[] indices = map.keySet().toArray(new Integer[map.size()]);
@@ -182,9 +189,6 @@ public class FileStore implements Segmen
                 String.format(FILE_NAME_FORMAT, writeNumber, "a"));
         this.writer = new TarWriter(writeFile);
 
-        journalFile = new RandomAccessFile(
-                new File(directory, JOURNAL_FILE_NAME), "rw");
-
         LinkedList<RecordId> heads = newLinkedList();
         String line = journalFile.readLine();
         while (line != null) {
@@ -245,6 +249,12 @@ public class FileStore implements Segmen
         flushThread.setDaemon(true);
         flushThread.setPriority(Thread.MIN_PRIORITY);
         flushThread.start();
+
+        if (memoryMapping) {
+            log.info("TarMK opened with memory-mapping: {}", directory);
+        } else {
+            log.info("TarMK opened: {}", directory);
+        }
     }
 
     static Map<Integer, Map<Character, File>> collectFiles(File directory)
@@ -357,7 +367,9 @@ public class FileStore implements Segmen
                                 if (cleaned != null) {
                                     list.add(cleaned);
                                 }
-                                toBeRemoved.addLast(reader.close());
+                                File file = reader.close();
+                                log.info("TarMK GC: Cleaned up file {}", file);
+                                toBeRemoved.addLast(file);
                             }
                         }
                         readers = list;
@@ -426,7 +438,6 @@ public class FileStore implements Segmen
                 flush();
 
                 writer.close();
-                journalFile.close();
 
                 List<TarReader> list = readers;
                 readers = newArrayList();
@@ -434,12 +445,17 @@ public class FileStore implements Segmen
                     reader.close();
                 }
 
+                journalLock.release();
+                journalFile.close();
+
                 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);
         }
+
+        log.info("TarMK closed: {}", directory);
     }
 
     @Override