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