Throw lockFailureException when RefDBLock occurs
Currently we only retry for lockFailureException, throwing a
RefDbLockException will cause the batch to not be retried.
Bug: Issue 437621330
Change-Id: Ic2e619ce22b09c991e58a23e4ef5b227f2f6e8dd
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 8a4503a..8423d2e 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
@@ -27,6 +27,7 @@
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.googlesource.gerrit.plugins.multisite.Configuration;
+import com.googlesource.gerrit.plugins.replication.pull.FetchOne.LockFailureException;
import com.googlesource.gerrit.plugins.replication.pull.ReplicationFetchFilter;
import java.io.IOException;
import java.util.Collections;
@@ -97,7 +98,8 @@
}
@Override
- public Map<String, AutoCloseable> filterAndLock(String projectName, Set<String> fetchRefs) {
+ public Map<String, AutoCloseable> filterAndLock(String projectName, Set<String> fetchRefs)
+ throws LockFailureException {
// Use a SortedSet to ensure that they are always locked in the same order and therefore
// prevents potential deadlocks where multiple fetch tasks are mutually locking each other
// by locking different refs in different orders.
@@ -112,7 +114,8 @@
filteredRefs.addAll(filter(projectName, sortedFetchRefs));
} catch (RefDbLockException lockException) {
filteredRefs.clear();
- throw lockException;
+ throw new LockFailureException(
+ "Unable to lock refs " + sortedFetchRefs + " for project " + projectName, lockException);
} finally {
for (String excludedRef : Sets.difference(sortedFetchRefs, filteredRefs)) {
AutoCloseable excludedLock = refLocks.remove(excludedRef);