summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Milanesio <luca.milanesio@gmail.com>2022-05-31 01:04:57 -0700
committerLuca Milanesio <luca.milanesio@gmail.com>2022-05-31 20:51:08 +0000
commit06f9ed20939c5b4c38044e4bbc7476b0c6700189 (patch)
tree8c994e6dc32131d8ec7c949c23fb747562ed8f23
parent4757ad473f87f953edfd1d6d6590839d395ab390 (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.java5
-rw-r--r--java/com/google/gerrit/server/notedb/ChangeNotes.java10
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);
}