Merge branch 'stable-3.4' into stable-3.5

* stable-3.4:
  Roll back batch ref updates on uncaught throwables

Change-Id: I7d5147b6128c2ee665e4ac229e7c2d27b9859744
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidator.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidator.java
index 241e733..1e45951 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidator.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidator.java
@@ -150,7 +150,7 @@
               .collect(Collectors.joining(", "));
       Exception firstFailureException = refsFailures.get(0).exception;
 
-      logger.atSevere().withCause(firstFailureException).log(allFailuresMessage);
+      logger.atSevere().withCause(firstFailureException).log("%s", allFailuresMessage);
       throw new IOException(allFailuresMessage, firstFailureException);
     }
 
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java
index 0168f2f..85e803a 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java
@@ -160,7 +160,7 @@
   private Boolean isRefToBeIgnored(String refName) {
     Boolean isRefToBeIgnored =
         ignoredRefs.stream().anyMatch(ignoredRefPrefix -> refName.startsWith(ignoredRefPrefix));
-    logger.atFine().log("Is ref to be ignored? " + isRefToBeIgnored);
+    logger.atFine().log("Is project version update? %s", isRefToBeIgnored);
     return isRefToBeIgnored;
   }
 
@@ -176,7 +176,7 @@
 
   protected Boolean isGlobalProject(String projectName) {
     Boolean isGlobalProject = projectsFilter.matches(projectName);
-    logger.atFine().log("Is global project? " + isGlobalProject);
+    logger.atFine().log("Is global project? %s", isGlobalProject);
     return isGlobalProject;
   }
 
@@ -231,10 +231,8 @@
               Project.nameKey(projectName), refPair.compareRef, refPair.putValue);
     } catch (GlobalRefDbSystemError e) {
       logger.atWarning().withCause(e).log(
-          "Not able to persist the data in global-refdb for project '{}' and ref '{}', message: {}",
-          projectName,
-          refPair.getName(),
-          e.getMessage());
+          "Not able to persist the data in global-refdb for project '%s' and ref '%s', message: %s",
+          projectName, refPair.getName(), e.getMessage());
       throw e;
     }
 
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManager.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManager.java
index 0e21338..763aeb4 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManager.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManager.java
@@ -17,6 +17,7 @@
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableSet;
 import com.google.gerrit.entities.Project;
+import com.google.gerrit.entities.Project.NameKey;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.git.LocalDiskRepositoryManager;
 import com.google.gerrit.server.git.RepositoryCaseMismatchException;
@@ -113,6 +114,16 @@
     return repositoryManager().list();
   }
 
+  @Override
+  public Boolean canPerformGC() {
+    return repositoryManager().canPerformGC();
+  }
+
+  @Override
+  public Status getRepositoryStatus(NameKey name) {
+    return repositoryManager().getRepositoryStatus(name);
+  }
+
   private Repository wrap(Project.NameKey projectName, Repository projectRepo) {
     return sharedRefDbRepoFactory.create(projectName.get(), projectRepo, ignoredRefs);
   }
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManagerTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManagerTest.java
index a6c7667..d31aac0 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManagerTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManagerTest.java
@@ -14,17 +14,20 @@
 
 package com.gerritforge.gerrit.globalrefdb.validation;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.verify;
 
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.RefFixture;
 import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.git.LocalDiskRepositoryManager;
 import com.google.inject.AbstractModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.TypeLiteral;
 import com.google.inject.name.Names;
+import java.util.Collections;
 import org.eclipse.jgit.lib.Repository;
 import org.junit.Before;
 import org.junit.Test;
@@ -110,6 +113,33 @@
     verifyThatSharedRefDbRepositoryWrapperHasBeenCreated(IGNORED_REFS);
   }
 
+  @Test
+  public void canPerformGCShouldDelegateToLocalDiskRepositoryManager() {
+    doReturn(true).when(localDiskRepositoryManagerMock).canPerformGC();
+
+    assertThat(msRepoMgr.canPerformGC()).isTrue();
+    verify(localDiskRepositoryManagerMock).canPerformGC();
+  }
+
+  @Test
+  public void getRepositoryStatusShouldDelegateToLocalDiskRepositoryManager() {
+    doReturn(GitRepositoryManager.Status.ACTIVE)
+        .when(localDiskRepositoryManagerMock)
+        .getRepositoryStatus(A_TEST_PROJECT_NAME_KEY);
+
+    assertThat(msRepoMgr.getRepositoryStatus(A_TEST_PROJECT_NAME_KEY))
+        .isEqualTo(GitRepositoryManager.Status.ACTIVE);
+    verify(localDiskRepositoryManagerMock).getRepositoryStatus(A_TEST_PROJECT_NAME_KEY);
+  }
+
+  @Test
+  public void listShouldDelegateToLocalDiskRepositoryManager() {
+    doReturn(Collections.emptySortedSet()).when(localDiskRepositoryManagerMock).list();
+
+    assertThat(msRepoMgr.list()).isEqualTo(Collections.emptySortedSet());
+    verify(localDiskRepositoryManagerMock).list();
+  }
+
   private Injector getInjector(ImmutableSet<String> ignoredRefs) {
     return Guice.createInjector(
         new AbstractModule() {