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