De-couple online reindex activation from index module

Gerrit plugins can contribute to submit rules evaluation, that are a
part of secondary index.  Therefore it is crucial that plugins are
loaded prior to triggering of online reindexing.

This change de-couples online reindex activation from index module and
thus postpones the triggering of online reindexing until after loading
of the plugins:

1. Load secondary index
2. Load all plugins
3. Trigger online reindex if needed

Bug: Issue 10082
Change-Id: I1706d42cb50eb342c2b9eca076e2def5bd1426c0
This commit is contained in:
David Ostrovsky 2018-11-30 08:34:03 +01:00 committed by Luca Milanesio
parent 5e8ab6a691
commit 020758e134
7 changed files with 36 additions and 45 deletions

View File

@ -323,6 +323,7 @@ public class GerritServer implements AutoCloseable {
cfg.setBoolean("httpd", null, "requestLog", false);
cfg.setBoolean("sshd", null, "requestLog", false);
cfg.setBoolean("index", "lucene", "testInmemory", true);
cfg.setBoolean("index", null, "onlineUpgrade", false);
cfg.setString("gitweb", null, "cgi", "");
daemon.setEnableHttpd(desc.httpd());
daemon.setLuceneModule(LuceneIndexModule.singleVersionAllLatest(0));

View File

@ -25,20 +25,15 @@ public class ElasticIndexModule extends AbstractIndexModule {
public static ElasticIndexModule singleVersionWithExplicitVersions(
Map<String, Integer> versions, int threads) {
return new ElasticIndexModule(versions, threads, false);
return new ElasticIndexModule(versions, threads);
}
public static ElasticIndexModule latestVersionWithOnlineUpgrade() {
return new ElasticIndexModule(null, 0, true);
public static ElasticIndexModule latestVersion() {
return new ElasticIndexModule(null, 0);
}
public static ElasticIndexModule latestVersionWithoutOnlineUpgrade() {
return new ElasticIndexModule(null, 0, false);
}
private ElasticIndexModule(
Map<String, Integer> singleVersions, int threads, boolean onlineUpgrade) {
super(singleVersions, threads, onlineUpgrade);
private ElasticIndexModule(Map<String, Integer> singleVersions, int threads) {
super(singleVersions, threads);
}
@Override

View File

@ -28,29 +28,24 @@ import org.eclipse.jgit.lib.Config;
public class LuceneIndexModule extends AbstractIndexModule {
public static LuceneIndexModule singleVersionAllLatest(int threads) {
return new LuceneIndexModule(ImmutableMap.<String, Integer>of(), threads, false);
return new LuceneIndexModule(ImmutableMap.<String, Integer>of(), threads);
}
public static LuceneIndexModule singleVersionWithExplicitVersions(
Map<String, Integer> versions, int threads) {
return new LuceneIndexModule(versions, threads, false);
return new LuceneIndexModule(versions, threads);
}
public static LuceneIndexModule latestVersionWithOnlineUpgrade() {
return new LuceneIndexModule(null, 0, true);
}
public static LuceneIndexModule latestVersionWithoutOnlineUpgrade() {
return new LuceneIndexModule(null, 0, false);
public static LuceneIndexModule latestVersion() {
return new LuceneIndexModule(null, 0);
}
static boolean isInMemoryTest(Config cfg) {
return cfg.getBoolean("index", "lucene", "testInmemory", false);
}
private LuceneIndexModule(
Map<String, Integer> singleVersions, int threads, boolean onlineUpgrade) {
super(singleVersions, threads, onlineUpgrade);
private LuceneIndexModule(Map<String, Integer> singleVersions, int threads) {
super(singleVersions, threads);
}
@Override

View File

@ -76,6 +76,7 @@ import com.google.gerrit.server.git.receive.ReceiveCommitsExecutorModule;
import com.google.gerrit.server.index.DummyIndexModule;
import com.google.gerrit.server.index.IndexModule;
import com.google.gerrit.server.index.IndexModule.IndexType;
import com.google.gerrit.server.index.OnlineUpgrader;
import com.google.gerrit.server.index.VersionManager;
import com.google.gerrit.server.mail.SignedTokenEmailTokenVerifier;
import com.google.gerrit.server.mail.receive.MailReceiver;
@ -422,6 +423,11 @@ public class Daemon extends SiteProgram {
}
modules.add(new SignedTokenEmailTokenVerifier.Module());
modules.add(new PluginModule());
if (VersionManager.getOnlineUpgrade(config)
// Schema upgrade is handled by OnlineNoteDbMigrator in this case.
&& !migrateToNoteDb()) {
modules.add(new OnlineUpgrader.Module());
}
modules.add(new PluginRestApiModule());
modules.add(new RestCacheAdminModule());
modules.add(new GpgModule(config));
@ -489,19 +495,11 @@ public class Daemon extends SiteProgram {
if (luceneModule != null) {
return luceneModule;
}
boolean onlineUpgrade =
VersionManager.getOnlineUpgrade(config)
// Schema upgrade is handled by OnlineNoteDbMigrator in this case.
&& !migrateToNoteDb();
switch (indexType) {
case LUCENE:
return onlineUpgrade
? LuceneIndexModule.latestVersionWithOnlineUpgrade()
: LuceneIndexModule.latestVersionWithoutOnlineUpgrade();
return LuceneIndexModule.latestVersion();
case ELASTICSEARCH:
return onlineUpgrade
? ElasticIndexModule.latestVersionWithOnlineUpgrade()
: ElasticIndexModule.latestVersionWithoutOnlineUpgrade();
return ElasticIndexModule.latestVersion();
default:
throw new IllegalStateException("unsupported index.type = " + indexType);
}

View File

@ -14,8 +14,6 @@
package com.google.gerrit.server.index;
import static com.google.common.base.Preconditions.checkArgument;
import com.google.gerrit.index.IndexConfig;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.server.config.GerritServerConfig;
@ -33,16 +31,10 @@ public abstract class AbstractIndexModule extends AbstractModule {
private final int threads;
private final Map<String, Integer> singleVersions;
private final boolean onlineUpgrade;
protected AbstractIndexModule(
Map<String, Integer> singleVersions, int threads, boolean onlineUpgrade) {
if (singleVersions != null) {
checkArgument(!onlineUpgrade, "online upgrade is incompatible with single version map");
}
protected AbstractIndexModule(Map<String, Integer> singleVersions, int threads) {
this.singleVersions = singleVersions;
this.threads = threads;
this.onlineUpgrade = onlineUpgrade;
}
@Override
@ -92,9 +84,6 @@ public abstract class AbstractIndexModule extends AbstractModule {
Class<? extends VersionManager> versionManagerClass = getVersionManager();
bind(VersionManager.class).to(versionManagerClass);
listener().to(versionManagerClass);
if (onlineUpgrade) {
listener().to(OnlineUpgrader.class);
}
}
}
}

View File

@ -15,10 +15,18 @@
package com.google.gerrit.server.index;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.inject.Inject;
/** Listener to handle upgrading index schema versions at startup. */
public class OnlineUpgrader implements LifecycleListener {
public static class Module extends LifecycleModule {
@Override
protected void configure() {
listener().to(OnlineUpgrader.class);
}
}
private final VersionManager versionManager;
@Inject

View File

@ -57,6 +57,8 @@ import com.google.gerrit.server.git.WorkQueue;
import com.google.gerrit.server.git.receive.ReceiveCommitsExecutorModule;
import com.google.gerrit.server.index.IndexModule;
import com.google.gerrit.server.index.IndexModule.IndexType;
import com.google.gerrit.server.index.OnlineUpgrader;
import com.google.gerrit.server.index.VersionManager;
import com.google.gerrit.server.mail.SignedTokenEmailTokenVerifier;
import com.google.gerrit.server.mail.receive.MailReceiver;
import com.google.gerrit.server.mail.send.SmtpEmailSender;
@ -364,9 +366,9 @@ public class WebAppInitializer extends GuiceServletContextListener implements Fi
private Module createIndexModule() {
switch (indexType) {
case LUCENE:
return LuceneIndexModule.latestVersionWithOnlineUpgrade();
return LuceneIndexModule.latestVersion();
case ELASTICSEARCH:
return ElasticIndexModule.latestVersionWithOnlineUpgrade();
return ElasticIndexModule.latestVersion();
default:
throw new IllegalStateException("unsupported index.type = " + indexType);
}
@ -405,6 +407,9 @@ public class WebAppInitializer extends GuiceServletContextListener implements Fi
}
modules.add(H2CacheBasedWebSession.module());
modules.add(new HttpPluginModule());
if (VersionManager.getOnlineUpgrade(config)) {
modules.add(new OnlineUpgrader.Module());
}
AuthConfig authConfig = cfgInjector.getInstance(AuthConfig.class);
if (authConfig.getAuthType() == AuthType.OPENID) {