From 66d4eb336f91bd53280f3245c1cc6262c67d82cc Mon Sep 17 00:00:00 2001
From: Michael McCandless
Native locks file names have the substring "-n-", which - * you can use to differentiate them from lock files created - * by {@link SimpleFSLockFactory}.
- * * @see LockFactory */ @@ -90,6 +86,17 @@ public class NativeFSLockFactory extends LockFactory { l.release(); } + /** + * Create a NativeFSLockFactory instance, with null (unset) + * lock directory. This is package-private and is only + * used by FSDirectory when creating this LockFactory via + * the System property + * org.apache.lucene.store.FSDirectoryLockFactoryClass. + */ + NativeFSLockFactory() throws IOException { + this((File) null); + } + /** * Create a NativeFSLockFactory instance, storing lock * files into the specified lockDirName: @@ -107,20 +114,30 @@ public class NativeFSLockFactory extends LockFactory { * @param lockDir where lock files are created. */ public NativeFSLockFactory(File lockDir) throws IOException { + setLockDir(lockDir); + } + /** + * Set the lock directory. This is package-private and is + * only used externally by FSDirectory when creating this + * LockFactory via the System property + * org.apache.lucene.store.FSDirectoryLockFactoryClass. + */ + void setLockDir(File lockDir) throws IOException { this.lockDir = lockDir; - - // Ensure that lockDir exists and is a directory. - if (!lockDir.exists()) { - if (!lockDir.mkdirs()) - throw new IOException("Cannot create directory: " + + if (lockDir != null) { + // Ensure that lockDir exists and is a directory. + if (!lockDir.exists()) { + if (!lockDir.mkdirs()) + throw new IOException("Cannot create directory: " + + lockDir.getAbsolutePath()); + } else if (!lockDir.isDirectory()) { + throw new IOException("Found regular file where directory expected: " + lockDir.getAbsolutePath()); - } else if (!lockDir.isDirectory()) { - throw new IOException("Found regular file where directory expected: " + - lockDir.getAbsolutePath()); - } + } - acquireTestLock(); + acquireTestLock(); + } } public synchronized Lock makeLock(String lockName) { diff --git a/src/java/org/apache/lucene/store/SimpleFSLockFactory.java b/src/java/org/apache/lucene/store/SimpleFSLockFactory.java index 0a7d3e4b1fd..d6714ae7f0f 100755 --- a/src/java/org/apache/lucene/store/SimpleFSLockFactory.java +++ b/src/java/org/apache/lucene/store/SimpleFSLockFactory.java @@ -40,12 +40,23 @@ public class SimpleFSLockFactory extends LockFactory { private File lockDir; + /** + * Create a SimpleFSLockFactory instance, with null (unset) + * lock directory. This is package-private and is only + * used by FSDirectory when creating this LockFactory via + * the System property + * org.apache.lucene.store.FSDirectoryLockFactoryClass. + */ + SimpleFSLockFactory() throws IOException { + this((File) null); + } + /** * Instantiate using the provided directory (as a File instance). * @param lockDir where lock files should be created. */ public SimpleFSLockFactory(File lockDir) throws IOException { - init(lockDir); + setLockDir(lockDir); } /** @@ -54,10 +65,16 @@ public class SimpleFSLockFactory extends LockFactory { */ public SimpleFSLockFactory(String lockDirName) throws IOException { lockDir = new File(lockDirName); - init(lockDir); + setLockDir(lockDir); } - protected void init(File lockDir) throws IOException { + /** + * Set the lock directory. This is package-private and is + * only used externally by FSDirectory when creating this + * LockFactory via the System property + * org.apache.lucene.store.FSDirectoryLockFactoryClass. + */ + void setLockDir(File lockDir) throws IOException { this.lockDir = lockDir; } diff --git a/src/test/org/apache/lucene/store/TestLockFactory.java b/src/test/org/apache/lucene/store/TestLockFactory.java index c96f1947164..6c55354ab5e 100755 --- a/src/test/org/apache/lucene/store/TestLockFactory.java +++ b/src/test/org/apache/lucene/store/TestLockFactory.java @@ -197,23 +197,47 @@ public class TestLockFactory extends TestCase { // Verify: setting custom lock factory class (as system property) works: + // Verify: all 4 builtin LockFactory implementations are + // settable this way // Verify: FSDirectory does basic locking correctly public void testLockClassProperty() throws IOException { String indexDirName = "index.TestLockFactory3"; + String prpName = "org.apache.lucene.store.FSDirectoryLockFactoryClass"; - System.setProperty("org.apache.lucene.store.FSDirectoryLockFactoryClass", - "org.apache.lucene.store.NoLockFactory"); + try { - IndexWriter writer = new IndexWriter(indexDirName, new WhitespaceAnalyzer(), true); + // NoLockFactory: + System.setProperty(prpName, "org.apache.lucene.store.NoLockFactory"); + IndexWriter writer = new IndexWriter(indexDirName, new WhitespaceAnalyzer(), true); + assertTrue("FSDirectory did not use correct LockFactory: got " + writer.getDirectory().getLockFactory(), + NoLockFactory.class.isInstance(writer.getDirectory().getLockFactory())); + writer.close(); - assertTrue("FSDirectory did not use correct LockFactory: got " + writer.getDirectory().getLockFactory(), - NoLockFactory.class.isInstance(writer.getDirectory().getLockFactory())); + // SingleInstanceLockFactory: + System.setProperty(prpName, "org.apache.lucene.store.SingleInstanceLockFactory"); + writer = new IndexWriter(indexDirName, new WhitespaceAnalyzer(), true); + assertTrue("FSDirectory did not use correct LockFactory: got " + writer.getDirectory().getLockFactory(), + SingleInstanceLockFactory.class.isInstance(writer.getDirectory().getLockFactory())); + writer.close(); - // Put back to the correct default for subsequent tests: - // System.clearProperty("org.apache.lucene.store.FSDirectoryLockFactoryClass"); - System.setProperty("org.apache.lucene.store.FSDirectoryLockFactoryClass", ""); + // NativeFSLockFactory: + System.setProperty(prpName, "org.apache.lucene.store.NativeFSLockFactory"); + writer = new IndexWriter(indexDirName, new WhitespaceAnalyzer(), true); + assertTrue("FSDirectory did not use correct LockFactory: got " + writer.getDirectory().getLockFactory(), + NativeFSLockFactory.class.isInstance(writer.getDirectory().getLockFactory())); + writer.close(); + + // SimpleFSLockFactory: + System.setProperty(prpName, "org.apache.lucene.store.SimpleFSLockFactory"); + writer = new IndexWriter(indexDirName, new WhitespaceAnalyzer(), true); + assertTrue("FSDirectory did not use correct LockFactory: got " + writer.getDirectory().getLockFactory(), + SimpleFSLockFactory.class.isInstance(writer.getDirectory().getLockFactory())); + writer.close(); + } finally { + // Put back to the correct default for subsequent tests: + System.setProperty("org.apache.lucene.store.FSDirectoryLockFactoryClass", ""); + } - writer.close(); // Cleanup rmDir(indexDirName); }