Merge changes I64000a57,Icc7c7586

* changes:
  ChangeIndexer: Disable auto-rebuilding changes
  ChangeNotes: Log when recheckUpToDate finds it wasn't
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
index fd205991..a63688b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
@@ -420,7 +420,7 @@
   public void index() throws RestApiException {
     try {
       index.apply(change, new Index.Input());
-    } catch (IOException e) {
+    } catch (IOException | OrmException e) {
       throw new RestApiException("Cannot index change", e);
     }
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Index.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Index.java
index 0d282c5..44a9975 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Index.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Index.java
@@ -21,6 +21,7 @@
 import com.google.gerrit.server.change.Index.Input;
 import com.google.gerrit.server.index.change.ChangeIndexer;
 import com.google.gerrit.server.project.ChangeControl;
+import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
@@ -44,7 +45,7 @@
 
   @Override
   public Response<?> apply(ChangeResource rsrc, Input input)
-      throws IOException, AuthException {
+      throws IOException, AuthException, OrmException {
     ChangeControl ctl = rsrc.getControl();
     if (!ctl.isOwner()
         && !ctl.getUser().getCapabilities().canMaintainServer()) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
index 244c64c..bc9cb82 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
@@ -36,6 +36,7 @@
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.index.change.ChangeIndexer;
 import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
@@ -119,9 +120,10 @@
    * @throws IOException
    * @throws ResourceConflictException When change edit already
    * exists for the change
+   * @throws OrmException
    */
   public RefUpdate.Result createEdit(Change change, PatchSet ps)
-      throws AuthException, IOException, ResourceConflictException {
+      throws AuthException, IOException, ResourceConflictException, OrmException {
     if (!currentUser.get().isIdentifiedUser()) {
       throw new AuthException("Authentication required");
     }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
index bfa3188..8e6ba45 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
@@ -200,9 +200,10 @@
    *
    * @param edit change edit to delete
    * @throws IOException
+   * @throws OrmException
    */
   public void delete(ChangeEdit edit)
-      throws IOException {
+      throws IOException, OrmException {
     Change change = edit.getChange();
     try (Repository repo = gitManager.openRepository(change.getProject())) {
       deleteRef(repo, edit);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexer.java
index 0ca9922..d389ccf 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexer.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexer.java
@@ -27,6 +27,8 @@
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.extensions.events.ChangeIndexedListener;
 import com.google.gerrit.server.index.Index;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.NotesMigration;
 import com.google.gerrit.server.query.change.ChangeData;
 import com.google.gerrit.server.util.RequestContext;
 import com.google.gerrit.server.util.ThreadLocalRequestContext;
@@ -94,6 +96,8 @@
   private final ChangeIndexCollection indexes;
   private final ChangeIndex index;
   private final SchemaFactory<ReviewDb> schemaFactory;
+  private final NotesMigration notesMigration;
+  private final ChangeNotes.Factory changeNotesFactory;
   private final ChangeData.Factory changeDataFactory;
   private final ThreadLocalRequestContext context;
   private final ListeningExecutorService executor;
@@ -101,6 +105,8 @@
 
   @AssistedInject
   ChangeIndexer(SchemaFactory<ReviewDb> schemaFactory,
+      NotesMigration notesMigration,
+      ChangeNotes.Factory changeNotesFactory,
       ChangeData.Factory changeDataFactory,
       ThreadLocalRequestContext context,
       DynamicSet<ChangeIndexedListener> indexedListener,
@@ -108,6 +114,8 @@
       @Assisted ChangeIndex index) {
     this.executor = executor;
     this.schemaFactory = schemaFactory;
+    this.notesMigration = notesMigration;
+    this.changeNotesFactory = changeNotesFactory;
     this.changeDataFactory = changeDataFactory;
     this.context = context;
     this.index = index;
@@ -117,6 +125,8 @@
 
   @AssistedInject
   ChangeIndexer(SchemaFactory<ReviewDb> schemaFactory,
+      NotesMigration notesMigration,
+      ChangeNotes.Factory changeNotesFactory,
       ChangeData.Factory changeDataFactory,
       ThreadLocalRequestContext context,
       DynamicSet<ChangeIndexedListener> indexedListener,
@@ -124,6 +134,8 @@
       @Assisted ChangeIndexCollection indexes) {
     this.executor = executor;
     this.schemaFactory = schemaFactory;
+    this.notesMigration = notesMigration;
+    this.changeNotesFactory = changeNotesFactory;
     this.changeDataFactory = changeDataFactory;
     this.context = context;
     this.index = null;
@@ -189,8 +201,23 @@
    * @param db review database.
    * @param change change to index.
    */
-  public void index(ReviewDb db, Change change) throws IOException {
-    index(changeDataFactory.create(db, change));
+  public void index(ReviewDb db, Change change)
+      throws IOException, OrmException {
+    ChangeData cd;
+    if (notesMigration.readChanges()) {
+      cd = changeDataFactory.create(db, change);
+    } else if (notesMigration.writeChanges()) {
+      // Auto-rebuilding when NoteDb reads are disabled just increases
+      // contention on the meta ref from a background indexing thread with
+      // little benefit. The next actual write to the entity may still incur a
+      // less-contentious rebuild.
+      ChangeNotes notes =
+          changeNotesFactory.createWithAutoRebuildingDisabled(change, null);
+      cd = changeDataFactory.create(db, notes);
+    } else {
+      cd = changeDataFactory.create(db, change);
+    }
+    index(cd);
   }
 
   /**
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java
index 6a052f9..2440867 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java
@@ -621,6 +621,8 @@
       throw e;
     }
     if (!upToDate) {
+      log.warn("Rechecked change {} after a rebuild error, but it was not up to"
+          + " date; rethrowing exception", getChangeId());
       throw e;
     }
     change = new Change(newChange);
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java
index f2c858e..94f35a8 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java
@@ -58,7 +58,7 @@
     for (ChangeResource rsrc : changes.values()) {
       try {
         index.apply(rsrc, new Index.Input());
-      } catch (IOException | RestApiException e) {
+      } catch (IOException | RestApiException | OrmException e) {
         ok = false;
         writeError("error", String.format(
             "failed to index change %s: %s", rsrc.getId(), e.getMessage()));