Wrap ref updates in the correct RefUpdateContext.
Bug: Google b/261005032
Release-Notes: skip
Forward-Compatible: checked
Change-Id: If48c444ad172038896f43076ea8f1e03cf32afa1
diff --git a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java
index c242f68..a65bf95 100644
--- a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java
+++ b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java
@@ -16,6 +16,7 @@
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static com.google.gerrit.testing.TestActionRefUpdateContext.testRefAction;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.stream.Collectors.toList;
import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
@@ -301,7 +302,7 @@
TestRepository<Repository> testRepo = new TestRepository<>(repo)) {
RefUpdate ru = testRepo.getRepository().updateRef(checkerUuid.toRefName(), true);
ru.setForceUpdate(true);
- ru.delete();
+ testRefAction(() -> ru.delete());
}
}
}
diff --git a/java/com/google/gerrit/plugins/checks/db/CheckerRefMigration.java b/java/com/google/gerrit/plugins/checks/db/CheckerRefMigration.java
index 40eb858..e539fe7 100644
--- a/java/com/google/gerrit/plugins/checks/db/CheckerRefMigration.java
+++ b/java/com/google/gerrit/plugins/checks/db/CheckerRefMigration.java
@@ -13,11 +13,15 @@
// limitations under the License.
package com.google.gerrit.plugins.checks.db;
+import static com.google.gerrit.server.update.context.RefUpdateContext.RefUpdateType.OFFLINE_OPERATION;
+import static com.google.gerrit.server.update.context.RefUpdateContext.RefUpdateType.PLUGIN;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.gerrit.entities.Project;
import com.google.gerrit.pgm.init.api.AllProjectsNameOnInitProvider;
import com.google.gerrit.plugins.checks.CheckerRef;
import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.update.context.RefUpdateContext;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
@@ -49,7 +53,9 @@
}
public void migrate() throws Exception {
- try (Repository repo = repoManager.openRepository(allProjectsName)) {
+ try (Repository repo = repoManager.openRepository(allProjectsName);
+ RefUpdateContext pluginCtx = RefUpdateContext.open(PLUGIN);
+ RefUpdateContext ctx = RefUpdateContext.open(OFFLINE_OPERATION)) {
// This part is specifically for cases where the rename failed half-way last time.
Ref ref = repo.exactRef(TMP_REF);
@@ -68,7 +74,8 @@
ex.getMessage()
+ " Ensure that refs/tmp/checker-migration doesn't exist. Also,"
+ "ensure that refs/meta/checkers/ (with trailing '/') has been migrated to refs/meta/checkers (without "
- + "trailing '/'). Consider documentation for updating refs manually: https://git-scm.com/docs/git-update-ref");
+ + "trailing '/'). Consider documentation for updating refs manually: https://git-scm.com/docs/git-update-ref",
+ ex);
}
}
diff --git a/java/com/google/gerrit/plugins/checks/db/NoteDbCheckersUpdate.java b/java/com/google/gerrit/plugins/checks/db/NoteDbCheckersUpdate.java
index e84e129..45f0952 100644
--- a/java/com/google/gerrit/plugins/checks/db/NoteDbCheckersUpdate.java
+++ b/java/com/google/gerrit/plugins/checks/db/NoteDbCheckersUpdate.java
@@ -14,6 +14,9 @@
package com.google.gerrit.plugins.checks.db;
+import static com.google.gerrit.server.update.context.RefUpdateContext.RefUpdateType.PLUGIN;
+import static com.google.gerrit.server.update.context.RefUpdateContext.RefUpdateType.VERSIONED_META_DATA_CHANGE;
+
import com.google.common.base.Throwables;
import com.google.gerrit.entities.Project;
import com.google.gerrit.exceptions.DuplicateKeyException;
@@ -32,6 +35,7 @@
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.meta.MetaDataUpdate;
import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.context.RefUpdateContext;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
import java.io.IOException;
@@ -181,12 +185,16 @@
CheckersByRepositoryNotes checkersByRepositoryNotes)
throws IOException {
BatchRefUpdate batchRefUpdate = allProjectsRepo.getRefDatabase().newBatchUpdate();
- try (MetaDataUpdate metaDataUpdate =
- metaDataUpdateFactory.create(allProjectsName, allProjectsRepo, batchRefUpdate)) {
- checkerConfig.commit(metaDataUpdate);
- checkersByRepositoryNotes.commit(metaDataUpdate);
+ try (RefUpdateContext pluginCtx = RefUpdateContext.open(PLUGIN)) {
+ try (RefUpdateContext ctx = RefUpdateContext.open(VERSIONED_META_DATA_CHANGE)) {
+ try (MetaDataUpdate metaDataUpdate =
+ metaDataUpdateFactory.create(allProjectsName, allProjectsRepo, batchRefUpdate)) {
+ checkerConfig.commit(metaDataUpdate);
+ checkersByRepositoryNotes.commit(metaDataUpdate);
+ }
+ RefUpdateUtil.executeChecked(batchRefUpdate, allProjectsRepo);
+ }
}
- RefUpdateUtil.executeChecked(batchRefUpdate, allProjectsRepo);
gitRefUpdated.fire(
allProjectsName, batchRefUpdate, currentUser.map(user -> user.state()).orElse(null));
diff --git a/java/com/google/gerrit/plugins/checks/db/NoteDbChecksUpdate.java b/java/com/google/gerrit/plugins/checks/db/NoteDbChecksUpdate.java
index 47de092..11e822d 100644
--- a/java/com/google/gerrit/plugins/checks/db/NoteDbChecksUpdate.java
+++ b/java/com/google/gerrit/plugins/checks/db/NoteDbChecksUpdate.java
@@ -15,6 +15,8 @@
package com.google.gerrit.plugins.checks.db;
import static com.google.gerrit.plugins.checks.CheckerRef.checksRef;
+import static com.google.gerrit.server.update.context.RefUpdateContext.RefUpdateType.CHANGE_MODIFICATION;
+import static com.google.gerrit.server.update.context.RefUpdateContext.RefUpdateType.PLUGIN;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
@@ -36,6 +38,7 @@
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.notedb.ChangeNoteUtil;
import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.context.RefUpdateContext;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
import java.io.ByteArrayOutputStream;
@@ -171,45 +174,49 @@
if (operation == Operation.CREATE) {
assertCheckerIsPresent(checkKey.checkerUuid());
}
+ try (RefUpdateContext pluginCtx = RefUpdateContext.open(PLUGIN)) {
+ try (RefUpdateContext ctx = RefUpdateContext.open(CHANGE_MODIFICATION)) {
+ try (Repository repo = repoManager.openRepository(checkKey.repository());
+ ObjectInserter objectInserter = repo.newObjectInserter();
+ RevWalk rw = new RevWalk(repo)) {
+ Ref checkRef = repo.getRefDatabase().exactRef(checksRef(checkKey.patchSet().changeId()));
+ ObjectId parent = checkRef == null ? ObjectId.zeroId() : checkRef.getObjectId();
+ CommitBuilder cb;
+ String message;
+ if (operation == Operation.CREATE) {
+ message = "Insert check " + checkKey.checkerUuid();
+ cb = commitBuilder(message, parent);
+ } else {
+ message = "Update check " + checkKey.checkerUuid();
+ cb = commitBuilder(message, parent);
+ }
- try (Repository repo = repoManager.openRepository(checkKey.repository());
- ObjectInserter objectInserter = repo.newObjectInserter();
- RevWalk rw = new RevWalk(repo)) {
- Ref checkRef = repo.getRefDatabase().exactRef(checksRef(checkKey.patchSet().changeId()));
- ObjectId parent = checkRef == null ? ObjectId.zeroId() : checkRef.getObjectId();
- CommitBuilder cb;
- String message;
- if (operation == Operation.CREATE) {
- message = "Insert check " + checkKey.checkerUuid();
- cb = commitBuilder(message, parent);
- } else {
- message = "Update check " + checkKey.checkerUuid();
- cb = commitBuilder(message, parent);
+ boolean dirty =
+ updateNotesMap(
+ checkKey, checkUpdate, repo, rw, objectInserter, parent, cb, operation);
+ if (!dirty) {
+ // This update is a NoOp, so omit writing a commit with the same tree.
+ return readSingleCheck(checkKey, repo, rw, checkRef.getObjectId());
+ }
+
+ ObjectId newCommitId = objectInserter.insert(cb);
+ objectInserter.flush();
+
+ String refName = CheckerRef.checksRef(checkKey.patchSet().changeId());
+ RefUpdate refUpdate = repo.updateRef(refName);
+ refUpdate.setExpectedOldObjectId(parent);
+ refUpdate.setNewObjectId(newCommitId);
+ refUpdate.setRefLogIdent(personIdent);
+ refUpdate.setRefLogMessage(message, false);
+ refUpdate.update();
+ RefUpdateUtil.checkResult(refUpdate);
+
+ combinedCheckStateCache.updateIfNecessary(checkKey.repository(), checkKey.patchSet());
+ gitRefUpdated.fire(
+ checkKey.repository(), refUpdate, currentUser.map(user -> user.state()).orElse(null));
+ return readSingleCheck(checkKey, repo, rw, newCommitId);
+ }
}
-
- boolean dirty =
- updateNotesMap(checkKey, checkUpdate, repo, rw, objectInserter, parent, cb, operation);
- if (!dirty) {
- // This update is a NoOp, so omit writing a commit with the same tree.
- return readSingleCheck(checkKey, repo, rw, checkRef.getObjectId());
- }
-
- ObjectId newCommitId = objectInserter.insert(cb);
- objectInserter.flush();
-
- String refName = CheckerRef.checksRef(checkKey.patchSet().changeId());
- RefUpdate refUpdate = repo.updateRef(refName);
- refUpdate.setExpectedOldObjectId(parent);
- refUpdate.setNewObjectId(newCommitId);
- refUpdate.setRefLogIdent(personIdent);
- refUpdate.setRefLogMessage(message, false);
- refUpdate.update();
- RefUpdateUtil.checkResult(refUpdate);
-
- combinedCheckStateCache.updateIfNecessary(checkKey.repository(), checkKey.patchSet());
- gitRefUpdated.fire(
- checkKey.repository(), refUpdate, currentUser.map(user -> user.state()).orElse(null));
- return readSingleCheck(checkKey, repo, rw, newCommitId);
}
}
diff --git a/javatests/com/google/gerrit/plugins/checks/acceptance/CheckerRefsIT.java b/javatests/com/google/gerrit/plugins/checks/acceptance/CheckerRefsIT.java
index e9cadf3..dfeeb11 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/CheckerRefsIT.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/CheckerRefsIT.java
@@ -21,6 +21,7 @@
import static com.google.gerrit.acceptance.testsuite.project.TestProjectUpdate.allowLabel;
import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
import static com.google.gerrit.testing.GerritJUnit.assertThrows;
+import static com.google.gerrit.testing.TestActionRefUpdateContext.testRefAction;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.acceptance.SkipProjectClone;
@@ -329,7 +330,7 @@
updateFactory.create(project, identifiedUserFactory.create(admin.id()), TimeUtil.now())) {
bu.setRepository(git, rw, oi);
bu.insertChange(ins);
- bu.execute();
+ testRefAction(() -> bu.execute());
}
return changeId.toString();
}