Prevent infinite event processing with NoteDb
When using NoteDb, the assignment of owners to a particular change
might update the meta refs, which in turn would trigger the processing of
a new GitReferenceUpdate event and thus generating an infinite loop.
This change prevents this situation by making sure that meta refs
updates are not processed by the GitRefListener.
Bug: Issue 9756
Change-Id: Ief0a82b877d7b1446ba2b9bf04f9f25a2cc866b2
diff --git a/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java b/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java
index f45e7a0..c3600e3 100644
--- a/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java
+++ b/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java
@@ -29,6 +29,7 @@
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.patch.PatchList;
import com.google.gerrit.server.patch.PatchListCache;
@@ -46,8 +47,6 @@
public class GitRefListener implements GitReferenceUpdatedListener {
private static final Logger logger = LoggerFactory.getLogger(GitRefListener.class);
- private static final String CHANGES_REF = "refs/changes/";
-
private final GerritApi api;
private final PatchListCache patchListCache;
@@ -89,8 +88,9 @@
}
private void processEvent(Repository repository, Event event) {
- if (event.getRefName().startsWith(CHANGES_REF)) {
- Change.Id cId = Change.Id.fromRef(event.getRefName());
+ final String refName = event.getRefName();
+ if (refName.startsWith(RefNames.REFS_CHANGES) && !RefNames.isNoteDbMetaRef(refName)) {
+ Change.Id cId = Change.Id.fromRef(refName);
Changes changes = api.changes();
// The provider injected by Gerrit is shared with other workers on the
// same local thread and thus cannot be closed in this event listener.