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);