Merge branch 'stable-3.10' into stable-3.11

* stable-3.10:
  Log cancelled fetch collisions without reschedule
  Add per-project shared lock to avoid fetch collisions
  Revert "Prevent concurrent fetches on the same repository"
  Revert "Extract QueueInfo into its own class"
  Extract QueueInfo into its own class
  Throw LockFailureException from filterAndLock interface
  Expose new constructor for LockFailureException
  Prevent concurrent fetches on the same repository

Change-Id: Id1aa990ab3a59f0232418738b084ea20c977d183
diff --git a/example-setup/broker/Dockerfile b/example-setup/broker/Dockerfile
index 8419c8e..9c09461 100644
--- a/example-setup/broker/Dockerfile
+++ b/example-setup/broker/Dockerfile
@@ -1,4 +1,4 @@
-FROM gerritcodereview/gerrit:3.10.0-almalinux9
+FROM gerritcodereview/gerrit:3.11.4
 
 USER root
 
diff --git a/example-setup/http/Dockerfile b/example-setup/http/Dockerfile
index 4a824a7..18d88ec 100644
--- a/example-setup/http/Dockerfile
+++ b/example-setup/http/Dockerfile
@@ -1,4 +1,4 @@
-FROM gerritcodereview/gerrit:3.10.0-almalinux9
+FROM gerritcodereview/gerrit:3.11.4
 
 USER root
 
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 7f69304..a43ce4a 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
@@ -666,14 +666,14 @@
       throws LockFailureException {
     Set<String> refsNames =
         refs.stream().map(FetchRefSpec::refName).collect(Collectors.toUnmodifiableSet());
+    Optional<ReplicationFetchFilter> maybeFilter = replicationFetchFilter();
     Set<String> filteredRefNames;
-    Optional<ReplicationFetchFilter> fetchFilter = replicationFetchFilter();
-    if (fetchFilter.isPresent()) {
+    if (maybeFilter.isPresent()) {
       if (lock) {
-        fetchLocks = fetchFilter.get().filterAndLock(this.projectName.get(), refsNames);
+        fetchLocks = maybeFilter.get().filterAndLock(this.projectName.get(), refsNames);
         filteredRefNames = fetchLocks.keySet();
       } else {
-        filteredRefNames = fetchFilter.get().filter(this.projectName.get(), refsNames);
+        filteredRefNames = maybeFilter.get().filter(this.projectName.get(), refsNames);
       }
     } else {
       filteredRefNames = refsNames;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationModule.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationModule.java
index 4f32f26..d4eb9b8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationModule.java
@@ -34,6 +34,7 @@
 import com.google.inject.assistedinject.FactoryModuleBuilder;
 import com.google.inject.internal.UniqueAnnotations;
 import com.google.inject.name.Names;
+import com.googlesource.gerrit.plugins.deleteproject.cache.CacheDeleteHandler;
 import com.googlesource.gerrit.plugins.replication.AutoReloadSecureCredentialsFactoryDecorator;
 import com.googlesource.gerrit.plugins.replication.ConfigParser;
 import com.googlesource.gerrit.plugins.replication.CredentialsFactory;
@@ -42,6 +43,7 @@
 import com.googlesource.gerrit.plugins.replication.StartReplicationCapability;
 import com.googlesource.gerrit.plugins.replication.pull.api.FetchApiCapability;
 import com.googlesource.gerrit.plugins.replication.pull.api.FetchJob;
+import com.googlesource.gerrit.plugins.replication.pull.api.ProjectDeletionAction;
 import com.googlesource.gerrit.plugins.replication.pull.auth.PullReplicationGroupModule;
 import com.googlesource.gerrit.plugins.replication.pull.client.FetchApiClient;
 import com.googlesource.gerrit.plugins.replication.pull.client.FetchRestApiClient;
@@ -68,6 +70,9 @@
 
   @Override
   protected void configure() {
+    bind(CacheDeleteHandler.class);
+    bind(ProjectDeletionAction.class).in(Scopes.SINGLETON);
+
     bind(MetricMaker.class)
         .annotatedWith(Names.named(ReplicationQueueMetrics.REPLICATION_QUEUE_METRICS))
         .toInstance(pluginMetricMaker);
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 "";
             }