Add project initialisation during fetch REST Api call Project initialisation should be triggered for both fetch and send object REST Api calls. Bug: Issue 15413 Change-Id: I3b8894995d652a692ed5c29ba5c27662e5f95037
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java index 0e4ace1..61f2a64 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java
@@ -46,6 +46,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.function.Consumer; +import org.apache.http.client.ClientProtocolException; import org.eclipse.jgit.errors.InvalidObjectIdException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.transport.URIish; @@ -232,17 +233,8 @@ FetchRestApiClient fetchClient = fetchClientFactory.create(source); HttpResult result = fetchClient.callSendObject(project, refName, revision, uri); - if (!result.isSuccessful() - && source.isCreateMissingRepositories() - && result.isProjectMissing(project)) { - HttpResult initProjectResult = fetchClient.initProject(project, uri); - if (initProjectResult.isSuccessful()) { - result = fetchClient.callFetch(project, "refs/*", uri); - } else { - String errorMessage = - initProjectResult.getMessage().map(e -> " - Error: " + e).orElse(""); - repLog.error("Cannot create project " + project + errorMessage); - } + if (isProjectMissing(result, project) && source.isCreateMissingRepositories()) { + result = initProject(project, uri, fetchClient, result); } if (!result.isSuccessful()) { repLog.warn( @@ -275,8 +267,10 @@ try { URIish uri = new URIish(apiUrl); FetchRestApiClient fetchClient = fetchClientFactory.create(source); - HttpResult result = fetchClient.callFetch(project, refName, uri); + if (isProjectMissing(result, project) && source.isCreateMissingRepositories()) { + result = initProject(project, uri, fetchClient, result); + } if (!result.isSuccessful()) { stateLog.warn( String.format( @@ -302,6 +296,23 @@ return maxRetries == 0 || attempt < maxRetries; } + private Boolean isProjectMissing(HttpResult result, Project.NameKey project) { + return !result.isSuccessful() && result.isProjectMissing(project); + } + + private HttpResult initProject( + Project.NameKey project, URIish uri, FetchRestApiClient fetchClient, HttpResult result) + throws IOException, ClientProtocolException { + HttpResult initProjectResult = fetchClient.initProject(project, uri); + if (initProjectResult.isSuccessful()) { + result = fetchClient.callFetch(project, "refs/*", uri); + } else { + String errorMessage = initProjectResult.getMessage().map(e -> " - Error: " + e).orElse(""); + repLog.error("Cannot create project " + project + errorMessage); + } + return result; + } + private void fireBeforeStartupEvents() { Set<String> eventsReplayed = new HashSet<>(); for (ReferenceUpdatedEvent event : beforeStartupEventsQueue) {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java index 78eb3f7..8402782 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java
@@ -137,7 +137,7 @@ public void shouldNotCallInitProjectWhenReplicateNewRepositoriesNotSet() throws IOException { Event event = new TestEvent("refs/changes/01/1/meta"); when(httpResult.isSuccessful()).thenReturn(false); - + when(httpResult.isProjectMissing(any())).thenReturn(true); when(source.isCreateMissingRepositories()).thenReturn(false); objectUnderTest.start();