From 6f8b8ccce2d9c6ac92c637b8ecf954bc74104315 Mon Sep 17 00:00:00 2001 From: Sean Flanigan Date: Tue, 19 Aug 2014 17:09:41 +1000 Subject: [PATCH] Skip Lucene lock check unless NFS is used --- .../src/main/java/org/zanata/ZanataInit.java | 48 +++++++++++++++---- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/zanata-war/src/main/java/org/zanata/ZanataInit.java b/zanata-war/src/main/java/org/zanata/ZanataInit.java index 29aba9ec93..dacbb4f127 100644 --- a/zanata-war/src/main/java/org/zanata/ZanataInit.java +++ b/zanata-war/src/main/java/org/zanata/ZanataInit.java @@ -22,7 +22,12 @@ import java.io.File; import java.io.FileInputStream; +import java.io.IOException; import java.lang.reflect.Proxy; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Collection; import java.util.Properties; import java.util.jar.Attributes; @@ -38,7 +43,6 @@ import javax.naming.NamingException; import javax.servlet.ServletContext; -import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; @@ -148,7 +152,7 @@ public void initZanata() throws Exception { } private void checkLuceneLocks(File indexDir) - throws ZanataInitializationException { + throws IOException, ZanataInitializationException { if (!indexDir.exists()) { if (indexDir.mkdirs()) { log.info("Created lucene index directory."); @@ -158,15 +162,39 @@ private void checkLuceneLocks(File indexDir) } Collection lockFiles = FileUtils.listFiles(indexDir, new String[] { "lock" }, true); - Collection lockedDirs = Lists.newArrayList(); - for (File f : lockFiles) { - lockedDirs.add(f.getParent()); - } if (!lockFiles.isEmpty()) { - log.error("Lucene lock files found. Check if Zanata is already running. Otherwise, Zanata was not shut down cleanly: delete the locked directories: " - + lockedDirs); - throw new ZanataInitializationException("Found lock files: " - + lockFiles); + // we don't trust Lucene's NativeFSLockFactory for NFS locks + if (anyUsesNFS(lockFiles)) { + log.error( + "Lucene lock files found. Check if Zanata is already " + + "running. Otherwise, Zanata was not shut down " + + "cleanly: delete the locks: " + + lockFiles); + throw new ZanataInitializationException("Found lock files: " + + lockFiles); + } + } + } + + private boolean anyUsesNFS(Collection files) { + try { + FileSystem fileSystem = FileSystems.getDefault(); + for (File file: files) { + Path path = fileSystem.getPath(file.getAbsolutePath()); + String fileStoreType = Files.getFileStore(path).type(); + if (fileStoreType.toLowerCase().startsWith("nfs")) { + return true; + } + } + return false; + } catch (NoClassDefFoundError e) { + log.warn("Unable to load Java 1.7 FileSystem classes: " + e.toString()); + // assume the worst case + return true; + } catch (IOException e) { + log.warn(e.toString(), e); + // assume the worst case + return true; } }