Reindex unconditionally in MergeabilityChecker, not in Mergeable

Don't try to guess whether Mergeable will reindex. Turn off
reindexing in that code path and do it explicitly in
MergeabilityChecker.

Change-Id: I2a9df574e30fe469134b9f2d47a134833cd5565e
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecker.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecker.java
index cc20608..270f718 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecker.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecker.java
@@ -35,7 +35,6 @@
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.change.MergeabilityChecksExecutor.Priority;
-import com.google.gerrit.server.change.Mergeable.MergeableInfo;
 import com.google.gerrit.server.git.MetaDataUpdate;
 import com.google.gerrit.server.git.ProjectConfig;
 import com.google.gerrit.server.git.WorkQueue.Executor;
@@ -150,20 +149,18 @@
               List<ListenableFuture<?>> result =
                   Lists.newArrayListWithCapacity(changes.size());
               for (final Change c : changes) {
-                ListenableFuture<Boolean> b =
-                    executor.submit(new Task(c, force));
+                // Don't try to guess whether Mergeable will reindex; just turn
+                // off reindexing in that code path and do it explicitly below.
+                ListenableFuture<Void> b =
+                    executor.submit(new Task(c, force, !reindex));
                 if (reindex) {
                   result.add(Futures.transform(
-                      b, new AsyncFunction<Boolean, Object>() {
+                      b, new AsyncFunction<Void, Void>() {
                         @SuppressWarnings("unchecked")
                         @Override
-                        public ListenableFuture<Object> apply(
-                            Boolean indexUpdated) throws Exception {
-                          if (!indexUpdated) {
-                            return (ListenableFuture<Object>)
-                                indexer.indexAsync(c.getId());
-                          }
-                          return Futures.immediateFuture(null);
+                        public ListenableFuture<Void> apply(Void o) {
+                          return (ListenableFuture<Void>)
+                              indexer.indexAsync(c.getId());
                         }
                       }));
                 } else {
@@ -291,19 +288,21 @@
     return ProjectConfig.read(metaDataUpdateFactory.create(p), id);
   }
 
-  private class Task implements Callable<Boolean> {
+  private class Task implements Callable<Void> {
     private final Change change;
     private final boolean force;
+    private final boolean reindex;
 
     private ReviewDb reviewDb;
 
-    Task(Change change, boolean force) {
+    Task(Change change, boolean force, boolean reindex) {
       this.change = change;
       this.force = force;
+      this.reindex = reindex;
     }
 
     @Override
-    public Boolean call() throws Exception {
+    public Void call() throws Exception {
       mergeabilityCheckQueue.updatingMergeabilityFlag(change, force);
 
       RequestContext context = new RequestContext() {
@@ -335,20 +334,20 @@
         PatchSet ps = db.patchSets().get(change.currentPatchSetId());
         if (ps == null) {
           // Cannot compute mergeability if current patch set is missing.
-          return false;
+          return null;
         }
 
         Mergeable m = mergeable.get();
         m.setForce(force);
+        m.setReindex(reindex);
 
         ChangeControl control =
             changeControlFactory.controlFor(change, context.getCurrentUser());
-        MergeableInfo info = m.apply(
-            new RevisionResource(new ChangeResource(control), ps));
-        return change.isMergeable() != info.mergeable;
+        m.apply(new RevisionResource(new ChangeResource(control), ps));
+        return null;
       } catch (ResourceConflictException e) {
         // change is closed
-        return false;
+        return null;
       } catch (Exception e) {
         log.error(String.format(
             "cannot update mergeability flag of change %d in project %s after update of %s",
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java
index f151792..3605868 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java
@@ -82,6 +82,10 @@
     this.force = force;
   }
 
+  public void setReindex(boolean reindex) {
+    this.reindex = reindex;
+  }
+
   private final GitRepositoryManager gitManager;
   private final ProjectCache projectCache;
   private final ChangeData.Factory changeDataFactory;
@@ -90,6 +94,7 @@
   private final ChangeIndexer indexer;
 
   private boolean force;
+  private boolean reindex;
 
   @Inject
   Mergeable(GitRepositoryManager gitManager,
@@ -104,6 +109,7 @@
     this.submitStrategyFactory = submitStrategyFactory;
     this.db = db;
     this.indexer = indexer;
+    reindex = true;
   }
 
   @Override
@@ -197,7 +203,7 @@
             }
           }
         });
-    if (c != null) {
+    if (reindex && c != null) {
       indexer.index(db.get(), c);
     }
     return mergeable;