Do not throw an exception when refs/multi-site/version lock fails
Busy repositories may have a lot of concurrency on the updates of
refs/multi-site/version: the failure to run the update is not a critical
issue and should not create and log any exception.
Updating the refs/multi-site/version multiple times with the same
timestamp won't make any sense anyway, so the lock failure is expected.
Change-Id: Ib48d0596444103bc11be9233306312f4b27a7067
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectVersionRefUpdateImpl.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectVersionRefUpdateImpl.java
index 6049133..e4f133b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectVersionRefUpdateImpl.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectVersionRefUpdateImpl.java
@@ -86,12 +86,15 @@
Project.NameKey projectNameKey = Project.nameKey(refUpdatedEvent.getProjectName());
long newVersion = getCurrentGlobalVersionNumber();
- RefUpdate newProjectVersionRefUpdate = updateLocalProjectVersion(projectNameKey, newVersion);
+ Optional<RefUpdate> newProjectVersionRefUpdate =
+ updateLocalProjectVersion(projectNameKey, newVersion);
- verLogger.log(projectNameKey, newVersion, 0L);
+ if (newProjectVersionRefUpdate.isPresent()) {
+ verLogger.log(projectNameKey, newVersion, 0L);
- if (updateSharedProjectVersion(projectNameKey, newVersion)) {
- gitReferenceUpdated.fire(projectNameKey, newProjectVersionRefUpdate, null);
+ if (updateSharedProjectVersion(projectNameKey, newVersion)) {
+ gitReferenceUpdated.fire(projectNameKey, newProjectVersionRefUpdate.get(), null);
+ }
}
} catch (LocalProjectVersionUpdateException | SharedProjectVersionUpdateException e) {
logger.atSevere().withCause(e).log(
@@ -231,7 +234,8 @@
}
@SuppressWarnings("FloggerLogString")
- private RefUpdate updateLocalProjectVersion(Project.NameKey projectNameKey, long newVersionNumber)
+ private Optional<RefUpdate> updateLocalProjectVersion(
+ Project.NameKey projectNameKey, long newVersionNumber)
throws LocalProjectVersionUpdateException {
logger.atFine().log(
"Updating local version for project %s with version %d",
@@ -240,6 +244,13 @@
Repository repository = gitRepositoryManager.openRepository(projectNameKey)) {
RefUpdate refUpdate = getProjectVersionRefUpdate(repository, newVersionNumber);
RefUpdate.Result result = refUpdate.update();
+ if (RefUpdate.Result.LOCK_FAILURE.equals(result)) {
+ logger.atFine().log(
+ "RefUpdate LOCK_FAILURE for refs/multi-site/version on project=%s, version=%d",
+ projectNameKey.get(), newVersionNumber);
+ return Optional.empty();
+ }
+
if (!isSuccessful(result)) {
String message =
String.format(
@@ -249,7 +260,7 @@
throw new LocalProjectVersionUpdateException(message);
}
- return refUpdate;
+ return Optional.of(refUpdate);
} catch (IOException e) {
String message = "Cannot create versioning command for " + projectNameKey.get();
logger.atSevere().withCause(e).log(message);