Disable FSync in lucene indexer

Change-Id: I3752d700a5f5c0c46c16dce9a8331dce79341c57
Signed-off-by: Dawid Pakuła <zulus@w3des.net>
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexContainer.java b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexContainer.java
index ed9587b..d5c7c16 100644
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexContainer.java
+++ b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexContainer.java
@@ -14,6 +14,7 @@
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
@@ -29,6 +30,7 @@
 import org.apache.lucene.search.SearcherManager;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
+import org.apache.lucene.store.FilterDirectory;
 import org.apache.lucene.store.SingleInstanceLockFactory;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
@@ -110,15 +112,42 @@
 				new HashMap<Integer, SearcherManager>());
 	}
 
+	/**
+	 * Disable FSync call on each commit. Similar to RAFDirectory
+	 */
+	private static class NoFsyncDirectory extends FilterDirectory {
+
+		protected NoFsyncDirectory(FSDirectory in) {
+			super(in);
+		}
+
+		@Override
+		public void sync(Collection<String> names) throws IOException {
+			((FSDirectory) in).deletePendingFiles();
+		}
+
+		@Override
+		public void syncMetaData() throws IOException {
+			((FSDirectory) in).deletePendingFiles();
+		}
+
+		public void shutdown() throws IOException {
+			in.syncMetaData();
+		}
+
+	}
+
 	private IndexWriter createWriter(Path path) throws IOException {
 
-		Directory indexDir = FSDirectory.open(path,
-				new SingleInstanceLockFactory());
+		Directory indexDir = new NoFsyncDirectory(
+				FSDirectory.open(path, new SingleInstanceLockFactory()));
 		IndexWriterConfig config = new IndexWriterConfig(new SimpleAnalyzer());
-		config.setUseCompoundFile(true);
+
+		config.setUseCompoundFile(false);
 		config.setOpenMode(OpenMode.CREATE_OR_APPEND);
 		config.setCommitOnClose(false);
-		return new IndexWriter(indexDir, config);
+		IndexWriter writer = new IndexWriter(indexDir, config);
+		return writer;
 	}
 
 	private IndexWriter getWriter(Path path) {
@@ -247,8 +276,11 @@
 			// Close time stamps searcher & writer
 			if (fTimestampsSearcher != null)
 				fTimestampsSearcher.close();
-			if (fTimestampsWriter != null)
+			if (fTimestampsWriter != null) {
+				((NoFsyncDirectory) fTimestampsWriter.getDirectory())
+						.shutdown();
 				fTimestampsWriter.close();
+			}
 			// Close all data searchers
 			for (Map<Integer, SearcherManager> dataSearchers : fIndexSearchers
 					.values()) {
@@ -261,8 +293,10 @@
 			for (Map<Integer, IndexWriter> dataWriters : fIndexWriters
 					.values()) {
 				for (IndexWriter writer : dataWriters.values()) {
-					if (writer != null && writer.isOpen())
+					if (writer != null && writer.isOpen()) {
+						((NoFsyncDirectory) writer.getDirectory()).shutdown();
 						writer.close();
+					}
 				}
 			}
 		} catch (IOException e) {