Use RetryHelper since NotesBranchUtil doesn't retry anymore
Change-Id: Ie35f87fd4ac150eaf1019108134c417d5786c607
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/CreateReviewNotes.java b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/CreateReviewNotes.java
index 0ed3689..41b319f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/CreateReviewNotes.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/CreateReviewNotes.java
@@ -28,6 +28,7 @@
import com.google.gerrit.server.account.AccountCache;
import com.google.gerrit.server.config.AnonymousCowardName;
import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.git.LockFailureException;
import com.google.gerrit.server.git.NotesBranchUtil;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.project.ChangeControl;
@@ -43,7 +44,6 @@
import java.io.IOException;
import java.util.Collections;
import java.util.List;
-import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lib.Constants;
@@ -191,7 +191,7 @@
}
}
- void commitNotes() throws IOException, ConcurrentRefUpdateException {
+ void commitNotes() throws LockFailureException, IOException {
try {
if (reviewNotes == null) {
return;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ExportReviewNotes.java b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ExportReviewNotes.java
index 520ae0a..86f87a8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ExportReviewNotes.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ExportReviewNotes.java
@@ -14,15 +14,20 @@
package com.googlesource.gerrit.plugins.reviewnotes;
+import com.github.rholder.retry.Attempt;
+import com.github.rholder.retry.RetryListener;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.MultimapBuilder;
+import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.UpdateException;
import com.google.gerrit.sshd.SshCommand;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.SchemaFactory;
@@ -30,7 +35,6 @@
import java.io.IOException;
import java.util.List;
import java.util.Map;
-import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.TextProgressMonitor;
@@ -50,6 +54,8 @@
@Inject private ChangeNotes.Factory notesFactory;
+ @Inject private RetryHelper retryHelper;
+
private ListMultimap<Project.NameKey, ChangeNotes> changes;
private ThreadSafeProgressMonitor monitor;
@@ -85,16 +91,24 @@
}
private void export(ReviewDb db, Project.NameKey project, List<ChangeNotes> notes)
- throws IOException, OrmException {
- try (Repository git = gitManager.openRepository(project)) {
- CreateReviewNotes crn = reviewNotesFactory.create(db, project, git);
- crn.createNotes(notes, monitor);
- crn.commitNotes();
- } catch (RepositoryNotFoundException e) {
- stderr.println("Unable to open project: " + project.get());
- } catch (ConcurrentRefUpdateException e) {
- stderr.println(e.getMessage());
- }
+ throws RestApiException, UpdateException {
+ retryHelper.execute(
+ updateFactory -> {
+ try (Repository git = gitManager.openRepository(project)) {
+ CreateReviewNotes crn = reviewNotesFactory.create(db, project, git);
+ crn.createNotes(notes, monitor);
+ crn.commitNotes();
+ } catch (RepositoryNotFoundException e) {
+ stderr.println("Unable to open project: " + project.get());
+ }
+ return null;
+ },
+ new RetryListener() {
+ @Override
+ public <V> void onRetry(Attempt<V> attempt) {
+ monitor.update(-notes.size());
+ }
+ });
}
private Map.Entry<Project.NameKey, List<ChangeNotes>> next() {
@@ -117,7 +131,7 @@
if (next != null) {
try {
export(db, next.getKey(), next.getValue());
- } catch (OrmException | IOException e) {
+ } catch (RestApiException | UpdateException e) {
stderr.println(e.getMessage());
}
} else {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/RefUpdateListener.java b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/RefUpdateListener.java
index f261832..0b040b9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/RefUpdateListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/RefUpdateListener.java
@@ -15,18 +15,18 @@
package com.googlesource.gerrit.plugins.reviewnotes;
import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.ProjectRunnable;
import com.google.gerrit.server.git.WorkQueue;
-import com.google.gwtorm.server.OrmException;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.UpdateException;
import com.google.gwtorm.server.SchemaFactory;
import com.google.inject.Inject;
-import java.io.IOException;
import java.util.concurrent.Future;
-import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
@@ -41,6 +41,7 @@
private final SchemaFactory<ReviewDb> schema;
private final GitRepositoryManager repoManager;
private final WorkQueue workQueue;
+ private final RetryHelper retryHelper;
private final boolean async;
@Inject
@@ -49,11 +50,13 @@
SchemaFactory<ReviewDb> schema,
GitRepositoryManager repoManager,
WorkQueue workQueue,
+ RetryHelper retryHelper,
@GerritServerConfig Config config) {
this.reviewNotesFactory = reviewNotesFactory;
this.schema = schema;
this.repoManager = repoManager;
this.workQueue = workQueue;
+ this.retryHelper = retryHelper;
this.async = config.getBoolean("reviewnotes", null, "async", false);
}
@@ -95,19 +98,25 @@
}
private void createReviewNotes(Event e) {
- Project.NameKey projectName = new Project.NameKey(e.getProjectName());
- try (Repository git = repoManager.openRepository(projectName);
- ReviewDb reviewDb = schema.open()) {
- CreateReviewNotes crn = reviewNotesFactory.create(reviewDb, projectName, git);
- if (e.getRefName().startsWith("refs/heads/")) {
- crn.createNotes(
- e.getRefName(),
- ObjectId.fromString(e.getOldObjectId()),
- ObjectId.fromString(e.getNewObjectId()),
- null);
- crn.commitNotes();
- }
- } catch (OrmException | IOException | ConcurrentRefUpdateException x) {
+ try {
+ retryHelper.execute(
+ updateFactory -> {
+ Project.NameKey projectName = new Project.NameKey(e.getProjectName());
+ try (Repository git = repoManager.openRepository(projectName);
+ ReviewDb reviewDb = schema.open()) {
+ CreateReviewNotes crn = reviewNotesFactory.create(reviewDb, projectName, git);
+ if (e.getRefName().startsWith("refs/heads/")) {
+ crn.createNotes(
+ e.getRefName(),
+ ObjectId.fromString(e.getOldObjectId()),
+ ObjectId.fromString(e.getNewObjectId()),
+ null);
+ crn.commitNotes();
+ }
+ }
+ return null;
+ });
+ } catch (RestApiException | UpdateException x) {
log.error(x.getMessage(), x);
}
}