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.