Merge branch 'stable-3.12' * stable-3.12: Fix pull replication filtering for deleted refs Revert "Do not filter out refs removals when filtering pull-replication fetches" Change-Id: Ibd5c2ad554808bcb11e6e6a62c8fe328a5777b37
diff --git a/README.md b/README.md index 2e13f45..87d2dac 100644 --- a/README.md +++ b/README.md
@@ -1,4 +1,11 @@ -# Gerrit multi-site plugin +# DEPRECATION NOTICE + +GerritForge has decided to [change the license to BSL](https://gitenterprise.me/2025/09/30/re-licensing-gerritforge-plugins-welcome-to-gerrit-enterprise/) +therefore the Apache 2.0 version of this plugin is deprecated. +The recommended version of the multi-site plugin is on [GitHub](https://github.com/GerritForge/multi-site) +and the development continues on [GerritHub.io](https://review.gerrithub.io/admin/repos/GerritForge/multi-site,general). + +# Gerrit multi-site plugin (DEPRECATED) This plugin allows to deploy a distributed cluster of multiple Gerrit masters each using a separate site without sharing any storage. The alignment between
diff --git a/setup_local_env/setup.sh b/setup_local_env/setup.sh index d7ab200..2fd8f42 100755 --- a/setup_local_env/setup.sh +++ b/setup_local_env/setup.sh
@@ -16,7 +16,7 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -GERRIT_BRANCH=stable-3.12 +GERRIT_BRANCH=master GERRIT_CI=https://gerrit-ci.gerritforge.com/view/Plugins-$GERRIT_BRANCH/job LAST_BUILD=lastSuccessfulBuild/artifact/bazel-bin/plugins
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java index 1be09aa..e6f3533 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java
@@ -22,20 +22,34 @@ import com.google.common.base.MoreObjects; import com.google.common.base.Strings; import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableList; import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.spi.Message; +import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexAccountHandler; +import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexChangeHandler; +import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexGroupHandler; +import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexProjectHandler; +import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler; +import com.googlesource.gerrit.plugins.multisite.forwarder.events.AccountIndexEvent; +import com.googlesource.gerrit.plugins.multisite.forwarder.events.ChangeIndexEvent; +import com.googlesource.gerrit.plugins.multisite.forwarder.events.GroupIndexEvent; +import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent; +import com.googlesource.gerrit.plugins.multisite.forwarder.events.ProjectIndexEvent; import java.io.IOException; import java.time.Duration; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Random; +import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.storage.file.FileBasedConfig; @@ -83,8 +97,8 @@ private final Config multiSiteConfig; private final Supplier<Duration> replicationLagRefreshInterval; private final Supplier<Boolean> replicationLagEnabled; - private final Supplier<Boolean> pushReplicationFilterEnabled; - private final Supplier<Boolean> pullReplicationFilterEnabled; + private Supplier<Boolean> pushReplicationFilterEnabled; + private Supplier<Boolean> pullReplicationFilterEnabled; private final Supplier<Long> localRefLockTimeoutMsec; @Inject @@ -122,10 +136,10 @@ replicationLagEnabled = memoize( () -> - lazyMultiSiteCfg - .get() - .getBoolean(REF_DATABASE, null, REPLICATION_LAG_ENABLED, true)); - + !pullReplicationFilterEnabled.get() + && lazyMultiSiteCfg + .get() + .getBoolean(REF_DATABASE, null, REPLICATION_LAG_ENABLED, true)); pushReplicationFilterEnabled = memoize( () -> @@ -194,10 +208,18 @@ return pushReplicationFilterEnabled.get(); } - public boolean pullRepllicationFilterEnabled() { + public void disablePushReplicationFilter() { + pushReplicationFilterEnabled = Suppliers.ofInstance(false); + } + + public boolean pullReplicationFilterEnabled() { return pullReplicationFilterEnabled.get(); } + public void disablePullReplicationFilter() { + pullReplicationFilterEnabled = Suppliers.ofInstance(false); + } + public long localRefLockTimeoutMsec() { return localRefLockTimeoutMsec.get(); } @@ -221,9 +243,9 @@ null, SharedRefDbConfiguration.SharedRefDatabase.ENABLE_KEY, true); - if (cfg instanceof FileBasedConfig) { + if (cfg instanceof FileBasedConfig fileBasedConfig) { try { - ((FileBasedConfig) cfg).save(); + fileBasedConfig.save(); } catch (IOException e) { throw new IllegalStateException("Error while enabling global-refdb by default", e); } @@ -233,10 +255,9 @@ } private Supplier<Config> lazyLoad(Config config) { - if (config instanceof FileBasedConfig) { + if (config instanceof FileBasedConfig fileConfig) { return memoize( () -> { - FileBasedConfig fileConfig = (FileBasedConfig) config; String fileConfigFileName = fileConfig.getFile().getPath(); try { log.info("Loading configuration from {}", fileConfigFileName); @@ -251,8 +272,7 @@ } private Supplier<Collection<Message>> lazyValidateReplicatioConfig(Config replicationConfig) { - if (replicationConfig instanceof FileBasedConfig) { - FileBasedConfig fileConfig = (FileBasedConfig) replicationConfig; + if (replicationConfig instanceof FileBasedConfig fileConfig) { try { fileConfig.load(); return memoize(() -> validateReplicationConfig(replicationConfig)); @@ -357,11 +377,12 @@ } } - public static class Index extends Forwarding { + public static class Index { static final String INDEX_SECTION = "index"; static final String MAX_TRIES_KEY = "maxTries"; static final String RETRY_INTERVAL_KEY = "retryInterval"; static final String SYNCHRONIZE_FORCED_KEY = "synchronizeForced"; + static final String SYNCHRONIZE_KEY = "synchronize"; static final boolean DEFAULT_SYNCHRONIZE_FORCED = true; private final int threadPoolSize; @@ -369,10 +390,39 @@ private final int maxTries; private final int numStripedLocks; + private final Map<String, Class<? extends ForwardedIndexingHandler<?, ? extends IndexEvent>>> + synchronize; private final boolean synchronizeForced; + private static final Map< + String, Class<? extends ForwardedIndexingHandler<?, ? extends IndexEvent>>> + SYNCHRONIZE_ALL_EVENTS_HANDLERS = + Map.of( + ChangeIndexEvent.TYPE, ForwardedIndexChangeHandler.class, + GroupIndexEvent.TYPE, ForwardedIndexGroupHandler.class, + AccountIndexEvent.TYPE, ForwardedIndexAccountHandler.class, + ProjectIndexEvent.TYPE, ForwardedIndexProjectHandler.class); + + public Map<String, Class<? extends ForwardedIndexingHandler<?, ? extends IndexEvent>>> + getSynchronizeIndex(Supplier<Config> cfg) { + Set<String> syncIndexTypes = + Arrays.stream(cfg.get().getStringList(INDEX_SECTION, null, SYNCHRONIZE_KEY)) + .map(String::toLowerCase) + .collect(Collectors.toSet()); + + if (syncIndexTypes.contains("false")) { + return Map.of(); + } + + Map<String, Class<? extends ForwardedIndexingHandler<?, ? extends IndexEvent>>> synchIndex = + SYNCHRONIZE_ALL_EVENTS_HANDLERS.entrySet().stream() + .filter(entry -> syncIndexTypes.contains(entry.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + return synchIndex.isEmpty() ? SYNCHRONIZE_ALL_EVENTS_HANDLERS : synchIndex; + } + private Index(Supplier<Config> cfg) { - super(cfg, INDEX_SECTION); threadPoolSize = getInt(cfg, INDEX_SECTION, null, THREAD_POOL_SIZE_KEY, DEFAULT_THREAD_POOL_SIZE); retryInterval = @@ -382,6 +432,7 @@ getInt(cfg, INDEX_SECTION, null, NUM_STRIPED_LOCKS, DEFAULT_NUM_STRIPED_LOCKS); synchronizeForced = getBoolean(cfg, INDEX_SECTION, null, SYNCHRONIZE_FORCED_KEY, DEFAULT_SYNCHRONIZE_FORCED); + synchronize = getSynchronizeIndex(cfg); } public int threadPoolSize() { @@ -403,6 +454,11 @@ public boolean synchronizeForced() { return synchronizeForced; } + + public Map<String, Class<? extends ForwardedIndexingHandler<?, ? extends IndexEvent>>> + synchronize() { + return synchronize; + } } public static class Broker {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java index c161a6d..0e5ae15 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java
@@ -54,14 +54,14 @@ if (config.event().synchronize()) { brokerRouterNeeded = true; } - if (config.index().synchronize()) { + if (!config.index().synchronize().isEmpty()) { install(new IndexModule()); brokerRouterNeeded = true; } if (brokerRouterNeeded) { install(new BrokerModule()); - install(new RouterModule()); + install(new RouterModule(config.index())); } } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java index 3ced8c6..dd0b98d 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java
@@ -53,7 +53,7 @@ @Override protected void configure() { - if (config.index().synchronize() + if (!config.index().synchronize().isEmpty() || config.cache().synchronize() || config.event().synchronize()) { install(new EventModule(config)); @@ -86,16 +86,20 @@ ImmutableList.Builder<AbstractModule> filterModulesBuilder = ImmutableList.builder(); if (config.pushReplicationFilterEnabled()) { - bindReplicationFilterClass(PUSH_REPLICATION_FILTER_MODULE, filterModulesBuilder); + if (!bindReplicationFilterClass(PUSH_REPLICATION_FILTER_MODULE, filterModulesBuilder)) { + config.disablePushReplicationFilter(); + } } - if (config.pullRepllicationFilterEnabled()) { - bindReplicationFilterClass(PULL_REPLICATION_FILTER_MODULE, filterModulesBuilder); + if (config.pullReplicationFilterEnabled()) { + if (!bindReplicationFilterClass(PULL_REPLICATION_FILTER_MODULE, filterModulesBuilder)) { + config.disablePullReplicationFilter(); + } } return filterModulesBuilder.build(); } - private void bindReplicationFilterClass( + private boolean bindReplicationFilterClass( String filterClassName, ImmutableList.Builder<AbstractModule> filterModulesBuilder) { try { @SuppressWarnings("unchecked") @@ -106,9 +110,11 @@ parentInjector.createChildInjector(filterModule); filterModulesBuilder.add(filterModule); + return true; } catch (NoClassDefFoundError | ClassNotFoundException e) { log.atWarning().withCause(e).log( "Not loading %s because of missing the associated replication plugin", filterClassName); + return false; } catch (Exception e) { throw new ProvisionException( "Unable to instantiate replication filter " + filterClassName, e);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/BatchIndexEventSubscriber.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/BatchIndexEventSubscriber.java index 15d756b..045aded 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/BatchIndexEventSubscriber.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/BatchIndexEventSubscriber.java
@@ -51,11 +51,11 @@ @Override protected Boolean shouldConsumeEvent(Event event) { - if (event instanceof ChangeIndexEvent) { - return projectsFilter.matches(((ChangeIndexEvent) event).projectName); + if (event instanceof ChangeIndexEvent changeIndexEvent) { + return projectsFilter.matches(changeIndexEvent.projectName); } - if (event instanceof ProjectIndexEvent) { - return projectsFilter.matches(((ProjectIndexEvent) event).projectName); + if (event instanceof ProjectIndexEvent projectIndexEvent) { + return projectsFilter.matches(projectIndexEvent.projectName); } return true; }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/IndexEventSubscriber.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/IndexEventSubscriber.java index a632618..7220cd5 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/IndexEventSubscriber.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/IndexEventSubscriber.java
@@ -57,16 +57,15 @@ @Override protected Boolean shouldConsumeEvent(Event event) { - if (event instanceof ChangeIndexEvent) { - ChangeIndexEvent changeIndexEvent = (ChangeIndexEvent) event; + if (event instanceof ChangeIndexEvent changeIndexEvent) { String projectName = changeIndexEvent.projectName; if (isDeletedChangeWithEmptyProject(changeIndexEvent)) { projectName = findProjectFromChangeId(changeIndexEvent.changeId).orElse(projectName); } return projectsFilter.matches(projectName); } - if (event instanceof ProjectIndexEvent) { - return projectsFilter.matches(((ProjectIndexEvent) event).projectName); + if (event instanceof ProjectIndexEvent projectIndexEvent) { + return projectsFilter.matches(projectIndexEvent.projectName); } return true; }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/StreamEventSubscriber.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/StreamEventSubscriber.java index 63fc29a..3450c38 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/StreamEventSubscriber.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/StreamEventSubscriber.java
@@ -50,8 +50,8 @@ @Override protected Boolean shouldConsumeEvent(Event event) { - if (event instanceof ProjectEvent) { - return projectsFilter.matches(((ProjectEvent) event).getProjectNameKey().get()); + if (event instanceof ProjectEvent projectEvent) { + return projectsFilter.matches(projectEvent.getProjectNameKey().get()); } return true; }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java index ef71862..2801d5b 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java
@@ -144,9 +144,7 @@ || event instanceof RefUpdatedEvent) { ProjectEvent projectEvent = (ProjectEvent) event; replicationStatus.updateReplicationLag(projectEvent.getProjectNameKey()); - } else if (event instanceof ProjectDeletionReplicationSucceededEvent) { - ProjectDeletionReplicationSucceededEvent projectDeletion = - (ProjectDeletionReplicationSucceededEvent) event; + } else if (event instanceof ProjectDeletionReplicationSucceededEvent projectDeletion) { replicationStatus.removeProjectFromReplicationLagMetrics(projectDeletion.getProjectNameKey()); } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexAccountHandler.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexAccountHandler.java index 5212aa4..6d5e7bd 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexAccountHandler.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexAccountHandler.java
@@ -14,12 +14,15 @@ package com.googlesource.gerrit.plugins.multisite.forwarder; +import static com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler.Operation.INDEX; + import com.google.gerrit.entities.Account; import com.google.gerrit.server.index.account.AccountIndexer; import com.google.inject.Inject; import com.google.inject.Singleton; import com.googlesource.gerrit.plugins.multisite.Configuration; import com.googlesource.gerrit.plugins.multisite.forwarder.events.AccountIndexEvent; +import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent; import java.io.IOException; import java.util.HashMap; import java.util.Map; @@ -48,6 +51,13 @@ } @Override + public void handle(IndexEvent sourceEvent) throws IOException { + if (sourceEvent instanceof AccountIndexEvent accountIndexEvent) { + indexAsync(Account.id(accountIndexEvent.accountId), INDEX); + } + } + + @Override protected void doIndex(Account.Id id, Optional<AccountIndexEvent> event) { indexer.index(id); log.debug("Account {} successfully indexed", id);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandler.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandler.java index 8a52eb5..8e98359 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandler.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandler.java
@@ -14,6 +14,9 @@ package com.googlesource.gerrit.plugins.multisite.forwarder; +import static com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler.Operation.DELETE; +import static com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler.Operation.INDEX; + import com.google.common.base.Splitter; import com.google.gerrit.entities.Change; import com.google.gerrit.entities.Project; @@ -25,9 +28,11 @@ import com.google.inject.Singleton; import com.googlesource.gerrit.plugins.multisite.Configuration; import com.googlesource.gerrit.plugins.multisite.forwarder.events.ChangeIndexEvent; +import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent; import com.googlesource.gerrit.plugins.multisite.index.ChangeChecker; import com.googlesource.gerrit.plugins.multisite.index.ChangeCheckerImpl; import com.googlesource.gerrit.plugins.multisite.index.ForwardedIndexExecutor; +import java.io.IOException; import java.util.Optional; import java.util.concurrent.ScheduledExecutorService; @@ -56,8 +61,24 @@ } @Override + public void handle(IndexEvent sourceEvent) throws IOException { + if (sourceEvent instanceof ChangeIndexEvent changeIndexEvent) { + ForwardedIndexingHandler.Operation operation = changeIndexEvent.deleted ? DELETE : INDEX; + index( + changeIndexEvent.projectName + "~" + changeIndexEvent.changeId, + operation, + Optional.of(changeIndexEvent)); + } + } + + @Override protected void doIndex(String id, Optional<ChangeIndexEvent> indexEvent) { - scheduleIndexing(id, indexEvent, this::indexIfConsistent); + if (indexEvent.isPresent() + && ChangeIndexEvent.isAllChangesDeletedForProject(indexEvent.get())) { + indexer.deleteAllForProject(Project.nameKey(indexEvent.get().projectName)); + } else { + scheduleIndexing(id, indexEvent, this::indexIfConsistent); + } } private void indexIfConsistent(String id) { @@ -104,28 +125,6 @@ } } - /** - * Deletes all change index entries associated with the given project. - * - * <p>This method is invoked when a project-wide deletion event is received from a peer in a - * multi-site setup. It removes all changes for the specified project from the local index. - * - * <p>The method temporarily marks the execution context as a forwarded event to prevent the - * resulting index updates from being re-forwarded to other peers, which would otherwise create - * event loops. - * - * @param projectName the name of the project whose changes should be removed from the index - */ - public void deleteAllForProject(String projectName) { - try { - Context.setForwardedEvent(true); - log.debug("Deleting all change indexes for project {}", projectName); - indexer.deleteAllForProject(Project.nameKey(projectName)); - } finally { - Context.unsetForwardedEvent(); - } - } - @Override protected void reindex(String id) { try (ManualRequestContext ctx = oneOffCtx.open()) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexGroupHandler.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexGroupHandler.java index d05405f..953be7b 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexGroupHandler.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexGroupHandler.java
@@ -14,6 +14,8 @@ package com.googlesource.gerrit.plugins.multisite.forwarder; +import static com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler.Operation.INDEX; + import com.google.gerrit.entities.AccountGroup; import com.google.gerrit.server.index.group.GroupIndexer; import com.google.gerrit.server.util.OneOffRequestContext; @@ -21,8 +23,10 @@ import com.google.inject.Singleton; import com.googlesource.gerrit.plugins.multisite.Configuration; import com.googlesource.gerrit.plugins.multisite.forwarder.events.GroupIndexEvent; +import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent; import com.googlesource.gerrit.plugins.multisite.index.ForwardedIndexExecutor; import com.googlesource.gerrit.plugins.multisite.index.GroupChecker; +import java.io.IOException; import java.util.Optional; import java.util.concurrent.ScheduledExecutorService; @@ -51,6 +55,13 @@ } @Override + public void handle(IndexEvent sourceEvent) throws IOException { + if (sourceEvent instanceof GroupIndexEvent groupIndexEvent) { + index(groupIndexEvent.groupUUID, INDEX, Optional.of(groupIndexEvent)); + } + } + + @Override protected void doIndex(String uuid, Optional<GroupIndexEvent> event) { scheduleIndexing(uuid, event, this::reindex); }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexProjectHandler.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexProjectHandler.java index 2054f10..191e273 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexProjectHandler.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexProjectHandler.java
@@ -14,15 +14,19 @@ package com.googlesource.gerrit.plugins.multisite.forwarder; +import static com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler.Operation.INDEX; + import com.google.gerrit.entities.Project; import com.google.gerrit.index.project.ProjectIndexer; import com.google.gerrit.server.util.OneOffRequestContext; import com.google.inject.Inject; import com.google.inject.Singleton; import com.googlesource.gerrit.plugins.multisite.Configuration; +import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent; import com.googlesource.gerrit.plugins.multisite.forwarder.events.ProjectIndexEvent; import com.googlesource.gerrit.plugins.multisite.index.ForwardedIndexExecutor; import com.googlesource.gerrit.plugins.multisite.index.ProjectChecker; +import java.io.IOException; import java.util.Optional; import java.util.concurrent.ScheduledExecutorService; @@ -51,6 +55,13 @@ } @Override + public void handle(IndexEvent sourceEvent) throws IOException { + if (sourceEvent instanceof ProjectIndexEvent projectIndexEvent) { + index(projectIndexEvent.projectName, INDEX, Optional.of(projectIndexEvent)); + } + } + + @Override protected void doIndex(String projectName, Optional<ProjectIndexEvent> event) { scheduleIndexing(projectName, event, this::reindex); }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexingHandler.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexingHandler.java index de6b836..a6440e4 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexingHandler.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexingHandler.java
@@ -15,6 +15,7 @@ package com.googlesource.gerrit.plugins.multisite.forwarder; import com.google.common.util.concurrent.Striped; +import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent; import java.io.IOException; import java.util.Optional; import java.util.concurrent.locks.Lock; @@ -40,6 +41,8 @@ } } + public abstract void handle(IndexEvent sourceEvent) throws IOException; + private final Striped<Lock> idLocks; protected abstract void doIndex(T id, Optional<E> indexEvent);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/AccountIndexEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/AccountIndexEvent.java index 065ef7e..31333e7 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/AccountIndexEvent.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/AccountIndexEvent.java
@@ -17,7 +17,7 @@ import com.google.common.base.Objects; public class AccountIndexEvent extends IndexEvent { - static final String TYPE = "account-index"; + public static final String TYPE = "account-index"; public int accountId;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ChangeIndexEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ChangeIndexEvent.java index af4c0bc..3acd288 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ChangeIndexEvent.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ChangeIndexEvent.java
@@ -21,7 +21,7 @@ import java.time.format.DateTimeFormatter; public class ChangeIndexEvent extends IndexEvent { - static final String TYPE = "change-index"; + public static final String TYPE = "change-index"; private static final int ALL_CHANGES_FOR_PROJECT = 0; public String projectName;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/GroupIndexEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/GroupIndexEvent.java index 05ac198..63adeb6 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/GroupIndexEvent.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/GroupIndexEvent.java
@@ -19,7 +19,7 @@ import org.eclipse.jgit.lib.ObjectId; public class GroupIndexEvent extends IndexEvent { - static final String TYPE = "group-index"; + public static final String TYPE = "group-index"; public final String groupUUID; public final ObjectId sha1;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectIndexEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectIndexEvent.java index 954befb..00cca2e 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectIndexEvent.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectIndexEvent.java
@@ -17,7 +17,7 @@ import com.google.common.base.Objects; public class ProjectIndexEvent extends IndexEvent { - static final String TYPE = "project-index"; + public static final String TYPE = "project-index"; public String projectName;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/IndexEventRouter.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/IndexEventRouter.java index a23ca33..238db51 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/IndexEventRouter.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/IndexEventRouter.java
@@ -14,12 +14,13 @@ package com.googlesource.gerrit.plugins.multisite.forwarder.router; -import static com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler.Operation.DELETE; +import static com.google.gerrit.extensions.registration.PluginName.GERRIT; import static com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler.Operation.INDEX; import com.google.common.flogger.FluentLogger; import com.google.gerrit.entities.Account; import com.google.gerrit.extensions.events.LifecycleListener; +import com.google.gerrit.extensions.registration.DynamicMap; import com.google.gerrit.server.config.AllUsersName; import com.google.gerrit.server.config.GerritInstanceId; import com.google.gerrit.server.events.Event; @@ -27,15 +28,8 @@ import com.google.gerrit.server.events.RefEvent; import com.google.inject.Inject; import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexAccountHandler; -import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexChangeHandler; -import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexGroupHandler; -import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexProjectHandler; import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler; -import com.googlesource.gerrit.plugins.multisite.forwarder.events.AccountIndexEvent; -import com.googlesource.gerrit.plugins.multisite.forwarder.events.ChangeIndexEvent; -import com.googlesource.gerrit.plugins.multisite.forwarder.events.GroupIndexEvent; import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent; -import com.googlesource.gerrit.plugins.multisite.forwarder.events.ProjectIndexEvent; import java.io.IOException; import java.util.Optional; import java.util.Set; @@ -45,55 +39,30 @@ private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private final ForwardedIndexAccountHandler indexAccountHandler; - private final ForwardedIndexChangeHandler indexChangeHandler; - private final ForwardedIndexGroupHandler indexGroupHandler; - private final ForwardedIndexProjectHandler indexProjectHandler; private final AllUsersName allUsersName; private final String gerritInstanceId; + private final DynamicMap<ForwardedIndexingHandler<?, ? extends IndexEvent>> indexHandlers; @Inject public IndexEventRouter( ForwardedIndexAccountHandler indexAccountHandler, - ForwardedIndexChangeHandler indexChangeHandler, - ForwardedIndexGroupHandler indexGroupHandler, - ForwardedIndexProjectHandler indexProjectHandler, + DynamicMap<ForwardedIndexingHandler<?, ? extends IndexEvent>> indexHandlers, AllUsersName allUsersName, @GerritInstanceId String gerritInstanceId) { this.indexAccountHandler = indexAccountHandler; - this.indexChangeHandler = indexChangeHandler; - this.indexGroupHandler = indexGroupHandler; - this.indexProjectHandler = indexProjectHandler; + this.indexHandlers = indexHandlers; this.allUsersName = allUsersName; this.gerritInstanceId = gerritInstanceId; } @Override public void route(IndexEvent sourceEvent) throws IOException { - if (sourceEvent instanceof ChangeIndexEvent) { - ChangeIndexEvent changeIndexEvent = (ChangeIndexEvent) sourceEvent; - - if (ChangeIndexEvent.isAllChangesDeletedForProject(changeIndexEvent)) { - indexChangeHandler.deleteAllForProject(changeIndexEvent.projectName); - } else { - ForwardedIndexingHandler.Operation operation = changeIndexEvent.deleted ? DELETE : INDEX; - indexChangeHandler.index( - changeIndexEvent.projectName + "~" + changeIndexEvent.changeId, - operation, - Optional.of(changeIndexEvent)); - } - } else if (sourceEvent instanceof AccountIndexEvent) { - AccountIndexEvent accountIndexEvent = (AccountIndexEvent) sourceEvent; - indexAccountHandler.indexAsync(Account.id(accountIndexEvent.accountId), INDEX); - } else if (sourceEvent instanceof GroupIndexEvent) { - GroupIndexEvent groupIndexEvent = (GroupIndexEvent) sourceEvent; - indexGroupHandler.index(groupIndexEvent.groupUUID, INDEX, Optional.of(groupIndexEvent)); - } else if (sourceEvent instanceof ProjectIndexEvent) { - ProjectIndexEvent projectIndexEvent = (ProjectIndexEvent) sourceEvent; - indexProjectHandler.index( - projectIndexEvent.projectName, INDEX, Optional.of(projectIndexEvent)); + ForwardedIndexingHandler<?, ? extends IndexEvent> handler = + indexHandlers.get(GERRIT, sourceEvent.getType()); + if (handler != null) { + handler.handle(sourceEvent); } else { - throw new UnsupportedOperationException( - String.format("Cannot route event %s", sourceEvent.getType())); + logger.atInfo().log("No registered handlers to route event %s", sourceEvent.getType()); } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/RouterModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/RouterModule.java index 2193034..b5af428 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/RouterModule.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/RouterModule.java
@@ -14,17 +14,41 @@ package com.googlesource.gerrit.plugins.multisite.forwarder.router; +import com.google.gerrit.extensions.annotations.Exports; +import com.google.gerrit.extensions.registration.DynamicMap; import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.lifecycle.LifecycleModule; import com.google.gerrit.server.events.EventListener; +import com.google.inject.Inject; import com.google.inject.Scopes; +import com.google.inject.TypeLiteral; +import com.googlesource.gerrit.plugins.multisite.Configuration; +import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler; +import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent; public class RouterModule extends LifecycleModule { + + private final Configuration.Index indexConfig; + + @Inject + public RouterModule(Configuration.Index indexConfig) { + this.indexConfig = indexConfig; + } + + public static final TypeLiteral<ForwardedIndexingHandler<?, ? extends IndexEvent>> INDEX_HANDLER = + new TypeLiteral<>() {}; + @Override protected void configure() { bind(IndexEventRouter.class).in(Scopes.SINGLETON); listener().to(IndexEventRouter.class).in(Scopes.SINGLETON); DynamicSet.bind(binder(), EventListener.class).to(IndexEventRouter.class); + DynamicMap.mapOf(binder(), INDEX_HANDLER); + + indexConfig + .synchronize() + .forEach( + (type, handler) -> bind(INDEX_HANDLER).annotatedWith(Exports.named(type)).to(handler)); bind(CacheEvictionEventRouter.class).in(Scopes.SINGLETON); bind(ProjectListUpdateRouter.class).in(Scopes.SINGLETON);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/index/FetchRefReplicatedEventHandler.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/index/FetchRefReplicatedEventHandler.java index 69cdb06..1e00452 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/index/FetchRefReplicatedEventHandler.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/index/FetchRefReplicatedEventHandler.java
@@ -55,8 +55,7 @@ try { Context.setForwardedEvent(true); - if (event instanceof FetchRefReplicatedEvent && isLocalEvent(event)) { - FetchRefReplicatedEvent fetchRefReplicatedEvent = (FetchRefReplicatedEvent) event; + if (event instanceof FetchRefReplicatedEvent fetchRefReplicatedEvent && isLocalEvent(event)) { // This removal of the ':' prefix is needed because of Issue 426470297 in the // pull-replication plugin // that may leave the deleted refs notification as a ref-spec instead of the deleted
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ValidationModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ValidationModule.java index 958f265..1971c35 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ValidationModule.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ValidationModule.java
@@ -26,9 +26,6 @@ import com.gerritforge.gerrit.globalrefdb.validation.SharedRefDbRefUpdate; import com.gerritforge.gerrit.globalrefdb.validation.SharedRefDbRepository; import com.gerritforge.gerrit.globalrefdb.validation.SharedRefLogger; -import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.CustomSharedRefEnforcementByProject; -import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.DefaultSharedRefEnforcement; -import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.SharedRefEnforcement; import com.google.common.collect.ImmutableSet; import com.google.gerrit.extensions.config.FactoryModule; import com.google.gerrit.extensions.registration.DynamicSet; @@ -69,14 +66,6 @@ ProjectVersionRefUpdate.MULTI_SITE_VERSIONING_VALUE_REF)); install(new RepositoryManagerModule(repoConfig)); - if (cfg.getSharedRefDbConfiguration().getSharedRefDb().getEnforcementRules().isEmpty()) { - bind(SharedRefEnforcement.class).to(DefaultSharedRefEnforcement.class).in(Scopes.SINGLETON); - } else { - bind(SharedRefEnforcement.class) - .to(CustomSharedRefEnforcementByProject.class) - .in(Scopes.SINGLETON); - } - DynamicSet.bind(binder(), ExceptionHook.class).to(SharedRefDbExceptionHook.class); } }
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md index ed72405..95cb2ca 100644 --- a/src/main/resources/Documentation/config.md +++ b/src/main/resources/Documentation/config.md
@@ -42,10 +42,27 @@ Defaults to 10 ```index.synchronize``` -: Whether to synchronize secondary indexes. Set to false when using multi-site - on Gerrit replicas that do not have an index, or when using an external - service such as ElasticSearch. - Defaults to true. +: Controls which types of index events should be synchronized across sites. + It supports the following values: + + - `true`: shortcut for including all index types + - `false`: disable index synchronization + - A list of specific index types to synchronize: + - `change-index` + - `account-index` + - `group-index` + - `project-index` + + Example to synchronize only change and project indexes: + ``` + [index] + synchronize = change-index + synchronize = project-index + ``` + +> NOTE: All unknown index types are ignored. + +Defaults: all index types are enabled. ```index.synchronizeForced``` : Whether to synchronize forced index events. E.g. on-line reindex @@ -95,12 +112,12 @@ : Enable the use of a shared ref-database Defaults: true -```ref-database.pushReplicationFilterClassEnabled``` +```ref-database.pushReplicationFilterEnabled``` : Enable the filtering of push replication events checking their up-to-date status with the global-refdb. Defaults: true -```ref-database.pullReplicationFilterClassEnabled``` +```ref-database.pullReplicationFilterEnabled``` : Enable the filtering of pull replication events checking their up-to-date status with the global-refdb. Defaults: true @@ -115,7 +132,8 @@ updating the `refs/multi-site/version/*` to the _epoch_ timestamp in milliseconds. Please note that the `replication-lag` REST-API is also disabled if this setting is false. - Defaults: true + Defaults: true unless `pullReplicationFilterEnabled` is enabled and the pull-replication plugin + is available, in which case replicationLag is always disabled. ```ref-database.replicationLagRefreshInterval``` : Enable the auto-refresh of the metrics to trace the auto-replication
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/ConfigurationTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/ConfigurationTest.java index 3a24773..4f0d373 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/multisite/ConfigurationTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/ConfigurationTest.java
@@ -65,16 +65,16 @@ @Test public void testGetIndexSynchronize() throws Exception { - assertThat(getConfiguration().index().synchronize()).isEqualTo(DEFAULT_SYNCHRONIZE); + assertThat(getConfiguration().index().synchronize()).isNotEmpty(); globalPluginConfig.setBoolean(INDEX_SECTION, null, SYNCHRONIZE_KEY, false); - assertThat(getConfiguration().index().synchronize()).isFalse(); + assertThat(getConfiguration().index().synchronize()).isEmpty(); globalPluginConfig.setBoolean(INDEX_SECTION, null, SYNCHRONIZE_KEY, true); - assertThat(getConfiguration().index().synchronize()).isTrue(); + assertThat(getConfiguration().index().synchronize()).isNotEmpty(); globalPluginConfig.setString(INDEX_SECTION, null, SYNCHRONIZE_KEY, INVALID_BOOLEAN); - assertThat(getConfiguration().index().synchronize()).isTrue(); + assertThat(getConfiguration().index().synchronize()).isNotEmpty(); } @Test
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetricsTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetricsTest.java index 6a03a6c..191d7fd 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetricsTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetricsTest.java
@@ -57,6 +57,8 @@ @Before public void setup() throws Exception { + Config multiSiteConfig = new Config(); + multiSiteConfig.setBoolean("ref-database", null, "pullReplicationFilterEnabled", false); replicationStatus = new ReplicationStatus( CacheBuilder.newBuilder().build(), @@ -64,7 +66,8 @@ verLogger, projectCache, Executors.newScheduledThreadPool(1), - new com.googlesource.gerrit.plugins.multisite.Configuration(new Config(), new Config()), + new com.googlesource.gerrit.plugins.multisite.Configuration( + multiSiteConfig, new Config()), new DisabledMetricMaker()); metrics = new SubscriberMetrics(metricMaker, replicationStatus); }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/event/IndexEventRouterTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/event/IndexEventRouterTest.java index 8239cf2..7c398f8 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/multisite/event/IndexEventRouterTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/event/IndexEventRouterTest.java
@@ -14,12 +14,14 @@ package com.googlesource.gerrit.plugins.multisite.event; -import static com.google.gerrit.testing.GerritJUnit.assertThrows; +import static com.google.gerrit.extensions.registration.PluginName.GERRIT; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; -import com.google.gerrit.entities.Account; +import com.google.gerrit.extensions.registration.DynamicMap; +import com.google.gerrit.extensions.registration.PrivateInternals_DynamicMapImpl; import com.google.gerrit.server.config.AllUsersName; +import com.google.inject.util.Providers; import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedEventDispatcher; import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexAccountHandler; import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexChangeHandler; @@ -34,7 +36,6 @@ import com.googlesource.gerrit.plugins.multisite.forwarder.router.IndexEventRouter; import com.googlesource.gerrit.plugins.multisite.forwarder.router.StreamEventRouter; import com.googlesource.gerrit.plugins.replication.events.RefReplicationDoneEvent; -import java.util.Optional; import org.eclipse.jgit.lib.ObjectId; import org.junit.Before; import org.junit.Test; @@ -52,17 +53,16 @@ @Mock private ForwardedIndexProjectHandler indexProjectHandler; @Mock private ForwardedEventDispatcher forwardedEventDispatcher; private AllUsersName allUsersName = new AllUsersName("All-Users"); + PrivateInternals_DynamicMapImpl<ForwardedIndexingHandler<?, ? extends IndexEvent>> indexHandlers; @Before public void setUp() { - router = - new IndexEventRouter( - indexAccountHandler, - indexChangeHandler, - indexGroupHandler, - indexProjectHandler, - allUsersName, - INSTANCE_ID); + indexHandlers = (PrivateInternals_DynamicMapImpl) DynamicMap.emptyMap(); + indexHandlers.put(GERRIT, AccountIndexEvent.TYPE, Providers.of(indexAccountHandler)); + indexHandlers.put(GERRIT, GroupIndexEvent.TYPE, Providers.of(indexGroupHandler)); + indexHandlers.put(GERRIT, ChangeIndexEvent.TYPE, Providers.of(indexChangeHandler)); + indexHandlers.put(GERRIT, ProjectIndexEvent.TYPE, Providers.of(indexProjectHandler)); + router = new IndexEventRouter(indexAccountHandler, indexHandlers, allUsersName, INSTANCE_ID); } @Test @@ -70,22 +70,19 @@ final AccountIndexEvent event = new AccountIndexEvent(1, INSTANCE_ID); router.route(event); - verify(indexAccountHandler) - .indexAsync(Account.id(event.accountId), ForwardedIndexingHandler.Operation.INDEX); + verify(indexAccountHandler).handle(event); verifyNoInteractions(indexChangeHandler, indexGroupHandler, indexProjectHandler); } @Test public void streamEventRouterShouldTriggerAccountIndexFlush() throws Exception { - StreamEventRouter streamEventRouter = new StreamEventRouter(forwardedEventDispatcher, router); final AccountIndexEvent event = new AccountIndexEvent(1, INSTANCE_ID); router.route(event); - verify(indexAccountHandler) - .indexAsync(Account.id(event.accountId), ForwardedIndexingHandler.Operation.INDEX); + verify(indexAccountHandler).handle(event); verifyNoInteractions(indexChangeHandler, indexGroupHandler, indexProjectHandler); @@ -100,8 +97,7 @@ final GroupIndexEvent event = new GroupIndexEvent(groupId, ObjectId.zeroId(), INSTANCE_ID); router.route(event); - verify(indexGroupHandler) - .index(groupId, ForwardedIndexingHandler.Operation.INDEX, Optional.of(event)); + verify(indexGroupHandler).handle(event); verifyNoInteractions(indexAccountHandler, indexChangeHandler, indexProjectHandler); } @@ -112,8 +108,7 @@ final ProjectIndexEvent event = new ProjectIndexEvent(projectName, INSTANCE_ID); router.route(event); - verify(indexProjectHandler) - .index(projectName, ForwardedIndexingHandler.Operation.INDEX, Optional.of(event)); + verify(indexProjectHandler).handle(event); verifyNoInteractions(indexAccountHandler, indexChangeHandler, indexGroupHandler); } @@ -123,11 +118,7 @@ final ChangeIndexEvent event = new ChangeIndexEvent("projectName", 3, false, INSTANCE_ID); router.route(event); - verify(indexChangeHandler) - .index( - event.projectName + "~" + event.changeId, - ForwardedIndexingHandler.Operation.INDEX, - Optional.of(event)); + verify(indexChangeHandler).handle(event); verifyNoInteractions(indexAccountHandler, indexGroupHandler, indexProjectHandler); } @@ -137,33 +128,17 @@ final ChangeIndexEvent event = new ChangeIndexEvent("projectName", 3, true, INSTANCE_ID); router.route(event); - verify(indexChangeHandler) - .index( - event.projectName + "~" + event.changeId, - ForwardedIndexingHandler.Operation.DELETE, - Optional.of(event)); + verify(indexChangeHandler).handle(event); verifyNoInteractions(indexAccountHandler, indexGroupHandler, indexProjectHandler); } @Test - public void routerShouldFailForNotRecognisedEvents() throws Exception { + public void routerShouldIgnoreNotRecognisedEvents() throws Exception { final IndexEvent newEventType = new IndexEvent("new-type", INSTANCE_ID) {}; - assertThrows(UnsupportedOperationException.class, () -> router.route(newEventType)); + router.route(newEventType); verifyNoInteractions( indexAccountHandler, indexChangeHandler, indexGroupHandler, indexProjectHandler); } - - @Test - public void routerShouldSendEventsToTheAppropriateHandler_allChangesDeletedForProject() - throws Exception { - ChangeIndexEvent event = - ChangeIndexEvent.allChangesDeletedForProject("projectName", INSTANCE_ID); - router.route(event); - - verify(indexChangeHandler).deleteAllForProject(event.projectName); - - verifyNoInteractions(indexAccountHandler, indexGroupHandler, indexProjectHandler); - } }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerIT.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerIT.java index 6ca1a7a..3233baf 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerIT.java +++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerIT.java
@@ -35,6 +35,7 @@ import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Singleton; +import com.googlesource.gerrit.plugins.multisite.Configuration; import com.googlesource.gerrit.plugins.multisite.ExecutorProvider; import com.googlesource.gerrit.plugins.multisite.cache.CacheModule; import com.googlesource.gerrit.plugins.multisite.forwarder.events.CacheEvictionEvent; @@ -72,11 +73,13 @@ private RegistrationHandle cacheEvictionRegistrationHandle; public static class TestModule extends AbstractModule { + @Inject Configuration config; + @Override protected void configure() { install(new ForwarderModule()); install(new CacheModule(TestForwardingExecutorProvider.class)); - install(new RouterModule()); + install(new RouterModule(config.index())); install(new IndexModule()); SharedRefDbConfiguration sharedRefDbConfig = new SharedRefDbConfiguration(new Config(), "multi-site");
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandlerTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandlerTest.java index 984e39f..7133a0d 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandlerTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandlerTest.java
@@ -203,13 +203,6 @@ verify(indexerMock, times(1)).index(any(ChangeNotes.class)); } - @Test - public void shouldDeleteAllForProject() { - handler.deleteAllForProject(TEST_PROJECT); - - verify(indexerMock, times(1)).deleteAllForProject(Project.nameKey(TEST_PROJECT)); - } - private void setupChangeAccessRelatedMocks(boolean changeExist, boolean changeUpToDate) throws Exception { setupChangeAccessRelatedMocks(
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/http/ReplicationStatusServletIT.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/http/ReplicationStatusServletIT.java index f940fc4..f11ee26 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/multisite/http/ReplicationStatusServletIT.java +++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/http/ReplicationStatusServletIT.java
@@ -17,6 +17,7 @@ import static com.google.common.net.HttpHeaders.CONTENT_TYPE; import static com.google.common.truth.Truth.assertThat; import static com.googlesource.gerrit.plugins.multisite.http.HttpModule.LAG_ENDPOINT_SEGMENT; +import static org.junit.Assume.assumeTrue; import com.gerritforge.gerrit.globalrefdb.validation.Log4jSharedRefLogger; import com.gerritforge.gerrit.globalrefdb.validation.SharedRefDbConfiguration; @@ -32,6 +33,7 @@ import com.google.inject.Inject; import com.google.inject.Scopes; import com.google.inject.multibindings.OptionalBinder; +import com.googlesource.gerrit.plugins.multisite.Configuration; import com.googlesource.gerrit.plugins.multisite.Log4jProjectVersionLogger; import com.googlesource.gerrit.plugins.multisite.ProjectVersionLogger; import com.googlesource.gerrit.plugins.multisite.cache.CacheModule; @@ -57,15 +59,17 @@ private static final String LAG_ENDPOINT = String.format("/plugins/multi-site/%s", LAG_ENDPOINT_SEGMENT); private ReplicationStatus replicationStatus; + private Configuration multiSiteConfig; public static class TestModule extends AbstractModule { @Inject WorkQueue workQueue; + @Inject Configuration config; @Override protected void configure() { install(new ForwarderModule()); install(new CacheModule()); - install(new RouterModule()); + install(new RouterModule(config.index())); install(new IndexModule()); install(new ReplicationStatusModule(workQueue)); SharedRefDbConfiguration sharedRefDbConfig = @@ -83,11 +87,13 @@ @Before public void setUp() throws IOException { replicationStatus = plugin.getSysInjector().getInstance(ReplicationStatus.class); + multiSiteConfig = plugin.getSysInjector().getInstance(Configuration.class); } @Test @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId") public void shouldSucceedForAdminUsers() throws Exception { + assumeReplicationLagEnabled(); RestResponse result = adminRestSession.get(LAG_ENDPOINT); result.assertOK(); @@ -97,6 +103,7 @@ @Test @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId") public void shouldFailWhenUserHasNoAdminServerCapability() throws Exception { + assumeReplicationLagEnabled(); RestResponse result = userRestSession.get(LAG_ENDPOINT); result.assertForbidden(); assertThat(result.getEntityContent()).contains("not permitted"); @@ -105,6 +112,7 @@ @Test @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId") public void shouldReturnCurrentProjectLag() throws Exception { + assumeReplicationLagEnabled(); replicationStatus.doUpdateLag(Project.nameKey("foo"), 123L); RestResponse result = adminRestSession.get(LAG_ENDPOINT); @@ -116,6 +124,7 @@ @Test @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId") public void shouldReturnProjectsOrderedDescendinglyByLag() throws Exception { + assumeReplicationLagEnabled(); replicationStatus.doUpdateLag(Project.nameKey("bar"), 123L); replicationStatus.doUpdateLag(Project.nameKey("foo"), 3L); replicationStatus.doUpdateLag(Project.nameKey("baz"), 52300L); @@ -129,6 +138,7 @@ @Test @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId") public void shouldHonourTheLimitParameter() throws Exception { + assumeReplicationLagEnabled(); replicationStatus.doUpdateLag(Project.nameKey("bar"), 1L); replicationStatus.doUpdateLag(Project.nameKey("foo"), 2L); replicationStatus.doUpdateLag(Project.nameKey("baz"), 3L); @@ -142,4 +152,10 @@ private String contentWithoutMagicJson(RestResponse response) throws IOException { return response.getEntityContent().substring(RestApiServlet.JSON_MAGIC.length); } + + private void assumeReplicationLagEnabled() { + assumeTrue( + "Replication status skipped as replication lag is disabled", + multiSiteConfig.replicationLagEnabled()); + } }