Merge branch 'stable-3.7' into stable-3.8 * stable-3.7: Parse refs/multi-site/version as a Long BLOB value Change-Id: I3ef9c996a3e0584595fdf45050a909e2121becbd
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 d9b9196..632ac02 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
@@ -20,6 +20,7 @@ import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError; import com.gerritforge.gerrit.globalrefdb.validation.SharedRefDatabaseWrapper; +import com.google.common.base.Predicates; import com.google.common.collect.ImmutableSet; import com.google.common.flogger.FluentLogger; import com.google.gerrit.entities.Project; @@ -30,17 +31,18 @@ import com.google.gerrit.server.events.RefUpdatedEvent; import com.google.gerrit.server.extensions.events.GitReferenceUpdated; import com.google.gerrit.server.git.GitRepositoryManager; -import com.google.gerrit.server.notedb.IntBlob; import com.google.gerrit.server.update.context.RefUpdateContext; import com.google.inject.Inject; import com.googlesource.gerrit.plugins.multisite.ProjectVersionLogger; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.Optional; 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.ObjectLoader; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.lib.Repository; @@ -218,9 +220,9 @@ public Optional<Long> getProjectLocalVersion(String projectName) { try (Repository repository = gitRepositoryManager.openRepository(Project.NameKey.parse(projectName))) { - Optional<IntBlob> blob = IntBlob.parse(repository, MULTI_SITE_VERSIONING_REF); + Optional<Long> blob = longBlobParse(repository, MULTI_SITE_VERSIONING_REF); if (blob.isPresent()) { - Long repoVersion = Integer.toUnsignedLong(blob.get().value()); + Long repoVersion = blob.get(); logger.atFine().log("Local project '%s' has version %d", projectName, repoVersion); return Optional.of(repoVersion); } @@ -232,6 +234,24 @@ return Optional.empty(); } + private Optional<Long> longBlobParse(Repository repo, String ref) throws IOException { + return Optional.ofNullable(repo.exactRef(ref)) + .map( + (r) -> { + ObjectLoader loader; + try { + loader = repo.open(r.getObjectId()); + String boutString = new String(loader.getBytes(), StandardCharsets.UTF_8); + return Long.parseLong(boutString); + } catch (IOException e) { + logger.atSevere().withCause(e).log( + "Unable to extract long BLOB from %s:%s", repo.getDirectory(), ref); + return null; + } + }) + .filter(Predicates.notNull()); + } + /* (non-Javadoc) * @see com.googlesource.gerrit.plugins.multisite.validation.ProjectVersionRefUpdate#getProjectRemoteVersion(java.lang.String) */
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 92015ce..a997f9f 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
@@ -143,9 +143,10 @@ when(refUpdatedEvent.getProjectNameKey()).thenReturn(A_TEST_PROJECT_NAME_KEY); when(refUpdatedEvent.getRefName()).thenReturn(A_TEST_REF_NAME); - new ProjectVersionRefUpdateImpl( - repoManager, sharedRefDb, gitReferenceUpdated, verLogger, DEFAULT_INSTANCE_ID) - .onEvent(refUpdatedEvent); + ProjectVersionRefUpdateImpl projectVersion = + new ProjectVersionRefUpdateImpl( + repoManager, sharedRefDb, gitReferenceUpdated, verLogger, DEFAULT_INSTANCE_ID); + projectVersion.onEvent(refUpdatedEvent); Ref ref = repo.getRepository().findRef(MULTI_SITE_VERSIONING_REF); @@ -156,6 +157,10 @@ ObjectLoader loader = repo.getRepository().open(ref.getObjectId()); long storedVersion = readLongObject(loader); + + Optional<Long> localStoredVersion = projectVersion.getProjectLocalVersion(A_TEST_PROJECT_NAME); + assertThat(localStoredVersion).isEqualTo(Optional.of(storedVersion)); + assertThat(storedVersion).isGreaterThan((long) masterPlusOneCommit.getCommitTime()); verify(verLogger).log(A_TEST_PROJECT_NAME_KEY, storedVersion, 0);