Remove project version SHA1 from global-refdb Multi-site plugins stores last commit timestamp in the `refs/multi-site/version` local ref and global-refdb `refs/multi-site/version/value` entry. Additionally last timestamp SHA1 is stored in global-refdb `refs/multi-site/version` entry. The SHA1 stored in global-refdb is never used and can be removed. Bug: Issue 297440085 Change-Id: I509dd7075b0d66d362d9f93850adaa7fdfcd3df0
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 c9121c9..14a421e 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
@@ -39,9 +39,7 @@ import java.util.Set; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectIdRef; import org.eclipse.jgit.lib.ObjectInserter; -import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.lib.Repository; @@ -107,8 +105,7 @@ if (newProjectVersionRefUpdate.isPresent()) { verLogger.log(projectNameKey, newVersion, 0L); - if (updateSharedProjectVersion( - projectNameKey, newProjectVersionRefUpdate.get().getNewObjectId(), newVersion)) { + if (updateSharedProjectVersion(projectNameKey, newVersion)) { gitReferenceUpdated.fire(projectNameKey, newProjectVersionRefUpdate.get(), null); } } else { @@ -138,64 +135,36 @@ return newId; } - private boolean updateSharedProjectVersion( - Project.NameKey projectNameKey, ObjectId newObjectId, Long newVersion) + private boolean updateSharedProjectVersion(Project.NameKey projectNameKey, 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); + String sharedValue = sharedVersion.map(Object::toString).orElse(null); 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())); + "NOT Updating project %s value=%d in shared ref-db because is more recent than the local value=%d", + projectNameKey.get(), newVersion, sharedVersion.get())); return false; } logger.atFine().log( String.format( - "Updating shared project %s version to %s (value=%d)", - projectNameKey.get(), newObjectId, newVersion)); + "Updating shared project %s value to %d", projectNameKey.get(), 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 = + boolean success = sharedRefDb.compareAndPut( - projectNameKey, - MULTI_SITE_VERSIONING_VALUE_REF, - sharedVersion.map(Object::toString).orElse(null), - newVersion.toString()); + projectNameKey, MULTI_SITE_VERSIONING_VALUE_REF, sharedValue, 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); + "Project value update failed for %s. Current value %s, new value: %s", + projectNameKey.get(), sharedValue, newVersion); logger.atSevere().log(message); throw new SharedProjectVersionUpdateException(message); } @@ -204,11 +173,8 @@ } 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()); + "Error while updating shared project value for %s. Current value %s, new value: %s. Error: %s", + projectNameKey.get(), sharedValue, newVersion, refDbSystemError.getMessage()); logger.atSevere().withCause(refDbSystemError).log(message); throw new SharedProjectVersionUpdateException(message); } @@ -262,10 +228,6 @@ return globalVersion.flatMap(longString -> getLongValueOf(longString)); } - private Object safeGetObjectId(Ref currentRef) { - return currentRef == null ? "null" : currentRef.getObjectId(); - } - private Optional<Long> getLongValueOf(String longString) { try { return Optional.ofNullable(Long.parseLong(longString));
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectVersionRefUpdateTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectVersionRefUpdateTest.java index bf65d0c..63da1b8 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectVersionRefUpdateTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectVersionRefUpdateTest.java
@@ -95,16 +95,9 @@ Context.setForwardedEvent(false); when(sharedRefDb.get( A_TEST_PROJECT_NAME_KEY, - ProjectVersionRefUpdate.MULTI_SITE_VERSIONING_REF, - String.class)) - .thenReturn(Optional.of("26f7ee61bf0e470e8393c884526eec8a9b943a63")); - when(sharedRefDb.get( - A_TEST_PROJECT_NAME_KEY, ProjectVersionRefUpdate.MULTI_SITE_VERSIONING_VALUE_REF, String.class)) .thenReturn(Optional.of("" + (masterCommit.getCommitTime() - 1))); - when(sharedRefDb.compareAndPut(any(Project.NameKey.class), any(Ref.class), any(ObjectId.class))) - .thenReturn(true); when(sharedRefDb.compareAndPut(any(Project.NameKey.class), any(String.class), any(), any())) .thenReturn(true); when(refUpdatedEvent.getProjectNameKey()).thenReturn(A_TEST_PROJECT_NAME_KEY); @@ -137,19 +130,11 @@ Thread.sleep(1000L); repo.branch("master").update(masterCommit); - - when(sharedRefDb.get( - A_TEST_PROJECT_NAME_KEY, - ProjectVersionRefUpdate.MULTI_SITE_VERSIONING_REF, - String.class)) - .thenReturn(Optional.of("26f7ee61bf0e470e8393c884526eec8a9b943a63")); when(sharedRefDb.get( A_TEST_PROJECT_NAME_KEY, ProjectVersionRefUpdate.MULTI_SITE_VERSIONING_VALUE_REF, String.class)) .thenReturn(Optional.of("" + (masterCommit.getCommitTime() - 1))); - when(sharedRefDb.compareAndPut(any(Project.NameKey.class), any(Ref.class), any(ObjectId.class))) - .thenReturn(true); when(sharedRefDb.compareAndPut(any(Project.NameKey.class), any(String.class), any(), any())) .thenReturn(true); when(refUpdatedEvent.getProjectNameKey()).thenReturn(A_TEST_PROJECT_NAME_KEY); @@ -184,17 +169,10 @@ Context.setForwardedEvent(false); when(sharedRefDb.get( A_TEST_PROJECT_NAME_KEY, - ProjectVersionRefUpdate.MULTI_SITE_VERSIONING_REF, - String.class)) - .thenReturn(Optional.empty()); - when(sharedRefDb.get( - A_TEST_PROJECT_NAME_KEY, ProjectVersionRefUpdate.MULTI_SITE_VERSIONING_VALUE_REF, String.class)) .thenReturn(Optional.empty()); - when(sharedRefDb.compareAndPut(any(Project.NameKey.class), any(Ref.class), any(ObjectId.class))) - .thenReturn(true); when(sharedRefDb.compareAndPut(any(Project.NameKey.class), any(String.class), any(), any())) .thenReturn(true); when(refUpdatedEvent.getProjectNameKey()).thenReturn(A_TEST_PROJECT_NAME_KEY);