Add metric displaying the number of retries required to forward event Change-Id: I2bc7b3f7b942afa46c9d3abf2d8fc6033aa7a0b1
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/Forwarder.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/Forwarder.java index 3854ee3..5d92700 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/Forwarder.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/Forwarder.java
@@ -21,6 +21,34 @@ /** Forward indexing, stream events and cache evictions to the other primary */ public interface Forwarder { + public class Result { + private EventType type; + private boolean result; + private boolean isRecoverable; + + public Result(EventType task, boolean result) { + this(task, result, true); + } + + public Result(EventType type, boolean result, boolean isRecoverable) { + this.type = type; + this.result = result; + this.isRecoverable = isRecoverable; + } + + public EventType getType() { + return type; + } + + public boolean getResult() { + return result; + } + + public boolean isRecoverable() { + return isRecoverable; + } + } + /** * Forward an account indexing event to the other primary. * @@ -29,7 +57,7 @@ * @return {@link CompletableFuture} of true if successful, otherwise {@link CompletableFuture} of * false. */ - CompletableFuture<Boolean> indexAccount(int accountId, IndexEvent indexEvent); + CompletableFuture<Result> indexAccount(int accountId, IndexEvent indexEvent); /** * Forward a change indexing event to the other primary. @@ -40,7 +68,7 @@ * @return {@link CompletableFuture} of true if successful, otherwise {@link CompletableFuture} of * false. */ - CompletableFuture<Boolean> indexChange(String projectName, int changeId, IndexEvent indexEvent); + CompletableFuture<Result> indexChange(String projectName, int changeId, IndexEvent indexEvent); /** * Forward a change indexing event to the other primary using batch index endpoint. @@ -51,7 +79,7 @@ * @return {@link CompletableFuture} of true if successful, otherwise {@link CompletableFuture} of * false. */ - CompletableFuture<Boolean> batchIndexChange( + CompletableFuture<Result> batchIndexChange( String projectName, int changeId, IndexEvent indexEvent); /** @@ -62,7 +90,7 @@ * @return {@link CompletableFuture} of true if successful, otherwise {@link CompletableFuture} of * false. */ - CompletableFuture<Boolean> deleteChangeFromIndex(int changeId, IndexEvent indexEvent); + CompletableFuture<Result> deleteChangeFromIndex(int changeId, IndexEvent indexEvent); /** * Forward a group indexing event to the other primary. @@ -72,7 +100,7 @@ * @return {@link CompletableFuture} of true if successful, otherwise {@link CompletableFuture} of * false. */ - CompletableFuture<Boolean> indexGroup(String uuid, IndexEvent indexEvent); + CompletableFuture<Result> indexGroup(String uuid, IndexEvent indexEvent); /** * Forward a project indexing event to the other primary. @@ -82,7 +110,7 @@ * @return {@link CompletableFuture} of true if successful, otherwise {@link CompletableFuture} of * false. */ - CompletableFuture<Boolean> indexProject(String projectName, IndexEvent indexEvent); + CompletableFuture<Result> indexProject(String projectName, IndexEvent indexEvent); /** * Forward a stream event to the other primary. @@ -91,7 +119,7 @@ * @return {@link CompletableFuture} of true if successful, otherwise {@link CompletableFuture} of * false. */ - CompletableFuture<Boolean> send(Event event); + CompletableFuture<Result> send(Event event); /** * Forward a cache eviction event to the other primary. @@ -101,7 +129,7 @@ * @return {@link CompletableFuture} of true if successful, otherwise {@link CompletableFuture} of * false. */ - CompletableFuture<Boolean> evict(String cacheName, Object key); + CompletableFuture<Result> evict(String cacheName, Object key); /** * Forward an addition to the project list cache to the other primary. @@ -110,7 +138,7 @@ * @return {@link CompletableFuture} of true if successful, otherwise {@link CompletableFuture} of * false. */ - CompletableFuture<Boolean> addToProjectList(String projectName); + CompletableFuture<Result> addToProjectList(String projectName); /** * Forward a removal from the project list cache to the other primary. @@ -119,7 +147,7 @@ * @return {@link CompletableFuture} of true if successful, otherwise {@link CompletableFuture} of * false. */ - CompletableFuture<Boolean> removeFromProjectList(String projectName); + CompletableFuture<Result> removeFromProjectList(String projectName); /** * Forward the removal of all project changes from index to the other primary. @@ -128,5 +156,5 @@ * @return {@link CompletableFuture} of true if successful, otherwise {@link CompletableFuture} of * false. */ - CompletableFuture<Boolean> deleteAllChangesForProject(Project.NameKey projectName); + CompletableFuture<Result> deleteAllChangesForProject(Project.NameKey projectName); }
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwarderMetrics.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwarderMetrics.java index 922e62b..eecef15 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwarderMetrics.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwarderMetrics.java
@@ -16,6 +16,7 @@ import com.google.gerrit.metrics.Counter0; import com.google.gerrit.metrics.Description; +import com.google.gerrit.metrics.Histogram0; import com.google.gerrit.metrics.MetricMaker; import com.google.gerrit.metrics.Timer0; import com.google.inject.assistedinject.Assisted; @@ -27,6 +28,7 @@ private final Timer0 latencyMetric; private final Counter0 failureCounterMetric; private final Counter0 successCounterMetric; + private final Histogram0 retryMetric; public interface Factory { ForwarderMetrics create(EventType eventType); @@ -56,6 +58,11 @@ new Description(String.format("%s events forwarding success count", event)) .setCumulative() .setRate()); + this.retryMetric = + metricMaker.newHistogram( + String.format("forwarding_%s_event/retries", eventType), + new Description(String.format("%s events forwarding retries", eventType)) + .setCumulative()); } public void recordResult(boolean isSuccessful) { @@ -69,4 +76,8 @@ public void recordLatency(long latencyMs) { latencyMetric.record(latencyMs, TimeUnit.MILLISECONDS); } + + public void recordRetries(int retries) { + retryMetric.record(retries); + } }
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwarderModule.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwarderModule.java index 5acb305..f5c5a39 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwarderModule.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwarderModule.java
@@ -26,6 +26,7 @@ bind(AllowedForwardedEventListener.class) .to(ConfigurableAllowedEventListeners.class) .in(Scopes.SINGLETON); + bind(ForwarderMetricsRegistry.class); DynamicItem.bind(binder(), EventDispatcher.class).to(ForwardedAwareEventBroker.class); factory(ForwarderMetrics.Factory.class); bind(ForwarderMetricsRegistry.class).in(Scopes.SINGLETON);
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwarderTask.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwarderTask.java new file mode 100644 index 0000000..f8895e1 --- /dev/null +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwarderTask.java
@@ -0,0 +1,28 @@ +// Copyright (C) 2025 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.ericsson.gerrit.plugins.highavailability.forwarder; + +public enum ForwarderTask { + ADD_TO_PROJECTS_LIST, + BATCH_INDEX_CHANGE, + DELETE_CHANGE_FROM_INDEX, + EVICT_CACHE, + INDEX_ACCOUNT, + INDEX_CHANGE, + INDEX_GROUP, + INDEX_PROJECT, + REMOVE_FROM_PROJECTS_LIST, + SEND_EVENT +}
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/FailsafeExecutorProvider.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/FailsafeExecutorProvider.java index 8f81832..df2ab14 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/FailsafeExecutorProvider.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/FailsafeExecutorProvider.java
@@ -15,6 +15,7 @@ package com.ericsson.gerrit.plugins.highavailability.forwarder.jgroups; import com.ericsson.gerrit.plugins.highavailability.Configuration; +import com.ericsson.gerrit.plugins.highavailability.forwarder.Forwarder.Result; import com.google.common.flogger.FluentLogger; import com.google.gerrit.server.git.WorkQueue; import com.google.inject.Inject; @@ -23,7 +24,7 @@ import dev.failsafe.FailsafeExecutor; import dev.failsafe.RetryPolicy; -public class FailsafeExecutorProvider implements Provider<FailsafeExecutor<Boolean>> { +public class FailsafeExecutorProvider implements Provider<FailsafeExecutor<Result>> { private static final FluentLogger log = FluentLogger.forEnclosingClass(); private final Configuration cfg; private final WorkQueue workQueue; @@ -35,9 +36,9 @@ } @Override - public FailsafeExecutor<Boolean> get() { - RetryPolicy<Boolean> retryPolicy = - RetryPolicy.<Boolean>builder() + public FailsafeExecutor<Result> get() { + RetryPolicy<Result> retryPolicy = + RetryPolicy.<Result>builder() .withMaxAttempts(cfg.jgroups().maxTries()) .withDelay(cfg.jgroups().retryInterval()) .onRetry(e -> log.atFine().log("Retrying event %s", e)) @@ -45,7 +46,7 @@ e -> log.atWarning().log( "%d jgroups retries exceeded for event %s", cfg.jgroups().maxTries(), e)) - .handleResult(false) + .handleResultIf(r -> !r.getResult()) .build(); return Failsafe.with(retryPolicy) .with(workQueue.createQueue(cfg.jgroups().threadPoolSize(), "JGroupsForwarder"));
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarder.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarder.java index 90d70c9..be8bd7c 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarder.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarder.java
@@ -46,7 +46,7 @@ private final MessageDispatcher dispatcher; private final JGroups jgroupsConfig; private final Gson gson; - private final FailsafeExecutor<Boolean> executor; + private final FailsafeExecutor<Result> executor; private final ForwarderMetricsRegistry metricsRegistry; @Inject @@ -54,7 +54,7 @@ MessageDispatcher dispatcher, Configuration cfg, @JGroupsGson Gson gson, - @JGroupsForwarderExecutor FailsafeExecutor<Boolean> executor, + @JGroupsForwarderExecutor FailsafeExecutor<Result> executor, ForwarderMetricsRegistry metricsRegistry) { this.dispatcher = dispatcher; this.jgroupsConfig = cfg.jgroups(); @@ -62,71 +62,75 @@ this.executor = executor; this.metricsRegistry = metricsRegistry; + this.executor.onComplete( + ev -> { + this.metricsRegistry.get(ev.getResult().getType()).recordRetries(ev.getAttemptCount()); + }); } @Override - public CompletableFuture<Boolean> indexAccount(int accountId, IndexEvent indexEvent) { + public CompletableFuture<Result> indexAccount(int accountId, IndexEvent indexEvent) { return execute(new IndexAccount(accountId, indexEvent.eventCreatedOn)); } @Override - public CompletableFuture<Boolean> indexChange( + public CompletableFuture<Result> indexChange( String projectName, int changeId, IndexEvent indexEvent) { return execute(new IndexChange.Update(projectName, changeId, indexEvent.eventCreatedOn)); } @Override - public CompletableFuture<Boolean> batchIndexChange( + public CompletableFuture<Result> batchIndexChange( String projectName, int changeId, IndexEvent indexEvent) { return execute(new IndexChange.BatchUpdate(projectName, changeId, indexEvent.eventCreatedOn)); } @Override - public CompletableFuture<Boolean> deleteChangeFromIndex(int changeId, IndexEvent indexEvent) { + public CompletableFuture<Result> deleteChangeFromIndex(int changeId, IndexEvent indexEvent) { return execute(new IndexChange.Delete(changeId, indexEvent.eventCreatedOn)); } @Override - public CompletableFuture<Boolean> indexGroup(String uuid, IndexEvent indexEvent) { + public CompletableFuture<Result> indexGroup(String uuid, IndexEvent indexEvent) { return execute(new IndexGroup(uuid, indexEvent.eventCreatedOn)); } @Override - public CompletableFuture<Boolean> indexProject(String projectName, IndexEvent indexEvent) { + public CompletableFuture<Result> indexProject(String projectName, IndexEvent indexEvent) { return execute(new IndexProject(projectName, indexEvent.eventCreatedOn)); } @Override - public CompletableFuture<Boolean> send(Event event) { + public CompletableFuture<Result> send(Event event) { return execute(new PostEvent(event, Instant.ofEpochSecond(event.eventCreatedOn))); } @Override - public CompletableFuture<Boolean> evict(String cacheName, Object key) { + public CompletableFuture<Result> evict(String cacheName, Object key) { return execute(new EvictCache(cacheName, gson.toJson(key), Instant.now())); } @Override - public CompletableFuture<Boolean> addToProjectList(String projectName) { + public CompletableFuture<Result> addToProjectList(String projectName) { return execute(new AddToProjectList(projectName, Instant.now())); } @Override - public CompletableFuture<Boolean> removeFromProjectList(String projectName) { + public CompletableFuture<Result> removeFromProjectList(String projectName) { return execute(new RemoveFromProjectList(projectName, Instant.now())); } @Override - public CompletableFuture<Boolean> deleteAllChangesForProject(Project.NameKey projectName) { + public CompletableFuture<Result> deleteAllChangesForProject(Project.NameKey projectName) { return execute(new DeleteAllProjectChangesFromIndex(projectName, Instant.now())); } - private CompletableFuture<Boolean> execute(Command cmd) { + private CompletableFuture<Result> execute(Command cmd) { return executor .getAsync(() -> executeOnce(cmd)) .thenApplyAsync( result -> { - metricsRegistry.get(cmd.type).recordResult(result); + metricsRegistry.get(cmd.type).recordResult(result.getResult()); metricsRegistry .get(cmd.type) .recordLatency(Duration.between(cmd.eventCreatedOn, Instant.now()).toMillis()); @@ -134,14 +138,14 @@ }); } - private boolean executeOnce(Command cmd) { + private Result executeOnce(Command cmd) { String json = gson.toJson(cmd); try { logJGroupsInfo(); if (dispatcher.getChannel().getView().size() < 2) { log.atFine().log("Less than two members in cluster, not sending %s", json); - return false; + return new Result(cmd.type, false); } log.atFine().log("Sending %s", json); @@ -151,7 +155,7 @@ log.atFine().log("Received response list length = %s", list.size()); if (list.isEmpty()) { - return false; + return new Result(cmd.type, false); } for (Entry<Address, Rsp<Object>> e : list.entrySet()) { @@ -160,14 +164,14 @@ log.atWarning().log( "Received a non TRUE response from receiver %s: %s", e.getKey(), e.getValue().getValue()); - return false; + return new Result(cmd.type, false); } } log.atFine().log("Successfully sent message %s", json); - return true; + return new Result(cmd.type, true); } catch (Exception e) { log.atWarning().withCause(e).log("Forwarding %s failed", json); - return false; + return new Result(cmd.type, false); } }
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarderModule.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarderModule.java index dee4a6d..360ba40 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarderModule.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarderModule.java
@@ -15,6 +15,7 @@ package com.ericsson.gerrit.plugins.highavailability.forwarder.jgroups; import com.ericsson.gerrit.plugins.highavailability.forwarder.Forwarder; +import com.ericsson.gerrit.plugins.highavailability.forwarder.Forwarder.Result; import com.ericsson.gerrit.plugins.highavailability.peers.jgroups.JChannelProviderModule; import com.google.gerrit.lifecycle.LifecycleModule; import com.google.gerrit.server.events.EventGson; @@ -38,7 +39,7 @@ install(new JChannelProviderModule()); listener().to(OnStartStop.class); - bind(new TypeLiteral<FailsafeExecutor<Boolean>>() {}) + bind(new TypeLiteral<FailsafeExecutor<Result>>() {}) .annotatedWith(JGroupsForwarderExecutor.class) .toProvider(FailsafeExecutorProvider.class) .in(Scopes.SINGLETON);
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/FailsafeExecutorProvider.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/FailsafeExecutorProvider.java index 8134220..6c27d4b 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/FailsafeExecutorProvider.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/FailsafeExecutorProvider.java
@@ -15,18 +15,18 @@ package com.ericsson.gerrit.plugins.highavailability.forwarder.rest; import com.ericsson.gerrit.plugins.highavailability.Configuration; +import com.ericsson.gerrit.plugins.highavailability.forwarder.Forwarder.Result; import com.google.common.flogger.FluentLogger; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import dev.failsafe.Failsafe; import dev.failsafe.FailsafeExecutor; -import dev.failsafe.Fallback; import dev.failsafe.RetryPolicy; import java.util.concurrent.Executors; @Singleton -public class FailsafeExecutorProvider implements Provider<FailsafeExecutor<Boolean>> { +public class FailsafeExecutorProvider implements Provider<FailsafeExecutor<Result>> { private static final FluentLogger log = FluentLogger.forEnclosingClass(); private final Configuration cfg; @@ -36,10 +36,9 @@ } @Override - public FailsafeExecutor<Boolean> get() { - Fallback<Boolean> fallbackToFalse = Fallback.<Boolean>of(() -> false); - RetryPolicy<Boolean> retryPolicy = - RetryPolicy.<Boolean>builder() + public FailsafeExecutor<Result> get() { + RetryPolicy<Result> retryPolicy = + RetryPolicy.<Result>builder() .withMaxAttempts(cfg.http().maxTries()) .withDelay(cfg.http().retryInterval()) .onRetry(e -> log.atFine().log("Retrying event %s", e)) @@ -47,15 +46,13 @@ e -> log.atWarning().log( "%d http retries exceeded for event %s", cfg.http().maxTries(), e)) - .handleResult(false) - .abortIf( - (r, e) -> - e instanceof ForwardingException && !((ForwardingException) e).isRecoverable()) + .handleResultIf(r -> !r.getResult()) + .abortIf((r, e) -> !r.getResult() && !r.isRecoverable()) .build(); // TODO: the executor shall be created by workQueue.createQueue(...) // However, this currently doesn't work because WorkQueue.Executor doesn't support wrapping of // Callable i.e. it throws an exception on decorateTask(Callable) - return Failsafe.with(fallbackToFalse, retryPolicy) + return Failsafe.with(retryPolicy) .with(Executors.newScheduledThreadPool(cfg.http().threadPoolSize())); } }
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarder.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarder.java index b736185..6d15755 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarder.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarder.java
@@ -58,7 +58,7 @@ private final Configuration cfg; private final Provider<Set<PeerInfo>> peerInfoProvider; private final Gson gson; - private FailsafeExecutor<Boolean> executor; + private FailsafeExecutor<Result> executor; private final ForwarderMetricsRegistry metricsRegistry; @Inject @@ -68,7 +68,7 @@ Configuration cfg, Provider<Set<PeerInfo>> peerInfoProvider, @EventGson Gson gson, - @RestForwarderExecutor FailsafeExecutor<Boolean> executor, + @RestForwarderExecutor FailsafeExecutor<Result> executor, ForwarderMetricsRegistry metricsRegistry) { this.httpSession = httpClient; this.pluginRelativePath = Joiner.on("/").join("plugins", pluginName); @@ -77,10 +77,14 @@ this.gson = gson; this.executor = executor; this.metricsRegistry = metricsRegistry; + this.executor.onComplete( + ev -> { + this.metricsRegistry.get(ev.getResult().getType()).recordRetries(ev.getAttemptCount()); + }); } @Override - public CompletableFuture<Boolean> indexAccount(final int accountId, IndexEvent event) { + public CompletableFuture<Result> indexAccount(final int accountId, IndexEvent event) { return execute( RequestMethod.POST, EventType.INDEX_ACCOUNT_UPDATE, @@ -92,8 +96,7 @@ } @Override - public CompletableFuture<Boolean> indexChange( - String projectName, int changeId, IndexEvent event) { + public CompletableFuture<Result> indexChange(String projectName, int changeId, IndexEvent event) { return execute( RequestMethod.POST, EventType.INDEX_CHANGE_UPDATE, @@ -105,7 +108,7 @@ } @Override - public CompletableFuture<Boolean> batchIndexChange( + public CompletableFuture<Result> batchIndexChange( String projectName, int changeId, IndexEvent event) { return execute( RequestMethod.POST, @@ -118,7 +121,7 @@ } @Override - public CompletableFuture<Boolean> deleteChangeFromIndex(final int changeId, IndexEvent event) { + public CompletableFuture<Result> deleteChangeFromIndex(final int changeId, IndexEvent event) { return execute( RequestMethod.DELETE, EventType.INDEX_CHANGE_DELETION, @@ -130,7 +133,7 @@ } @Override - public CompletableFuture<Boolean> indexGroup(final String uuid, IndexEvent event) { + public CompletableFuture<Result> indexGroup(final String uuid, IndexEvent event) { return execute( RequestMethod.POST, EventType.INDEX_GROUP_UPDATE, @@ -157,7 +160,7 @@ } @Override - public CompletableFuture<Boolean> indexProject(String projectName, IndexEvent event) { + public CompletableFuture<Result> indexProject(String projectName, IndexEvent event) { return execute( RequestMethod.POST, EventType.INDEX_PROJECT_UPDATE, @@ -169,7 +172,7 @@ } @Override - public CompletableFuture<Boolean> send(final Event event) { + public CompletableFuture<Result> send(final Event event) { return execute( RequestMethod.POST, EventType.EVENT_SENT, @@ -181,7 +184,7 @@ } @Override - public CompletableFuture<Boolean> evict(final String cacheName, final Object key) { + public CompletableFuture<Result> evict(final String cacheName, final Object key) { String json = gson.toJson(key); return execute( RequestMethod.POST, @@ -194,7 +197,7 @@ } @Override - public CompletableFuture<Boolean> addToProjectList(String projectName) { + public CompletableFuture<Result> addToProjectList(String projectName) { return execute( RequestMethod.POST, EventType.PROJECT_LIST_ADDITION, @@ -205,7 +208,7 @@ } @Override - public CompletableFuture<Boolean> removeFromProjectList(String projectName) { + public CompletableFuture<Result> removeFromProjectList(String projectName) { return execute( RequestMethod.DELETE, EventType.PROJECT_LIST_DELETION, @@ -216,7 +219,7 @@ } @Override - public CompletableFuture<Boolean> deleteAllChangesForProject(Project.NameKey projectName) { + public CompletableFuture<Result> deleteAllChangesForProject(Project.NameKey projectName) { return execute( RequestMethod.DELETE, EventType.INDEX_CHANGE_DELETION_ALL_OF_PROJECT, @@ -230,7 +233,7 @@ return Joiner.on("/").join("cache", Constants.PROJECT_LIST); } - private CompletableFuture<Boolean> execute( + private CompletableFuture<Result> execute( RequestMethod method, EventType eventType, String action, @@ -240,7 +243,7 @@ return execute(method, eventType, action, endpoint, id, null, requestStart); } - private CompletableFuture<Boolean> execute( + private CompletableFuture<Result> execute( RequestMethod method, EventType eventType, String action, @@ -250,14 +253,19 @@ Instant requestStart) { log.atFine().log("Scheduling forwarding of: %s %s %s", action, id, payload); return peerInfoProvider.get().stream() - .map(peer -> createRequest(method, peer, action, endpoint, id, payload, requestStart)) + .map( + peer -> + createRequest(method, eventType, peer, action, endpoint, id, payload, requestStart)) .map(r -> executor.getAsync(() -> r.execute())) .reduce( - CompletableFuture.completedFuture(true), - (a, b) -> a.thenCombine(b, (left, right) -> left && right)) + CompletableFuture.completedFuture(new Result(eventType, true)), + (a, b) -> + a.thenCombine( + b, + (left, right) -> new Result(eventType, left.getResult() && right.getResult()))) .thenApplyAsync( result -> { - metricsRegistry.get(eventType).recordResult(result); + metricsRegistry.get(eventType).recordResult(result.getResult()); metricsRegistry .get(eventType) .recordLatency(Duration.between(requestStart, Instant.now()).toMillis()); @@ -267,6 +275,7 @@ private Request createRequest( RequestMethod method, + EventType eventType, PeerInfo peer, String action, String endpoint, @@ -274,7 +283,7 @@ Object payload, Instant createdOn) { String destination = peer.getDirectUrl(); - return new Request(action, id, destination) { + return new Request(eventType, action, id, destination) { @Override HttpResult send() throws IOException { String request = Joiner.on("/").join(destination, pluginRelativePath, endpoint, id); @@ -290,13 +299,15 @@ } protected abstract class Request { + private final EventType eventType; private final String action; private final Object key; private final String destination; private int execCnt; - Request(String action, Object key, String destination) { + Request(EventType eventType, String action, Object key, String destination) { + this.eventType = eventType; this.action = action; this.key = key; this.destination = destination; @@ -307,13 +318,13 @@ return String.format("%s:%s => %s (try #%d)", action, key, destination, execCnt); } - boolean execute() throws ForwardingException { + Result execute() { log.atFine().log("Executing %s %s towards %s", action, key, destination); try { execCnt++; tryOnce(); log.atFine().log("%s %s towards %s OK", action, key, destination); - return true; + return new Result(eventType, true); } catch (ForwardingException e) { int maxTries = cfg.http().maxTries(); log.atFine().withCause(e).log( @@ -322,10 +333,10 @@ log.atSevere().withCause(e).log( "%s %s towards %s failed with unrecoverable error; giving up", action, key, destination); - throw e; + return new Result(eventType, false, false); } } - return false; + return new Result(eventType, false); } void tryOnce() throws ForwardingException {
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarderModule.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarderModule.java index 39c9cc0..5d38b16 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarderModule.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarderModule.java
@@ -15,6 +15,7 @@ package com.ericsson.gerrit.plugins.highavailability.forwarder.rest; import com.ericsson.gerrit.plugins.highavailability.forwarder.Forwarder; +import com.ericsson.gerrit.plugins.highavailability.forwarder.Forwarder.Result; import com.google.inject.AbstractModule; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; @@ -29,7 +30,7 @@ bind(HttpSession.class); bind(Forwarder.class).to(RestForwarder.class); - bind(new TypeLiteral<FailsafeExecutor<Boolean>>() {}) + bind(new TypeLiteral<FailsafeExecutor<Result>>() {}) .annotatedWith(RestForwarderExecutor.class) .toProvider(FailsafeExecutorProvider.class) .in(Scopes.SINGLETON);
diff --git a/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarderTest.java b/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarderTest.java index 8dc9f43..39d388c 100644 --- a/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarderTest.java +++ b/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarderTest.java
@@ -23,6 +23,7 @@ import static org.mockito.Mockito.when; import com.ericsson.gerrit.plugins.highavailability.Configuration; +import com.ericsson.gerrit.plugins.highavailability.forwarder.Forwarder.Result; import com.ericsson.gerrit.plugins.highavailability.forwarder.ForwarderMetrics; import com.ericsson.gerrit.plugins.highavailability.forwarder.ForwarderMetricsRegistry; import com.ericsson.gerrit.plugins.highavailability.forwarder.IndexEvent; @@ -94,8 +95,8 @@ RspList<Object> OK = new RspList<>(Map.of(A1, RSP_OK, A2, RSP_OK)); when(dispatcher.castMessage(any(), any(), any())).thenReturn(OK); - CompletableFuture<Boolean> result = forwarder.indexAccount(100, new IndexEvent()); - assertThat(result.get()).isTrue(); + CompletableFuture<Result> result = forwarder.indexAccount(100, new IndexEvent()); + assertThat(result.get().getResult()).isTrue(); verify(dispatcher, times(1)).castMessage(any(), any(), any()); } @@ -106,8 +107,8 @@ RspList<Object> FAIL = new RspList<>(Map.of(A1, RSP_OK, A2, RSP_FAIL)); when(dispatcher.castMessage(any(), any(), any())).thenReturn(FAIL, OK); - CompletableFuture<Boolean> result = forwarder.indexAccount(100, new IndexEvent()); - assertThat(result.get()).isTrue(); + CompletableFuture<Result> result = forwarder.indexAccount(100, new IndexEvent()); + assertThat(result.get().getResult()).isTrue(); verify(dispatcher, times(2)).castMessage(any(), any(), any()); } @@ -118,8 +119,8 @@ // return FAIL x MAX_TRIES when(dispatcher.castMessage(any(), any(), any())).thenReturn(FAIL, FAIL, FAIL); - CompletableFuture<Boolean> result = forwarder.indexAccount(100, new IndexEvent()); - assertThat(result.get()).isFalse(); + CompletableFuture<Result> result = forwarder.indexAccount(100, new IndexEvent()); + assertThat(result.get().getResult()).isFalse(); verify(dispatcher, times(MAX_TRIES)).castMessage(any(), any(), any()); } }
diff --git a/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarderTest.java b/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarderTest.java index 1df4cec..94ff2fb 100644 --- a/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarderTest.java +++ b/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarderTest.java
@@ -145,7 +145,8 @@ assertThat( forwarder .indexAccount(ACCOUNT_NUMBER, new IndexEvent()) - .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isTrue(); } @@ -156,7 +157,8 @@ assertThat( forwarder .indexAccount(ACCOUNT_NUMBER, new IndexEvent()) - .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } @@ -167,7 +169,8 @@ assertThat( forwarder .indexAccount(ACCOUNT_NUMBER, new IndexEvent()) - .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } @@ -175,7 +178,11 @@ public void testIndexGroupOK() throws Exception { when(httpSessionMock.post(eq(INDEX_GROUP_ENDPOINT), any(), any())) .thenReturn(new HttpResult(SUCCESSFUL, EMPTY_MSG)); - assertThat(forwarder.indexGroup(UUID, new IndexEvent()).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + assertThat( + forwarder + .indexGroup(UUID, new IndexEvent()) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isTrue(); } @@ -183,14 +190,22 @@ public void testIndexGroupFailed() throws Exception { when(httpSessionMock.post(eq(INDEX_GROUP_ENDPOINT), any(), any())) .thenReturn(new HttpResult(FAILED, EMPTY_MSG)); - assertThat(forwarder.indexGroup(UUID, new IndexEvent()).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + assertThat( + forwarder + .indexGroup(UUID, new IndexEvent()) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } @Test public void testIndexGroupThrowsException() throws Exception { when(httpSessionMock.post(eq(INDEX_GROUP_ENDPOINT), any(), any())).thenThrow(IOException.class); - assertThat(forwarder.indexGroup(UUID, new IndexEvent()).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + assertThat( + forwarder + .indexGroup(UUID, new IndexEvent()) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } @@ -201,7 +216,8 @@ assertThat( forwarder .indexChange(PROJECT_NAME, CHANGE_NUMBER, new IndexEvent()) - .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isTrue(); } @@ -212,7 +228,8 @@ assertThat( forwarder .indexChange(PROJECT_NAME, CHANGE_NUMBER, new IndexEvent()) - .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } @@ -223,7 +240,8 @@ assertThat( forwarder .indexChange(PROJECT_NAME, CHANGE_NUMBER, new IndexEvent()) - .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } @@ -231,7 +249,11 @@ public void testIndexBatchChangeOK() throws Exception { when(httpSessionMock.post(eq(INDEX_BATCH_CHANGE_ENDPOINT), any(), any())) .thenReturn(new HttpResult(SUCCESSFUL, EMPTY_MSG)); - assertThat(forwarder.batchIndexChange(PROJECT_NAME, CHANGE_NUMBER, new IndexEvent()).get()) + assertThat( + forwarder + .batchIndexChange(PROJECT_NAME, CHANGE_NUMBER, new IndexEvent()) + .get() + .getResult()) .isTrue(); } @@ -239,7 +261,11 @@ public void testIndexBatchChangeFailed() throws Exception { when(httpSessionMock.post(eq(INDEX_BATCH_CHANGE_ENDPOINT), any(), any())) .thenReturn(new HttpResult(FAILED, EMPTY_MSG)); - assertThat(forwarder.batchIndexChange(PROJECT_NAME, CHANGE_NUMBER, new IndexEvent()).get()) + assertThat( + forwarder + .batchIndexChange(PROJECT_NAME, CHANGE_NUMBER, new IndexEvent()) + .get() + .getResult()) .isFalse(); } @@ -247,7 +273,11 @@ public void testIndexBatchChangeThrowsException() throws Exception { when(httpSessionMock.post(eq(INDEX_BATCH_CHANGE_ENDPOINT), any(), any())) .thenThrow(IOException.class); - assertThat(forwarder.batchIndexChange(PROJECT_NAME, CHANGE_NUMBER, new IndexEvent()).get()) + assertThat( + forwarder + .batchIndexChange(PROJECT_NAME, CHANGE_NUMBER, new IndexEvent()) + .get() + .getResult()) .isFalse(); } @@ -258,7 +288,8 @@ assertThat( forwarder .deleteChangeFromIndex(CHANGE_NUMBER, new IndexEvent()) - .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isTrue(); } @@ -269,7 +300,8 @@ assertThat( forwarder .deleteAllChangesForProject(Project.nameKey(PROJECT_NAME)) - .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isTrue(); } @@ -280,7 +312,8 @@ assertThat( forwarder .deleteChangeFromIndex(CHANGE_NUMBER, new IndexEvent()) - .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } @@ -290,7 +323,8 @@ assertThat( forwarder .deleteChangeFromIndex(CHANGE_NUMBER, new IndexEvent()) - .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } @@ -298,20 +332,20 @@ public void testEventSentOK() throws Exception { when(httpSessionMock.post(eq(EVENT_ENDPOINT), eq(event), any())) .thenReturn(new HttpResult(SUCCESSFUL, EMPTY_MSG)); - assertThat(forwarder.send(event).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)).isTrue(); + assertThat(forwarder.send(event).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS).getResult()).isTrue(); } @Test public void testEventSentFailed() throws Exception { when(httpSessionMock.post(eq(EVENT_ENDPOINT), eq(event), any())) .thenReturn(new HttpResult(FAILED, EMPTY_MSG)); - assertThat(forwarder.send(event).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)).isFalse(); + assertThat(forwarder.send(event).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS).getResult()).isFalse(); } @Test public void testEventSentThrowsException() throws Exception { when(httpSessionMock.post(eq(EVENT_ENDPOINT), eq(event), any())).thenThrow(IOException.class); - assertThat(forwarder.send(event).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)).isFalse(); + assertThat(forwarder.send(event).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS).getResult()).isFalse(); } @Test @@ -320,7 +354,11 @@ String keyJson = gson.toJson(key); when(httpSessionMock.post(eq(buildCacheEndpoint(Constants.PROJECTS)), eq(keyJson), any())) .thenReturn(new HttpResult(SUCCESSFUL, EMPTY_MSG)); - assertThat(forwarder.evict(Constants.PROJECTS, key).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + assertThat( + forwarder + .evict(Constants.PROJECTS, key) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isTrue(); } @@ -330,7 +368,11 @@ String keyJson = gson.toJson(key); when(httpSessionMock.post(eq(buildCacheEndpoint(Constants.ACCOUNTS)), eq(keyJson), any())) .thenReturn(new HttpResult(SUCCESSFUL, EMPTY_MSG)); - assertThat(forwarder.evict(Constants.ACCOUNTS, key).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + assertThat( + forwarder + .evict(Constants.ACCOUNTS, key) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isTrue(); } @@ -341,7 +383,11 @@ String endpoint = buildCacheEndpoint(Constants.GROUPS); when(httpSessionMock.post(eq(endpoint), eq(keyJson), any())) .thenReturn(new HttpResult(SUCCESSFUL, EMPTY_MSG)); - assertThat(forwarder.evict(Constants.GROUPS, key).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + assertThat( + forwarder + .evict(Constants.GROUPS, key) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isTrue(); } @@ -353,7 +399,10 @@ eq(buildCacheEndpoint(Constants.GROUPS_BYINCLUDE)), eq(keyJson), any())) .thenReturn(new HttpResult(SUCCESSFUL, EMPTY_MSG)); assertThat( - forwarder.evict(Constants.GROUPS_BYINCLUDE, key).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + forwarder + .evict(Constants.GROUPS_BYINCLUDE, key) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isTrue(); } @@ -363,7 +412,11 @@ String keyJson = gson.toJson(key); when(httpSessionMock.post(eq(buildCacheEndpoint(Constants.GROUPS_MEMBERS)), eq(keyJson), any())) .thenReturn(new HttpResult(SUCCESSFUL, EMPTY_MSG)); - assertThat(forwarder.evict(Constants.GROUPS_MEMBERS, key).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + assertThat( + forwarder + .evict(Constants.GROUPS_MEMBERS, key) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isTrue(); } @@ -373,7 +426,11 @@ String keyJson = gson.toJson(key); when(httpSessionMock.post(eq(buildCacheEndpoint(Constants.PROJECTS)), eq(keyJson), any())) .thenReturn(new HttpResult(FAILED, EMPTY_MSG)); - assertThat(forwarder.evict(Constants.PROJECTS, key).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + assertThat( + forwarder + .evict(Constants.PROJECTS, key) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } @@ -383,7 +440,11 @@ String keyJson = gson.toJson(key); when(httpSessionMock.post(eq(buildCacheEndpoint(Constants.PROJECTS)), eq(keyJson), any())) .thenThrow(IOException.class); - assertThat(forwarder.evict(Constants.PROJECTS, key).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + assertThat( + forwarder + .evict(Constants.PROJECTS, key) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } @@ -396,7 +457,11 @@ String projectName = PROJECT_TO_ADD; when(httpSessionMock.post(eq(buildProjectListCacheEndpoint(projectName)), any(), any())) .thenReturn(new HttpResult(SUCCESSFUL, EMPTY_MSG)); - assertThat(forwarder.addToProjectList(projectName).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + assertThat( + forwarder + .addToProjectList(projectName) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isTrue(); } @@ -405,7 +470,11 @@ String projectName = PROJECT_TO_ADD; when(httpSessionMock.post(eq(buildProjectListCacheEndpoint(projectName)), any(), any())) .thenReturn(new HttpResult(FAILED, EMPTY_MSG)); - assertThat(forwarder.addToProjectList(projectName).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + assertThat( + forwarder + .addToProjectList(projectName) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } @@ -414,7 +483,11 @@ String projectName = PROJECT_TO_ADD; when(httpSessionMock.post(eq(buildProjectListCacheEndpoint(projectName)), any(), any())) .thenThrow(IOException.class); - assertThat(forwarder.addToProjectList(projectName).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + assertThat( + forwarder + .addToProjectList(projectName) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } @@ -423,7 +496,11 @@ String projectName = PROJECT_TO_DELETE; when(httpSessionMock.delete(eq(buildProjectListCacheEndpoint(projectName)), any())) .thenReturn(new HttpResult(SUCCESSFUL, EMPTY_MSG)); - assertThat(forwarder.removeFromProjectList(projectName).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + assertThat( + forwarder + .removeFromProjectList(projectName) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isTrue(); } @@ -432,7 +509,11 @@ String projectName = PROJECT_TO_DELETE; when(httpSessionMock.delete(eq(buildProjectListCacheEndpoint(projectName)), any())) .thenReturn(new HttpResult(FAILED, EMPTY_MSG)); - assertThat(forwarder.removeFromProjectList(projectName).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + assertThat( + forwarder + .removeFromProjectList(projectName) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } @@ -441,7 +522,11 @@ String projectName = PROJECT_TO_DELETE; when(httpSessionMock.delete(eq(buildProjectListCacheEndpoint(projectName)), any())) .thenThrow(IOException.class); - assertThat(forwarder.removeFromProjectList(projectName).get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + assertThat( + forwarder + .removeFromProjectList(projectName) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } @@ -459,7 +544,8 @@ assertThat( forwarder .evict(Constants.PROJECT_LIST, new Object()) - .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isTrue(); } @@ -473,7 +559,8 @@ assertThat( forwarder .evict(Constants.PROJECT_LIST, new Object()) - .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isTrue(); } @@ -486,7 +573,8 @@ assertThat( forwarder .evict(Constants.PROJECT_LIST, new Object()) - .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } @@ -500,7 +588,8 @@ assertThat( forwarder .evict(Constants.PROJECT_LIST, new Object()) - .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)) + .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS) + .getResult()) .isFalse(); } }
diff --git a/src/test/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandlerTest.java b/src/test/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandlerTest.java index a8aa4a9..a986b90 100644 --- a/src/test/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandlerTest.java +++ b/src/test/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandlerTest.java
@@ -24,7 +24,9 @@ import com.ericsson.gerrit.plugins.highavailability.Configuration; import com.ericsson.gerrit.plugins.highavailability.forwarder.Context; +import com.ericsson.gerrit.plugins.highavailability.forwarder.EventType; import com.ericsson.gerrit.plugins.highavailability.forwarder.Forwarder; +import com.ericsson.gerrit.plugins.highavailability.forwarder.Forwarder.Result; import com.ericsson.gerrit.plugins.highavailability.forwarder.IndexEvent; import com.google.gerrit.entities.Account; import com.google.gerrit.entities.AccountGroup; @@ -75,12 +77,17 @@ when(changeCheckerMock.newIndexEvent()).thenReturn(Optional.of(new IndexEvent())); when(forwarder.indexAccount(eq(ACCOUNT_ID), any())) - .thenReturn(CompletableFuture.completedFuture(true)); + .thenReturn( + CompletableFuture.completedFuture(new Result(EventType.INDEX_ACCOUNT_UPDATE, true))); when(forwarder.deleteChangeFromIndex(eq(CHANGE_ID), any())) - .thenReturn(CompletableFuture.completedFuture(true)); - when(forwarder.indexGroup(eq(UUID), any())).thenReturn(CompletableFuture.completedFuture(true)); + .thenReturn( + CompletableFuture.completedFuture(new Result(EventType.INDEX_CHANGE_DELETION, true))); + when(forwarder.indexGroup(eq(UUID), any())) + .thenReturn( + CompletableFuture.completedFuture(new Result(EventType.INDEX_GROUP_UPDATE, true))); when(forwarder.indexChange(eq(PROJECT_NAME), eq(CHANGE_ID), any())) - .thenReturn(CompletableFuture.completedFuture(true)); + .thenReturn( + CompletableFuture.completedFuture(new Result(EventType.INDEX_CHANGE_UPDATE, true))); setUpIndexEventHandler(currCtx); }