Merge branch 'stable-3.10' into stable-3.11

* stable-3.10:
  Do not lock refs when not executing a fetch
  Allow locking refs whilst filtering for fetch requests
  Remove unused Transport in FetchOneTest
  Avoid mocking ReplicationFetchFilter
  Remove redundant public modifier in ReplicationFetchFilter
  Record replication metrics for retrying tasks

Change-Id: I4bbbbd665e155205f691041ac0140b68ec041df6
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchOne.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchOne.java
index 472d64d..9f94a6a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchOne.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchOne.java
@@ -632,21 +632,22 @@
         .flatMap(filter -> Optional.ofNullable(filter.get()));
   }
 
-  private Set<FetchRefSpec> runRefsFilter(Set<FetchRefSpec> refs, boolean lock) {
+  private Set<FetchRefSpec> runRefsFilter(Set<FetchRefSpec> refs, boolean lock)
+      throws com.google.gerrit.git.LockFailureException {
     Set<String> refsNames =
         refs.stream().map(FetchRefSpec::refName).collect(Collectors.toUnmodifiableSet());
-    Set<String> filteredRefNames =
-        replicationFetchFilter()
-            .map(
-                f -> {
-                  if (lock) {
-                    fetchLocks = f.filterAndLock(this.projectName.get(), refsNames);
-                    return fetchLocks.keySet();
-                  } else {
-                    return f.filter(this.projectName.get(), refsNames);
-                  }
-                })
-            .orElse(refsNames);
+    Optional<ReplicationFetchFilter> maybeFilter = replicationFetchFilter();
+    Set<String> filteredRefNames;
+    if (maybeFilter.isPresent()) {
+      if (lock) {
+        fetchLocks = maybeFilter.get().filterAndLock(this.projectName.get(), refsNames);
+        filteredRefNames = fetchLocks.keySet();
+      } else {
+        filteredRefNames = maybeFilter.get().filter(this.projectName.get(), refsNames);
+      }
+    } else {
+      filteredRefNames = refsNames;
+    }
     return refs.stream()
         .filter(refSpec -> filteredRefNames.contains(refSpec.refName()))
         .collect(Collectors.toUnmodifiableSet());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationFetchFilter.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationFetchFilter.java
index 17afe94..19d4a5b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationFetchFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationFetchFilter.java
@@ -15,6 +15,7 @@
 package com.googlesource.gerrit.plugins.replication.pull;
 
 import com.google.gerrit.extensions.annotations.ExtensionPoint;
+import com.google.gerrit.git.LockFailureException;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -29,7 +30,8 @@
 
   Set<String> filter(String projectName, Set<String> fetchRefs);
 
-  default Map<String, AutoCloseable> filterAndLock(String projectName, Set<String> fetchRefs) {
+  default Map<String, AutoCloseable> filterAndLock(String projectName, Set<String> fetchRefs)
+      throws LockFailureException {
     return filter(projectName, fetchRefs).stream()
         .collect(Collectors.toMap(ref -> ref, ref -> () -> {}));
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/HttpModule.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/HttpModule.java
index 95082b8..72a0182 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/HttpModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/HttpModule.java
@@ -20,6 +20,7 @@
 import com.google.inject.Scopes;
 import com.google.inject.name.Names;
 import com.google.inject.servlet.ServletModule;
+import com.googlesource.gerrit.plugins.deleteproject.cache.CacheDeleteHandler;
 import com.googlesource.gerrit.plugins.replication.pull.BearerTokenProvider;
 
 public class HttpModule extends ServletModule {
@@ -46,6 +47,9 @@
                   .in(Scopes.SINGLETON);
             });
 
+    bind(CacheDeleteHandler.class);
+    bind(ProjectDeletionAction.class).in(Scopes.SINGLETON);
+
     DynamicSet.bind(binder(), AllRequestFilter.class)
         .to(PullReplicationFilter.class)
         .in(Scopes.SINGLETON);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/client/FetchRestApiClient.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/client/FetchRestApiClient.java
index efc445d..c3bb378 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/client/FetchRestApiClient.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/client/FetchRestApiClient.java
@@ -70,7 +70,6 @@
   public static final boolean FORCE_ASYNC = true;
 
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
-  static String GERRIT_ADMIN_PROTOCOL_PREFIX = "gerrit+";
 
   private static final Gson GSON =
       new GsonBuilder().setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create();
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/health/PullReplicationTasksHealthCheckTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/health/PullReplicationTasksHealthCheckTest.java
index acba063..d06c9ea 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/health/PullReplicationTasksHealthCheckTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/health/PullReplicationTasksHealthCheckTest.java
@@ -38,6 +38,7 @@
 import com.googlesource.gerrit.plugins.replication.api.ConfigResource;
 import com.googlesource.gerrit.plugins.replication.pull.Source;
 import com.googlesource.gerrit.plugins.replication.pull.SourcesCollection;
+import java.io.IOException;
 import java.time.Duration;
 import java.util.ArrayList;
 import java.util.List;
@@ -255,6 +256,9 @@
             }
 
             @Override
+            public void update(Config config) throws IOException {}
+
+            @Override
             public String getVersion() {
               return "";
             }