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();
+        }
     }
 
 }


Reply via email to