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