diff options
author | Luca Milanesio <luca.milanesio@gmail.com> | 2022-05-31 01:04:57 -0700 |
---|---|---|
committer | Luca Milanesio <luca.milanesio@gmail.com> | 2022-05-31 20:51:08 +0000 |
commit | 06f9ed20939c5b4c38044e4bbc7476b0c6700189 (patch) | |
tree | 8c994e6dc32131d8ec7c949c23fb747562ed8f23 | |
parent | 4757ad473f87f953edfd1d6d6590839d395ab390 (diff) |
Fix RepoRefCache stale checks during NoteDb rebuild
When rebuilding NoteDb meta-data from ReviewDb we are
actually mutating the /meta ref during a reindexing
operation.
This is an edge case that happens only once during
the on-line NoteDb upgrade and the trial mode.
Adapt the RepoRefCache use during NoteDb reindexing
and manage the situation where a staleness check
applies to a ref that has disappeared on disk.
Bug: Issue 15961
Release-Notes: skip
Change-Id: Iac642eb7a9b24882a0c77dbaee24853fb0b29827
-rw-r--r-- | java/com/google/gerrit/server/git/RepoRefCache.java | 5 | ||||
-rw-r--r-- | java/com/google/gerrit/server/notedb/ChangeNotes.java | 10 |
2 files changed, 10 insertions, 5 deletions
diff --git a/java/com/google/gerrit/server/git/RepoRefCache.java b/java/com/google/gerrit/server/git/RepoRefCache.java index c813b8375b..4fa33118f5 100644 --- a/java/com/google/gerrit/server/git/RepoRefCache.java +++ b/java/com/google/gerrit/server/git/RepoRefCache.java @@ -136,8 +136,9 @@ public class RepoRefCache implements RefCache { } try { - ObjectId diskId = refdb.exactRef(refName).getObjectId(); - boolean isStale = !Optional.ofNullable(diskId).equals(id); + Optional<ObjectId> diskId = + Optional.ofNullable(refdb.exactRef(refName)).map(Ref::getObjectId); + boolean isStale = !diskId.equals(id); if (isStale) { log.atSevere().log( "Repository " diff --git a/java/com/google/gerrit/server/notedb/ChangeNotes.java b/java/com/google/gerrit/server/notedb/ChangeNotes.java index 3bceeeecda..e1f415d331 100644 --- a/java/com/google/gerrit/server/notedb/ChangeNotes.java +++ b/java/com/google/gerrit/server/notedb/ChangeNotes.java @@ -763,15 +763,19 @@ public class ChangeNotes extends AbstractChangeNotes<ChangeNotes> { refs = newRefCache; } + boolean changeUpToDate = true; try { - if (!NoteDbChangeState.isChangeUpToDate(state, refs, getChangeId())) { - return rebuildAndOpen(repo, id); - } + changeUpToDate = NoteDbChangeState.isChangeUpToDate(state, refs, getChangeId()); } finally { if (newRefCache != null) { + // RepoRefCache needs to be closed for preventing caching before + // any potential mutation happens with rebuildAndOpen() newRefCache.close(); } } + if (!changeUpToDate) { + return rebuildAndOpen(repo, id); + } } return super.openHandle(repo); } |