Author: alexparvulescu Date: Tue Sep 6 12:40:28 2016 New Revision: 1759425
URL: http://svn.apache.org/viewvc?rev=1759425&view=rev Log: OAK-4763 Clarify OverlappingFileLockException on FileStore initialization Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreTest.java Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java?rev=1759425&r1=1759424&r2=1759425&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java (original) +++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java Tue Sep 6 12:40:28 2016 @@ -48,6 +48,7 @@ import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileLock; +import java.nio.channels.OverlappingFileLockException; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Arrays; @@ -248,6 +249,19 @@ public class FileStore implements Segmen // FIXME OAK-4450: Properly split the FileStore into read-only and r/w variants FileStore(FileStoreBuilder builder, final boolean readOnly) throws InvalidFileStoreVersionException, IOException { + this.directory = builder.getDirectory(); + if (!readOnly) { + lockFile = new RandomAccessFile(new File(directory, LOCK_FILE_NAME), "rw"); + try { + lock = lockFile.getChannel().lock(); + } catch (OverlappingFileLockException ex) { + throw new IllegalStateException(directory.getAbsolutePath() + + " is in use by another store.", ex); + } + } else { + lockFile = null; + lock = null; + } this.tracker = new SegmentTracker(); this.revisions = builder.getRevisions(); this.blobStore = builder.getBlobStore(); @@ -283,7 +297,6 @@ public class FileStore implements Segmen .withWriterPool() .with(builder.getCacheManager()) .build(this); - this.directory = builder.getDirectory(); this.maxFileSize = builder.getMaxFileSize() * MB; this.memoryMapping = builder.getMemoryMapping(); this.gcListener = builder.getGcListener(); @@ -327,14 +340,6 @@ public class FileStore implements Segmen this.tarWriter = new TarWriter(writeFile, stats); } - if (!readOnly) { - lockFile = new RandomAccessFile(new File(directory, LOCK_FILE_NAME), "rw"); - lock = lockFile.getChannel().lock(); - } else { - lockFile = null; - lock = null; - } - // FIXME OAK-4621: External invocation of background operations // The following background operations are historically part of // the implementation of the FileStore, but they should better be Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreTest.java?rev=1759425&r1=1759424&r2=1759425&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreTest.java (original) +++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreTest.java Tue Sep 6 12:40:28 2016 @@ -24,6 +24,7 @@ import static org.apache.jackrabbit.oak. import java.io.File; import org.apache.jackrabbit.oak.segment.SegmentId; +import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -48,6 +49,19 @@ public class FileStoreTest { } finally { fileStore.close(); } + } + + @Test + public void overlapping() throws Exception { + FileStore fileStore = fileStoreBuilder(getFileStoreFolder()).build(); + try { + fileStoreBuilder(getFileStoreFolder()).build(); + Assert.fail("should not be able to open 2 stores on the same path"); + } catch (Exception ex) { + // expected + } finally { + fileStore.close(); + } } }
