Do not filter out refs removals when filtering pull-replication fetches

Since the support of the fetching of refs removals with I3b43c0c,
the async fetch can manage the deletion of refs as part of the replication
task.

The previous assumption that async tasks should not deal with refs
deletions when the global-refdb has a deleted ref isn't valid anymore.

Change-Id: I368e64c47d2cf3b4a74c7054ccb1f06143204d93
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilter.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilter.java
index c5571c0..03e0a6e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilter.java
@@ -20,7 +20,6 @@
 import com.gerritforge.gerrit.globalrefdb.validation.SharedRefDatabaseWrapper;
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.entities.Project;
-import com.google.gerrit.entities.Project.NameKey;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -62,7 +61,6 @@
         gitRepositoryManager.openRepository(Project.nameKey(projectName))) {
       RefDatabase refDb = repository.getRefDatabase();
       return refs.stream()
-          .filter(ref -> !hasBeenRemovedFromGlobalRefDb(projectName, ref))
           .filter(
               ref -> {
                 if (shouldNotBeTrackedAnymoreOnGlobalRefDb(ref)) {
@@ -91,31 +89,6 @@
     }
   }
 
-  /* If the ref to fetch has been set to all zeros on the global-refdb, it means
-   * that whatever is the situation locally, we do not need to fetch it:
-   * - If the remote still has it, fetching it will be useless because the global
-   *   state is that the ref should be removed.
-   * - If the remote doesn't have it anymore, trying to fetch the ref won't do
-   *   anything because you can't just remove local refs by fetching.
-   */
-  private boolean hasBeenRemovedFromGlobalRefDb(String projectName, String ref) {
-    if (foundAsZeroInSharedRefDb(Project.nameKey(projectName), ref)) {
-      repLog.info(
-          "{}:{} is found as zeros (removed) in shared-refdb thus will NOT BE fetched",
-          projectName,
-          ref);
-      return true;
-    }
-    return false;
-  }
-
-  private boolean foundAsZeroInSharedRefDb(NameKey projectName, String ref) {
-    return sharedRefDb
-        .get(projectName, ref, String.class)
-        .map(r -> ZERO_ID_NAME.equals(r))
-        .orElse(false);
-  }
-
   private Optional<ObjectId> getLocalSha1IfEqualsToExistingGlobalRefDb(
       Repository repository,
       String projectName,
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilterTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilterTest.java
index e09f6f6..b9ec588 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilterTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilterTest.java
@@ -17,6 +17,7 @@
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -147,7 +148,7 @@
     Set<String> filteredRefsToFetch = fetchFilter.filter(project, refsToFetch);
 
     assertThat(filteredRefsToFetch).hasSize(1);
-    verify(sharedRefDatabaseMock, times(3))
+    verify(sharedRefDatabaseMock, atLeastOnce())
         .get(eq(projectName), eq(temporaryOutdated), eq(String.class));
   }
 
@@ -172,12 +173,6 @@
   @Test
   public void shouldNotFilterOutWhenRefsMultisiteVersionIsPresentInSharedRefDb() throws Exception {
     String refsMultisiteVersionRef = ProjectVersionRefUpdate.MULTI_SITE_VERSIONING_REF;
-    RevCommit multiSiteVersionRef = newRef(refsMultisiteVersionRef);
-
-    doReturn(Optional.of(multiSiteVersionRef.getId().getName()))
-        .when(sharedRefDatabaseMock)
-        .get(eq(projectName), eq(refsMultisiteVersionRef), eq(String.class));
-
     Set<String> refsToFetch = Set.of(refsMultisiteVersionRef);
 
     MultisiteReplicationFetchFilter fetchFilter =
@@ -188,7 +183,7 @@
   }
 
   @Test
-  public void shouldFilterOutWhenRefIsDeletedInTheSharedRefDb() throws Exception {
+  public void shouldNotFilterOutWhenRefIsDeletedInTheSharedRefDb() throws Exception {
     String temporaryOutdated = "refs/heads/temporaryOutdated";
     newRef(temporaryOutdated);
 
@@ -201,25 +196,8 @@
         new MultisiteReplicationFetchFilter(sharedRefDatabaseMock, gitRepositoryManager, config);
     Set<String> filteredRefsToFetch = fetchFilter.filter(project, refsToFetch);
 
-    assertThat(filteredRefsToFetch).hasSize(0);
-    verify(sharedRefDatabaseMock).get(eq(projectName), any(), any());
-  }
-
-  @Test
-  public void shouldNotFilterOutWhenRefIsMissingOnlyInTheLocalRepository() throws Exception {
-    String refObjectId = "0000000000000000000000000000000000000001";
-    String nonExistingLocalRef = "refs/heads/temporaryOutdated";
-
-    Set<String> refsToFetch = Set.of(nonExistingLocalRef);
-    doReturn(Optional.of(refObjectId))
-        .when(sharedRefDatabaseMock)
-        .get(eq(projectName), any(), any());
-
-    MultisiteReplicationFetchFilter fetchFilter =
-        new MultisiteReplicationFetchFilter(sharedRefDatabaseMock, gitRepositoryManager, config);
-    Set<String> filteredRefsToFetch = fetchFilter.filter(project, refsToFetch);
-
     assertThat(filteredRefsToFetch).hasSize(1);
+    verify(sharedRefDatabaseMock, atLeastOnce()).get(eq(projectName), any(), any());
   }
 
   @Test
@@ -235,23 +213,6 @@
     assertThat(filteredRefsToFetch).hasSize(1);
   }
 
-  @Test
-  public void shouldFilterOutRefMissingInTheLocalRepositoryAndDeletedInSharedRefDb()
-      throws Exception {
-    String nonExistingLocalRef = "refs/heads/temporaryOutdated";
-
-    Set<String> refsToFetch = Set.of(nonExistingLocalRef);
-    doReturn(Optional.of(ObjectId.zeroId().getName()))
-        .when(sharedRefDatabaseMock)
-        .get(eq(projectName), any(), any());
-
-    MultisiteReplicationFetchFilter fetchFilter =
-        new MultisiteReplicationFetchFilter(sharedRefDatabaseMock, gitRepositoryManager, config);
-    Set<String> filteredRefsToFetch = fetchFilter.filter(project, refsToFetch);
-
-    assertThat(filteredRefsToFetch).hasSize(0);
-  }
-
   private RevCommit newRef(String refName) throws Exception {
     return repo.branch(refName).commit().create();
   }