Force fork/join during lucene commits and search
Change-Id: I79d4d941dde7bc37f5b7aea9890469074a5041b7
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 3f6f675..9f4e3d0 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
@@ -173,17 +173,18 @@
public SearcherManager getTimestampsSearcher() {
try {
+ boolean refresh = true;
if (fTimestampsSearcher == null) {
synchronized (this) {
if (fTimestampsSearcher == null) {
fTimestampsSearcher = new SearcherManager(
getTimestampsWriter(), true, false,
new SearcherFactory());
- } else {
- fTimestampsSearcher.maybeRefresh();
+ refresh = false;
}
}
- } else {
+ }
+ if (refresh) {
fTimestampsSearcher.maybeRefresh();
}
@@ -201,7 +202,7 @@
public IndexWriter getIndexWriter(IndexType dataType, int elementType) {
IndexWriter writer = fIndexWriters.get(dataType).get(elementType);
if (writer == null) {
- synchronized (this) {
+ synchronized (fIndexWriters) {
writer = fIndexWriters.get(dataType).get(elementType);
if (writer == null) {
Path writerPath = getPath(dataType, elementType);
@@ -220,8 +221,9 @@
SearcherManager searcher = fIndexSearchers.get(dataType)
.get(elementType);
try {
+ boolean refresh = true;
if (searcher == null) {
- synchronized (this) {
+ synchronized (fIndexSearchers) {
searcher = fIndexSearchers.get(dataType).get(elementType);
if (searcher == null) {
searcher = new SearcherManager(
@@ -229,15 +231,14 @@
new SearcherFactory());
fIndexSearchers.get(dataType).put(elementType,
searcher);
- } else {
- searcher.maybeRefreshBlocking();
+ refresh = false;
}
}
- } else {
+ }
+ if (refresh) {
searcher.maybeRefreshBlocking();
}
-
} catch (IndexNotFoundException e) {
return null;
} catch (IOException e) {
@@ -309,7 +310,7 @@
void commit() {
List<IndexWriter> writers = new LinkedList<>();
- synchronized (this) {
+ synchronized (fIndexWriters) {
for (Map<Integer, IndexWriter> dataWriters : fIndexWriters
.values()) {
for (IndexWriter writer : dataWriters.values()) {
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneManager.java b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneManager.java
index 5fd2d88..8f72b45 100644
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneManager.java
+++ b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneManager.java
@@ -19,7 +19,6 @@
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashSet;
-import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
@@ -100,17 +99,10 @@
if (subMonitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
- List<ForkJoinTask> tasks = new LinkedList<>();
- if (dirtyContainers.size() == 1) {
- dirtyContainers.get(0).commit();
- } else {
- for (IndexContainer indexContainer : dirtyContainers) {
- tasks.add(ForkJoinTask.adapt(() -> {
- indexContainer.commit();
- }));
- }
- ForkJoinTask.invokeAll(tasks).stream()
- .forEach(t -> t.join());
+ for (IndexContainer indexContainer : dirtyContainers) {
+ ForkJoinTask.adapt(() -> {
+ indexContainer.commit();
+ }).fork();
}
} catch (Exception e) {
Logger.logException(e);
@@ -168,12 +160,11 @@
@Override
public void aboutToBeIdle() {
- // run directly without special job
- fCommitter.run(new NullProgressMonitor());
}
@Override
public void aboutToBeRun(long idlingTime) {
+ fCommitter.run(new NullProgressMonitor());
}
}
@@ -277,11 +268,14 @@
private List<IndexContainer> getDirtyContainers() {
List<IndexContainer> uncommittedContainers = new ArrayList<>();
- for (IndexContainer indexContainer : fIndexContainers.values()) {
- if (indexContainer.hasChanges()) {
- uncommittedContainers.add(indexContainer);
+ synchronized (fIndexContainers) {
+ for (IndexContainer indexContainer : fIndexContainers.values()) {
+ if (indexContainer.hasChanges()) {
+ uncommittedContainers.add(indexContainer);
+ }
}
}
+
return uncommittedContainers;
}
@@ -315,7 +309,7 @@
}
}
- private synchronized void startup() {
+ private void startup() {
loadProperties();
boolean purgeIndexRoot = false;
boolean resetProperties = false;
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneSearchEngine.java b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneSearchEngine.java
index 30b5806..efd826b 100644
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneSearchEngine.java
+++ b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneSearchEngine.java
@@ -253,7 +253,7 @@
parent, trueFlags, falseFlags, true, matchRule, scripts,
container));
}
- ForkJoinTask.invokeAll(tasks).stream().forEach(t -> t.join()
+ tasks.stream().map(ForkJoinTask::fork).forEach(t -> t.join()
.stream().forEach(m -> searchMatchHandler.handle(m, true)));
}
@@ -263,7 +263,7 @@
parent, trueFlags, falseFlags, false, matchRule,
scripts, container));
}
- ForkJoinTask.invokeAll(tasks).stream().forEach(t -> t.join()
+ tasks.stream().map(ForkJoinTask::fork).forEach(t -> t.join()
.stream().forEach(m -> searchMatchHandler.handle(m, true)));
}
}
diff --git a/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/internal/core/search/processing/JobManager.java b/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/internal/core/search/processing/JobManager.java
index a36369a..885928f 100644
--- a/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/internal/core/search/processing/JobManager.java
+++ b/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/internal/core/search/processing/JobManager.java
@@ -412,6 +412,7 @@
delaySignal.wait(50);
}
}
+
continue;
}
if (VERBOSE) {