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