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()));