From 0dc6256ccad4be31c4a2a4b8982e242b34d96c07 Mon Sep 17 00:00:00 2001 From: Dave Borowitz Date: Thu, 11 Sep 2014 09:49:46 +0200 Subject: [PATCH] Include tip SHA-1 of notedb graph in change ETag Change-Id: I3febdf3a95fc3f2d15288e577e699f5b38fee4c5 --- .../gerrit/server/change/ChangeResource.java | 20 ++++++++++++++--- .../server/notedb/AbstractChangeNotes.java | 22 +++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeResource.java index 33eac8040d..3232f7729d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeResource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeResource.java @@ -26,6 +26,7 @@ import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.ProjectState; +import com.google.gwtorm.server.OrmException; import com.google.inject.TypeLiteral; import org.eclipse.jgit.lib.ObjectId; @@ -68,11 +69,24 @@ public class ChangeResource implements RestResource, HasETag { : 0); byte[] buf = new byte[20]; + ObjectId noteId; + try { + noteId = getNotes().loadRevision(); + } catch (OrmException e) { + noteId = null; // This ETag will be invalidated if it loads next time. + } + hashObjectId(h, noteId, buf); + // TODO(dborowitz): Include more notedb and other related refs, e.g. drafts + // and edits. + for (ProjectState p : control.getProjectControl().getProjectState().tree()) { - ObjectId id = p.getConfig().getRevision(); - MoreObjects.firstNonNull(id, ObjectId.zeroId()).copyRawTo(buf, 0); - h.putBytes(buf); + hashObjectId(h, p.getConfig().getRevision(), buf); } return h.hash().toString(); } + + private void hashObjectId(Hasher h, ObjectId id, byte[] buf) { + MoreObjects.firstNonNull(id, ObjectId.zeroId()).copyRawTo(buf, 0); + h.putBytes(buf); + } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java index f190f1fab6..80d45049be 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java @@ -21,6 +21,8 @@ import com.google.gerrit.server.git.VersionedMetaData; import com.google.gwtorm.server.OrmException; import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import java.io.IOException; @@ -69,6 +71,26 @@ public abstract class AbstractChangeNotes extends VersionedMetaData { return self(); } + public ObjectId loadRevision() throws OrmException { + if (loaded) { + return getRevision(); + } else if (!migration.enabled()) { + return null; + } + Repository repo; + try { + repo = repoManager.openMetadataRepository(getProjectName()); + try { + Ref ref = repo.getRef(getRefName()); + return ref != null ? ref.getObjectId() : null; + } finally { + repo.close(); + } + } catch (IOException e) { + throw new OrmException(e); + } + } + /** Load default values for any instance variables when notedb is disabled. */ protected abstract void loadDefaults();