diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt index 3e778dc777..f4a9588fbd 100644 --- a/Documentation/config-gerrit.txt +++ b/Documentation/config-gerrit.txt @@ -2777,6 +2777,16 @@ reindex] must be performed. This section is only used if Gerrit runs in slave mode, otherwise it is ignored. +[[index.scheduledIndexer.runOnStartup]]index.scheduledIndexer.runOnStartup:: ++ +Whether the scheduled indexer should run once immediately on startup. +If set to `true` the slave startup is blocked until all stale groups +were reindexed. Enabling this allows to prevent that slaves that were +offline for a longer period of time run with outdated group information +until the first scheduled indexing is done. ++ +Defaults to `true`. + [[index.scheduledIndexer.enabled]]index.scheduledIndexer.enabled:: + Whether the scheduled indexer is enabled. If the scheduled indexer is diff --git a/java/com/google/gerrit/acceptance/AbstractDaemonTest.java b/java/com/google/gerrit/acceptance/AbstractDaemonTest.java index 93235634b5..77dc8ea5e1 100644 --- a/java/com/google/gerrit/acceptance/AbstractDaemonTest.java +++ b/java/com/google/gerrit/acceptance/AbstractDaemonTest.java @@ -343,9 +343,6 @@ public abstract class AbstractDaemonTest { server.getTestInjector().injectMembers(resetter); } initSsh(); - // The server restart threw away all indices. Only reindex all groups as we only have the group - // index in slave mode. - reindexAllGroups(); } private void reindexAllGroups() throws OrmException, IOException, ConfigInvalidException { diff --git a/java/com/google/gerrit/server/group/PeriodicGroupIndexer.java b/java/com/google/gerrit/server/group/PeriodicGroupIndexer.java index 2fcc5e0aba..e99440b56c 100644 --- a/java/com/google/gerrit/server/group/PeriodicGroupIndexer.java +++ b/java/com/google/gerrit/server/group/PeriodicGroupIndexer.java @@ -82,6 +82,11 @@ public class PeriodicGroupIndexer implements Runnable { @Override public void start() { + boolean runOnStartup = cfg.getBoolean("index", "scheduledIndexer", "runOnStartup", true); + if (runOnStartup) { + runner.run(); + } + boolean isEnabled = cfg.getBoolean("index", "scheduledIndexer", "enabled", true); if (!isEnabled) { log.warn("index.scheduledIndexer is disabled"); diff --git a/javatests/com/google/gerrit/acceptance/api/group/GroupsIT.java b/javatests/com/google/gerrit/acceptance/api/group/GroupsIT.java index 5e10e37e04..2d5703d251 100644 --- a/javatests/com/google/gerrit/acceptance/api/group/GroupsIT.java +++ b/javatests/com/google/gerrit/acceptance/api/group/GroupsIT.java @@ -1262,14 +1262,15 @@ public class GroupsIT extends AbstractDaemonTest { groups.getAllGroupReferences(db).map(GroupReference::getUUID).collect(toList()); assertThat(expectedGroups.size()).isAtLeast(2); + // Restart the server as slave, on startup of the slave all groups are indexed. restartAsSlave(); GroupIndexedCounter groupIndexedCounter = new GroupIndexedCounter(); RegistrationHandle groupIndexEventCounterHandle = groupIndexedListeners.add(groupIndexedCounter); try { - // On startup of the slave the test framework ensures that the group index is up-to-date. - // Hence running the reindexer doesn't need to reindex any group. + // Running the reindexer right after startup should not need to reindex any group since + // reindexing was already done on startup. slaveGroupIndexer.run(); groupIndexedCounter.assertNoReindex(); @@ -1308,6 +1309,33 @@ public class GroupsIT extends AbstractDaemonTest { } } + @Test + @Sandboxed + @GerritConfig(name = "index.scheduledIndexer.runOnStartup", value = "false") + @GerritConfig(name = "index.scheduledIndexer.enabled", value = "false") + @GerritConfig(name = "index.autoReindexIfStale", value = "false") + @IgnoreGroupInconsistencies + public void disabledReindexGroupsOnStartupSlaveMode() throws Exception { + assume().that(readGroupsFromNoteDb()).isTrue(); + + List expectedGroups = + groups.getAllGroupReferences(db).map(GroupReference::getUUID).collect(toList()); + assertThat(expectedGroups.size()).isAtLeast(2); + + restartAsSlave(); + + GroupIndexedCounter groupIndexedCounter = new GroupIndexedCounter(); + RegistrationHandle groupIndexEventCounterHandle = + groupIndexedListeners.add(groupIndexedCounter); + try { + // No group indexing happened on startup. All groups should be reindexed now. + slaveGroupIndexer.run(); + groupIndexedCounter.assertReindexOf(expectedGroups); + } finally { + groupIndexEventCounterHandle.remove(); + } + } + private void assertStaleGroupAndReindex(AccountGroup.UUID groupUuid) throws IOException { // Evict group from cache to be sure that we use the index state for staleness checks. groupCache.evict(groupUuid);