Do not wait for async fetches to be completed Fix an issue where async fetch were not executed in background but the incoming REST-API was blocking until the fetch completion, which was unintentional for async operations. Change-Id: I559c92863de89e82a2c392dbfb4b254ddaf33b92
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommand.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommand.java index 7984873..88e2b1c 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommand.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommand.java
@@ -31,14 +31,9 @@ import com.googlesource.gerrit.plugins.replication.pull.Source; import com.googlesource.gerrit.plugins.replication.pull.SourcesCollection; import com.googlesource.gerrit.plugins.replication.pull.api.exception.RemoteConfigurationMissingException; -import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Set; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; import org.eclipse.jgit.errors.TransportException; @@ -66,14 +61,12 @@ String label, Set<FetchRefSpec> refsSpecs, PullReplicationApiRequestMetrics apiRequestMetrics) - throws InterruptedException, ExecutionException, RemoteConfigurationMissingException, - TimeoutException, TransportException { + throws InterruptedException, RemoteConfigurationMissingException, TransportException { fetch(name, label, refsSpecs, ASYNC, Optional.of(apiRequestMetrics)); } public void fetchSync(Project.NameKey name, String label, Set<FetchRefSpec> refsSpecs) - throws InterruptedException, ExecutionException, RemoteConfigurationMissingException, - TimeoutException, TransportException { + throws InterruptedException, RemoteConfigurationMissingException, TransportException { fetch(name, label, refsSpecs, SYNC, Optional.empty()); } @@ -83,8 +76,7 @@ Set<FetchRefSpec> refSpecs, ReplicationType fetchType, Optional<PullReplicationApiRequestMetrics> apiRequestMetrics) - throws InterruptedException, ExecutionException, RemoteConfigurationMissingException, - TimeoutException, TransportException { + throws InterruptedException, RemoteConfigurationMissingException, TransportException { ReplicationState state = fetchReplicationStateFactory.create( new FetchResultProcessing.CommandProcessing(this, eventDispatcher.get())); @@ -98,17 +90,8 @@ try { if (fetchType == ReplicationType.ASYNC) { state.markAllFetchTasksScheduled(); - List<Future<?>> futures = new ArrayList<>(); for (FetchRefSpec refSpec : refSpecs) { - futures.add(source.get().schedule(name, refSpec, state, apiRequestMetrics)); - } - int timeout = source.get().getTimeout(); - for (Future future : futures) { - if (timeout == 0) { - future.get(); - } else { - future.get(timeout, TimeUnit.SECONDS); - } + source.get().schedule(name, refSpec, state, apiRequestMetrics); } } else { Optional<FetchOne> maybeFetch = @@ -121,10 +104,7 @@ throw newTransportException(maybeFetch.get()); } } - } catch (ExecutionException - | IllegalStateException - | TimeoutException - | InterruptedException e) { + } catch (IllegalStateException e) { fetchStateLog.error("Exception during the fetch operation", e, state); throw e; }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchJob.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchJob.java index f5ee3a1..4437bef 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchJob.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchJob.java
@@ -20,8 +20,6 @@ import com.google.inject.assistedinject.Assisted; import com.googlesource.gerrit.plugins.replication.pull.api.FetchAction.BatchInput; import com.googlesource.gerrit.plugins.replication.pull.api.exception.RemoteConfigurationMissingException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeoutException; import org.eclipse.jgit.errors.TransportException; public class FetchJob implements Runnable { @@ -53,11 +51,7 @@ public void run() { try { command.fetchAsync(project, batchInput.label, batchInput.getRefSpecs(), metrics); - } catch (InterruptedException - | ExecutionException - | RemoteConfigurationMissingException - | TimeoutException - | TransportException e) { + } catch (InterruptedException | RemoteConfigurationMissingException | TransportException e) { log.atSevere().withCause(e).log( "Exception during the async fetch call for project %s, label %s and ref(s) name(s) %s", project.get(), batchInput.label, batchInput.getRefSpecs());
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchActionTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchActionTest.java index cb5758f..68f6bf0 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchActionTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchActionTest.java
@@ -37,9 +37,7 @@ import com.googlesource.gerrit.plugins.replication.pull.api.exception.RemoteConfigurationMissingException; import java.util.Optional; import java.util.Set; -import java.util.concurrent.ExecutionException; import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeoutException; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -200,19 +198,6 @@ } @Test(expected = RestApiException.class) - public void shouldThrowRestApiExceptionWhenIssueDuringPocessing() throws Exception { - FetchAction.Input inputParams = new FetchAction.Input(); - inputParams.label = label; - inputParams.refName = refName; - - doThrow(new ExecutionException(new RuntimeException())) - .when(fetchCommand) - .fetchSync(any(), any(), any()); - - fetchAction.apply(projectResource, inputParams); - } - - @Test(expected = RestApiException.class) public void shouldThrowRestApiExceptionWhenIssueWithUrlParam() throws Exception { FetchAction.Input inputParams = new FetchAction.Input(); inputParams.label = label; @@ -223,17 +208,6 @@ fetchAction.apply(projectResource, inputParams); } - @Test(expected = RestApiException.class) - public void shouldThrowRestApiExceptionWhenTimeout() throws Exception { - FetchAction.Input inputParams = new FetchAction.Input(); - inputParams.label = label; - inputParams.refName = refName; - - doThrow(new TimeoutException()).when(fetchCommand).fetchSync(any(), any(), any()); - - fetchAction.apply(projectResource, inputParams); - } - @Test(expected = AuthException.class) public void shouldThrowAuthExceptionWhenCallFetchActionCapabilityNotAssigned() throws Exception { FetchAction.Input inputParams = new FetchAction.Input();