blob: 7f0def2559b8c61d17466e15edd0aaab975fcad0 [file] [log] [blame]
Index: src/java/org/apache/lucene/store/FSDirectory.java
===================================================================
--- src/java/org/apache/lucene/store/FSDirectory.java (revision 447480)
+++ src/java/org/apache/lucene/store/FSDirectory.java (working copy)
@@ -86,11 +86,18 @@
/** The default class which implements filesystem-based directories. */
private static Class IMPL;
+ private static FSDirectory INSTANCE;
static {
+ String name =
+ System.getProperty("org.apache.lucene.FSDirectory.class",
+ FSDirectory.class.getName());
+ loadImpl(name);
+ }
+
+ //load impl class and create a "bare" instance of it.
+ private static void loadImpl(String name) {
+ //load the implementation class
try {
- String name =
- System.getProperty("org.apache.lucene.FSDirectory.class",
- FSDirectory.class.getName());
IMPL = Class.forName(name);
} catch (ClassNotFoundException e) {
throw new RuntimeException("cannot load FSDirectory class: " + e.toString(), e);
@@ -101,8 +108,32 @@
throw new RuntimeException("cannot load default FSDirectory class: " + e.toString(), e);
}
}
+ //create bare instance, to allow overiding the static method fileModified().
+ try {
+ INSTANCE = (FSDirectory) IMPL.newInstance();
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException("cannot instantiate default FSDirectory class: " + e.toString(), e);
+ } catch (InstantiationException e) {
+ throw new RuntimeException("cannot instantiate default FSDirectory class: " + e.toString(), e);
+ }
}
+ /**
+ * Replace the class implementating FSDirectory.
+ * @param className full qualified name of FSDirectory implementation
+ */
+ public static void setFSDirImplClass(String className) {
+ loadImpl(className);
+ }
+
+ /**
+ * Return the name of the class implementating FSDirectory.
+ * @return name of the class implementating FSDirectory.
+ */
+ public static String getFSDirImplClass() {
+ return IMPL.getName();
+ }
+
private static MessageDigest DIGESTER;
static {
@@ -265,7 +296,7 @@
} else {
lockDir = new File(LOCK_DIR);
}
- lockFactory = new SimpleFSLockFactory(lockDir);
+ lockFactory = createDefaultFSLockFactory(lockDir);
}
}
}
@@ -282,6 +313,17 @@
init(path, create);
}
+ /**
+ * Create a default lock factory, to be used when no lock factory is specified.
+ * A subclass may override this method to have a different default lock factory.
+ * @param lockDir directory where the locks should be maintained
+ * @return a default lock factory, to be used when no lock factory is specified.
+ * @throws IOException
+ */
+ protected LockFactory createDefaultFSLockFactory(File lockDir) throws IOException {
+ return new SimpleFSLockFactory(lockDir);
+ }
+
private synchronized void create() throws IOException {
if (!directory.exists())
if (!directory.mkdirs())
@@ -316,12 +358,17 @@
/** Returns the time the named file was last modified. */
public long fileModified(String name) {
File file = new File(directory, name);
- return file.lastModified();
+ return fileModified(file);
}
/** Returns the time the named file was last modified. */
public static long fileModified(File directory, String name) {
File file = new File(directory, name);
+ return INSTANCE.fileModified(file);
+ }
+
+ /** Returns the time the named file was last modified. */
+ protected long fileModified(File file) {
return file.lastModified();
}
Index: src/java/org/apache/lucene/store/FSWinDirectory.java
===================================================================
--- src/java/org/apache/lucene/store/FSWinDirectory.java (revision 0)
+++ src/java/org/apache/lucene/store/FSWinDirectory.java (revision 0)
@@ -0,0 +1,515 @@
+package org.apache.lucene.store;
+
+/*
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Windows specific implementation of FSDirectory, with retry in case of IO exceptions.
+ * <P>
+ * This class differs from FSDirectory in that for certain IO operations,
+ * if they fail with an IO exception, a retry logic is applied.
+ * <P>
+ * The motivation for retry is that, apparently, Windows FS behavior
+ * differs from other platforms. Windows API allows Windows applications to
+ * monitor files, in which case the change or creation of a file can cause the
+ * monitoring application to examine that file. As result, there might be very
+ * short intervals in which these files cannot be accessed. In the unfortunate case
+ * that this is a Lucene index file, the result might be an IOEception thrown, most
+ * probably saying "Access Denied", and an index can become corrupted if this happens in
+ * the middle of updating the index.
+ * <P>
+ * The simple retry applied here would occur only in these rare cases when that
+ * problem occurs. If the problem does not occur, no retry would take place and there
+ * should be no performance implications. In those cases that no error occured the
+ * retry is not applied at all.
+ * <P>
+ * For more info on this problem see discussion for
+ * <a href="http://issues.apache.org/jira/browse/LUCENE-665">Lucene Issue 665</a>.
+ * <P>
+ * In order to use this class, it should be made the implementation class for FSDirectorey.
+ * There are two ways to do this:
+ * <ul>
+ * <li>Setting a system property <code>org.apache.lucene.FSDirectory.class</code>
+ * to <code>org.apache.lucene.store.FSWinDirectory</code>.
+ * For instance, when starting a Java application in the cmomand line, the following command line option
+ * would do it:
+ * <code>java -Dorg.apache.lucene.FSDirectory.class=org.apache.lucene.store.FSWinDirectory</code>.
+ * <li>Calling {@link org.apache.lucene.store.FSDirectory#setFSDirImplClass(String)} with
+ * "org.apache.lucene.store.FSWinDirectory" as the className argument.
+ * </ul>
+ * <P>
+ * This class does not verify that it is invoked in a Windows platform - this is the user
+ * responsibilty. It would work in other platforms as well, but the retry logic would not be applied,
+ * so there is not much point in using it in other platforms.
+ * <P>
+ * There are three (static) configuration setups when this class is in use:
+ * <ul>
+ * <li>How long the total retry delay can be.
+ * <br>See {@link #setMaxTotalDelay(long)}.
+ * <li>How long to wait between retries.
+ * <br>See {@link #setIntervalDelay(long)}.
+ * <li>Should retry be applied also for file delete.
+ * <br>See {@link #enableDeleteRetry(boolean)}.
+ * </ul>
+ * <P>
+ * There is an additional configuration setup for the lock:
+ * {@link SimpleFSWinLockFactory#enableLockReleaseRetry(boolean)}.
+ */
+public class FSWinDirectory extends FSDirectory {
+
+ /** Default total retry delay */
+ public static final long DEFAULT_MAX_TOTAL_DELAY = 240;
+ /** Default retry delay interval */
+ public static final long DEFAULT_INTERVAL_DELAY = 30;
+ /** Default mode for delete retry (disabled) */
+ public static final boolean DEFAULT_DELETE_RETRY = false;
+
+ private static long maxTotalDelay = DEFAULT_MAX_TOTAL_DELAY;
+ private static long intervalDelay = DEFAULT_INTERVAL_DELAY;
+ private static boolean enableDeleteRetry = DEFAULT_DELETE_RETRY;
+
+ /** Maximal number of trials by total delay and interval delay, assuming
+ * an operation fails in no time. Computed once. Used for preventing
+ * too long delays if system clock is moved backwards. */
+ private static int maxTrials = (int) Math.ceil((double)maxTotalDelay / (double)intervalDelay);
+
+ public FSWinDirectory() {
+ super();
+ }
+
+ /**
+ * Returns the intervalDelay.
+ * @return the intervalDelay.
+ * @see #setIntervalDelay(long).
+ */
+ public static long getIntervalDelay() {
+ return intervalDelay;
+ }
+
+ /**
+ * Sets the interval before next retry.
+ * @param intervalDelay The intervalDelay to set (millis).
+ */
+ public static void setIntervalDelay(long intervalDelay) {
+ FSWinDirectory.intervalDelay = intervalDelay;
+ maxTrials = (int) Math.ceil((double)maxTotalDelay / (double)intervalDelay);
+ }
+
+ /**
+ * Returns the maxTotalDelay.
+ * @return Returns the maxTotalDelay.
+ * @see #setMaxTotalDelay(long).
+ */
+ public static long getMaxTotalDelay() {
+ return maxTotalDelay;
+ }
+
+ /**
+ * Sets the maximum allowed total delay due to retry.
+ * @param maxTotalDelay The maxTotalDelay to set (millis).
+ */
+ public static void setMaxTotalDelay(long maxTotalDelay) {
+ FSWinDirectory.maxTotalDelay = maxTotalDelay;
+ maxTrials = (int) Math.ceil((double)maxTotalDelay / (double)intervalDelay);
+ }
+
+ /**
+ * Checks if retry is enabled for file delete.
+ * @return true iff retry is enabled for file delete.
+ * @see #enableDeleteRetry(boolean).
+ */
+ public static boolean isEnableDeleteRetry() {
+ return enableDeleteRetry;
+ }
+
+ /**
+ * Enables or disables retry for file delete.
+ * By default retry is disabled for file delete.
+ * This is because in some calls to this method in Lucene, if a file cannot
+ * be deleted, it is simply saved in a "delete later" list.
+ * For those cases, the retry logic might impose an unnecessary delay in program execution.
+ * But there are other usages where this "delete later" logic is not applied,
+ * where it could be worth to retry.
+ * This is disabled by default.
+ * @param enabled true to enable, false to disable.
+ */
+ public static void enableDeleteRetry(boolean enabled) {
+ enableDeleteRetry = enabled;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.FSDirectory#createOutput(java.lang.String)
+ */
+ public IndexOutput createOutput(String name) throws IOException {
+ int trialsSoFar = 0;
+ long maxTime = System.currentTimeMillis() + maxTotalDelay;
+ while (true) {
+ try {
+ return super.createOutput(name);
+ } catch (IOException e) {
+ if (!waitForRetry(maxTime, trialsSoFar++, e)) {
+ throw e;
+ }
+ }
+ }
+ }
+
+ /**
+ * Wait an interval for retry.
+ * Returns true if should retry, false if should not retry.
+ * @param maxTime Maximal clock time by end of waiting
+ * @param trialsSoFar Number of trials so far, for deciding if to wait at all.
+ * @param e Exception that caused the retry. Now used for debug only,
+ * but can also be used for analyzing the exception, to decide if to retry.
+ * @param intervalDelay how long to wait
+ * @param maxTrials how many time allowed to retry
+ * @return true if should retry, false if should not retry.
+ */
+ private static boolean waitForRetry(
+ long maxTime, int trialsSoFar, Exception e, long intervalDelay, int maxTrials) {
+ if (trialsSoFar >= maxTrials) {
+ return false; //waited too many times already
+ }
+ long timeLefe = maxTime - System.currentTimeMillis();
+ long delay = Math.min(timeLefe, intervalDelay);
+ if (delay <= 0) {
+ return false; //waited too long already
+ }
+
+ //debug
+ //System.out.println("Retry no. "+trialsSoFar+" because of: "+e);
+ //e.printStackTrace(System.out);
+
+ try {
+ Thread.sleep(delay);
+ return true;
+ } catch (InterruptedException e1) {
+ return false;
+ }
+ }
+ /** @see #waitForRetry(long, int, Exception, long, int) */
+ private static boolean waitForRetry(long maxTime, int trialsSoFar, Exception e) {
+ return waitForRetry(maxTime, trialsSoFar, e, intervalDelay, maxTrials);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.FSDirectory#deleteFile(java.lang.String)
+ */
+ public void deleteFile(String name) throws IOException {
+ int trialsSoFar = 0;
+ long maxTime = System.currentTimeMillis() + maxTotalDelay;
+ while (true) {
+ try {
+ super.deleteFile(name);
+ return;
+ } catch (IOException e) {
+ if (!isEnableDeleteRetry() || !waitForRetry(maxTime, trialsSoFar++, e)) {
+ throw e;
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.FSDirectory#createDefaultFSLockFactory(java.io.File)
+ */
+ protected LockFactory createDefaultFSLockFactory(File lockDir) throws IOException {
+ return new SimpleFSWinLockFactory(lockDir);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.FSDirectory#fileExists(java.lang.String)
+ */
+ public boolean fileExists(String name) {
+ int trialsSoFar = 0;
+ long maxTime = System.currentTimeMillis() + maxTotalDelay;
+ while (true) {
+ try {
+ return super.fileExists(name);
+ } catch (Exception e) {
+ if (!waitForRetry(maxTime, trialsSoFar++, e)) {
+ throw runtimeException(e);
+ }
+ }
+ }
+ }
+
+ //make a runtime exception out of the input exception
+ private static RuntimeException runtimeException (Exception e) {
+ if (e instanceof RuntimeException) {
+ return (RuntimeException) e;
+ }
+ RuntimeException ex = new RuntimeException(e.getMessage());
+ ex.initCause(e);
+ return ex;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.FSDirectory#fileLength(java.lang.String)
+ */
+
+ public long fileLength(String name) {
+ int trialsSoFar = 0;
+ long maxTime = System.currentTimeMillis() + maxTotalDelay;
+ while (true) {
+ try {
+ return super.fileLength(name);
+ } catch (Exception e) {
+ if (!waitForRetry(maxTime, trialsSoFar++, e)) {
+ throw runtimeException(e);
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.FSDirectory#fileModified(java.io.File)
+ */
+ protected long fileModified(File file) {
+ int trialsSoFar = 0;
+ long maxTime = System.currentTimeMillis() + maxTotalDelay;
+ while (true) {
+ try {
+ return super.fileModified(file);
+ } catch (Exception e) {
+ if (!waitForRetry(maxTime, trialsSoFar++, e)) {
+ throw runtimeException(e);
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.FSDirectory#list()
+ */
+ public String[] list() {
+ int trialsSoFar = 0;
+ long maxTime = System.currentTimeMillis() + maxTotalDelay;
+ while (true) {
+ try {
+ return super.list();
+ } catch (Exception e) {
+ if (!waitForRetry(maxTime, trialsSoFar++, e)) {
+ throw runtimeException(e);
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.FSDirectory#openInput(java.lang.String)
+ */
+ public IndexInput openInput(String name) throws IOException {
+ int trialsSoFar = 0;
+ long maxTime = System.currentTimeMillis() + maxTotalDelay;
+ while (true) {
+ try {
+ return super.openInput(name);
+ } catch (IOException e) {
+ if (!waitForRetry(maxTime, trialsSoFar++, e)) {
+ throw e;
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.FSDirectory#renameFile(java.lang.String, java.lang.String)
+ */
+ public synchronized void renameFile(String from, String to) throws IOException {
+ int trialsSoFar = 0;
+ long maxTime = System.currentTimeMillis() + maxTotalDelay;
+ while (true) {
+ try {
+ super.renameFile(from, to);
+ return;
+ } catch (IOException e) {
+ if (!waitForRetry(maxTime, trialsSoFar++, e)) {
+ throw e;
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.FSDirectory#touchFile(java.lang.String)
+ */
+ public void touchFile(String name) {
+ int trialsSoFar = 0;
+ long maxTime = System.currentTimeMillis() + maxTotalDelay;
+ while (true) {
+ try {
+ super.touchFile(name);
+ return;
+ } catch (Exception e) {
+ if (!waitForRetry(maxTime, trialsSoFar++, e)) {
+ throw runtimeException(e);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Windows specific implementation of SimpleFSLockFactory.
+ * <P>
+ * This class differs from {@link org.apache.lucene.store.SimpleFSLockFactory} in that
+ * for certain IO operations, if they fail, a retry logic is applied.
+ * <P>
+ * See {@link org.apache.lucene.store.FSWinDirectory} for the motivation for retry.
+ */
+ public static class SimpleFSWinLockFactory extends SimpleFSLockFactory {
+
+ public static final boolean DEFAULT_LOCK_RELEASE_RETRY = false;
+
+ /** Default mode for lock delete retry (disabled) */
+ private static boolean enableLockReleaseRetry = DEFAULT_LOCK_RELEASE_RETRY;
+
+ /**
+ * Checks if retry is enabled for lock file delete.
+ * @return true iff retry is enabled for lock file delete.
+ * @see #enableLockReleaseRetry(boolean).
+ */
+ public static boolean isEnableLockReleaseRetry() {
+ return enableLockReleaseRetry;
+ }
+
+ /**
+ * Enables or disables retry for lock release.
+ * By default retry is disabled for lock file release.
+ * This is because a possible risk in NFS mounted file systems.
+ * In NFS systems, a file delete attempt might return failure code due to NFS timeout,
+ * although actually the delete succeeded. There is usually no harm in trying to
+ * delete again a file that was already deleted. But here this would be dangerous, because
+ * the file deletion stands for releasing a "co-operative lock file".
+ * Therefore the recommendation is to enable this feature only in a non-NFS env.
+ * This is disabled by default.
+ * @param enabled true to enable, false to disable.
+ */
+ public static void enableLockReleaseRetry(boolean enabled) {
+ enableLockReleaseRetry = enabled;
+ }
+
+ /**
+ * @param lockDir
+ * @throws IOException
+ */
+ public SimpleFSWinLockFactory(File lockDir) throws IOException {
+ super(lockDir);
+ }
+
+ /**
+ * @param lockDirName
+ * @throws IOException
+ */
+ public SimpleFSWinLockFactory(String lockDirName) throws IOException {
+ super(lockDirName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.SimpleFSLockFactory#clearAllLocks()
+ */
+ public void clearAllLocks() throws IOException {
+ int trialsSoFar = 0;
+ long maxTime = System.currentTimeMillis() + maxTotalDelay;
+ while (true) {
+ try {
+ super.clearAllLocks();
+ return;
+ } catch (IOException e) {
+ if (!isEnableLockReleaseRetry() || !waitForRetry(maxTime, trialsSoFar++, e)) {
+ throw e;
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.SimpleFSLockFactory#makeLock(java.lang.String)
+ */
+ public Lock makeLock(String lockName) {
+ return new SimpleWinFSLock(lockDir, lockPrefix + "-" + lockName);
+ }
+
+ }
+
+ /** Inner class implementing the Win FS Lock */
+ private static class SimpleWinFSLock extends SimpleFSLock {
+
+ public SimpleWinFSLock(File lockDir, String lockFileName) {
+ super(lockDir, lockFileName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.SimpleFSLock#isLocked()
+ */
+ public boolean isLocked() {
+ int trialsSoFar = 0;
+ long maxTime = System.currentTimeMillis() + maxTotalDelay;
+ while (true) {
+ try {
+ return super.isLocked();
+ } catch (Exception e) {
+ if (!waitForRetry(maxTime, trialsSoFar++, e)) {
+ throw runtimeException(e);
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.Lock#obtain(long)
+ */
+ public boolean obtain(long lockWaitTimeout) throws IOException {
+ int trialsSoFar = 0;
+ long maxTime = System.currentTimeMillis() + lockWaitTimeout;
+ int maxTrials = (int) Math.ceil((double)lockWaitTimeout / (double)LOCK_POLL_INTERVAL);
+ while (true) {
+ try {
+ return obtain();
+ } catch (IOException e) {
+ if (!waitForRetry(maxTime, trialsSoFar++, e, LOCK_POLL_INTERVAL, maxTrials)) {
+ throw e;
+ }
+ }
+ }
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.SimpleFSLock#release()
+ */
+ public void release() {
+ int trialsSoFar = 0;
+ long maxTime = System.currentTimeMillis() + maxTotalDelay;
+ while (true) {
+ try {
+ super.release();
+ return;
+ } catch (Exception e) {
+ if (!SimpleFSWinLockFactory.isEnableLockReleaseRetry() || !waitForRetry(maxTime, trialsSoFar++, e)) {
+ throw runtimeException(e);
+ }
+ }
+ }
+ }
+
+ }
+
+}
Index: src/java/org/apache/lucene/store/SimpleFSLockFactory.java
===================================================================
--- src/java/org/apache/lucene/store/SimpleFSLockFactory.java (revision 447480)
+++ src/java/org/apache/lucene/store/SimpleFSLockFactory.java (working copy)
@@ -41,7 +41,7 @@
System.getProperty("org.apache.lucene.lockDir",
System.getProperty("java.io.tmpdir"));
- private File lockDir;
+ protected File lockDir;
/**
* Instantiate using default LOCK_DIR: <code>org.apache.lucene.lockDir</code>
Index: src/test/org/apache/lucene/store/TestLockFactory.java
===================================================================
--- src/test/org/apache/lucene/store/TestLockFactory.java (revision 447480)
+++ src/test/org/apache/lucene/store/TestLockFactory.java (working copy)
@@ -130,7 +130,7 @@
IndexWriter writer = new IndexWriter(indexDirName, new WhitespaceAnalyzer(), true);
assertTrue("FSDirectory did not use correct LockFactory: got " + writer.getDirectory().getLockFactory(),
- SimpleFSLockFactory.class.isInstance(writer.getDirectory().getLockFactory()));
+ isSimpleFsLockFactory(writer.getDirectory().getLockFactory()));
IndexWriter writer2 = null;
@@ -157,7 +157,7 @@
IndexWriter writer = new IndexWriter(indexDirName, new WhitespaceAnalyzer(), true);
assertTrue("FSDirectory did not use correct LockFactory: got " + writer.getDirectory().getLockFactory(),
- SimpleFSLockFactory.class.isInstance(writer.getDirectory().getLockFactory()));
+ isSimpleFsLockFactory(writer.getDirectory().getLockFactory()));
// Create a 2nd IndexWriter. This should not fail:
IndexWriter writer2 = null;
@@ -175,6 +175,10 @@
rmDir(indexDirName);
}
+ //verify that the correct simple fs lock factory is in use
+ protected boolean isSimpleFsLockFactory(LockFactory lockFactory) {
+ return SimpleFSLockFactory.class.isInstance(lockFactory);
+ }
// Verify: setting custom lock factory class (as system property) works:
// Verify: FSDirectory does basic locking correctly
Index: src/test/org/apache/lucene/store/TestWinLockfactory.java
===================================================================
--- src/test/org/apache/lucene/store/TestWinLockfactory.java (revision 0)
+++ src/test/org/apache/lucene/store/TestWinLockfactory.java (revision 0)
@@ -0,0 +1,40 @@
+package org.apache.lucene.store;
+
+public class TestWinLockfactory extends TestLockFactory {
+
+ String origFsDirImplName = null;
+
+ public TestWinLockfactory() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#setUp()
+ */
+ protected void setUp() throws Exception {
+ super.setUp();
+ origFsDirImplName = FSDirectory.getFSDirImplClass();
+ FSDirectory.setFSDirImplClass("org.apache.lucene.store.FSWinDirectory");
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#tearDown()
+ */
+ protected void tearDown() throws Exception {
+ try {
+ super.tearDown();
+ } finally {
+ FSDirectory.setFSDirImplClass(origFsDirImplName);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.store.TestLockFactory#isSimpleFsLockFactory(org.apache.lucene.store.LockFactory)
+ */
+ protected boolean isSimpleFsLockFactory(LockFactory lockFactory) {
+ return FSWinDirectory.SimpleFSWinLockFactory.class.isInstance(lockFactory);
+ }
+
+
+
+}