Lucene: close sub-indexes in parallel

The open and closed sub-indexes may each take a while to close as they
flush and commit writes. They are completely independent, so close
them in parallel, reusing the existing indexing executor, which
shouldn't be doing much else during shutdown.

Change-Id: I3c56a972d19c793e2b8601727c03b6e7bf53e77d
This commit is contained in:
Dave Borowitz
2013-06-21 15:01:15 -07:00
parent e2f424a7d8
commit a44d8396e7
3 changed files with 31 additions and 6 deletions

View File

@@ -23,6 +23,8 @@ import static org.apache.lucene.search.BooleanClause.Occur.SHOULD;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListeningScheduledExecutorService;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.server.config.SitePaths;
@@ -73,6 +75,8 @@ import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
/**
* Secondary index implementation using Apache Lucene.
@@ -104,14 +108,17 @@ public class LuceneChangeIndex implements ChangeIndex, LifecycleListener {
private final RefreshThread refreshThread;
private final FillArgs fillArgs;
private final ExecutorService executor;
private final boolean readOnly;
private final SubIndex openIndex;
private final SubIndex closedIndex;
LuceneChangeIndex(Config cfg, SitePaths sitePaths, FillArgs fillArgs,
LuceneChangeIndex(Config cfg, SitePaths sitePaths,
ListeningScheduledExecutorService executor, FillArgs fillArgs,
boolean readOnly) throws IOException {
this.refreshThread = new RefreshThread();
this.fillArgs = fillArgs;
this.executor = executor;
this.readOnly = readOnly;
openIndex = new SubIndex(new File(sitePaths.index_dir, CHANGES_OPEN),
getIndexWriterConfig(cfg, "changes_open"));
@@ -127,9 +134,23 @@ public class LuceneChangeIndex implements ChangeIndex, LifecycleListener {
@Override
public void stop() {
refreshThread.halt();
List<Future<?>> closeFutures = Lists.newArrayListWithCapacity(2);
closeFutures.add(executor.submit(new Runnable() {
@Override
public void run() {
openIndex.close();
}
}));
closeFutures.add(executor.submit(new Runnable() {
@Override
public void run() {
closedIndex.close();
}
}));
for (Future<?> future : closeFutures) {
Futures.getUnchecked(future);
}
}
@Override
public void insert(ChangeData cd) throws IOException {

View File

@@ -14,11 +14,13 @@
package com.google.gerrit.lucene;
import com.google.common.util.concurrent.ListeningScheduledExecutorService;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.index.ChangeIndex;
import com.google.gerrit.server.index.FieldDef.FillArgs;
import com.google.gerrit.server.index.IndexExecutor;
import com.google.gerrit.server.index.IndexModule;
import com.google.inject.Provides;
import com.google.inject.Singleton;
@@ -56,7 +58,9 @@ public class LuceneIndexModule extends LifecycleModule {
@Provides
@Singleton
public LuceneChangeIndex getChangeIndex(@GerritServerConfig Config cfg,
SitePaths sitePaths, FillArgs fillArgs) throws IOException {
return new LuceneChangeIndex(cfg, sitePaths, fillArgs, readOnly);
SitePaths sitePaths,
@IndexExecutor ListeningScheduledExecutorService executor,
FillArgs fillArgs) throws IOException {
return new LuceneChangeIndex(cfg, sitePaths, executor, fillArgs, readOnly);
}
}

View File

@@ -27,5 +27,5 @@ import java.lang.annotation.Retention;
*/
@Retention(RUNTIME)
@BindingAnnotation
@interface IndexExecutor {
public @interface IndexExecutor {
}