private boolean updateSharedProjectVersion()

in src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectVersionRefUpdate.java [143:217]


  private boolean updateSharedProjectVersion(
      Project.NameKey projectNameKey, ObjectId newObjectId, Long newVersion)
      throws SharedProjectVersionUpdateException {

    Ref sharedRef =
        sharedRefDb
            .get(projectNameKey, MULTI_SITE_VERSIONING_REF, String.class)
            .map(
                (String objectId) ->
                    new ObjectIdRef.Unpeeled(
                        Ref.Storage.NEW, MULTI_SITE_VERSIONING_REF, ObjectId.fromString(objectId)))
            .orElse(
                new ObjectIdRef.Unpeeled(
                    Ref.Storage.NEW, MULTI_SITE_VERSIONING_REF, ObjectId.zeroId()));
    Optional<Long> sharedVersion =
        sharedRefDb
            .get(projectNameKey, MULTI_SITE_VERSIONING_VALUE_REF, String.class)
            .map(Long::parseLong);

    try {
      if (sharedVersion.isPresent() && sharedVersion.get() >= newVersion) {
        logger.atWarning().log(
            String.format(
                "NOT Updating project %s version %s (value=%d) in shared ref-db because is more recent than the local one %s (value=%d) ",
                projectNameKey.get(),
                newObjectId,
                newVersion,
                sharedRef.getObjectId().getName(),
                sharedVersion.get()));
        return false;
      }

      logger.atFine().log(
          String.format(
              "Updating shared project %s version to %s (value=%d)",
              projectNameKey.get(), newObjectId, newVersion));

      boolean success = sharedRefDb.compareAndPut(projectNameKey, sharedRef, newObjectId);
      if (!success) {
        String message =
            String.format(
                "Project version blob update failed for %s. Current value %s, new value: %s",
                projectNameKey.get(), safeGetObjectId(sharedRef), newObjectId);
        logger.atSevere().log(message);
        throw new SharedProjectVersionUpdateException(message);
      }

      success =
          sharedRefDb.compareAndPut(
              projectNameKey,
              MULTI_SITE_VERSIONING_VALUE_REF,
              sharedVersion.map(Object::toString).orElse(null),
              newVersion.toString());
      if (!success) {
        String message =
            String.format(
                "Project version update failed for %s. Current value %s, new value: %s",
                projectNameKey.get(), safeGetObjectId(sharedRef), newObjectId);
        logger.atSevere().log(message);
        throw new SharedProjectVersionUpdateException(message);
      }

      return true;
    } catch (GlobalRefDbSystemError refDbSystemError) {
      String message =
          String.format(
              "Error while updating shared project version for %s. Current value %s, new value: %s. Error: %s",
              projectNameKey.get(),
              sharedRef.getObjectId(),
              newObjectId,
              refDbSystemError.getMessage());
      logger.atSevere().withCause(refDbSystemError).log(message);
      throw new SharedProjectVersionUpdateException(message);
    }
  }