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