diff options
author | Kaushik Lingarkar <kaushik.lingarkar@linaro.org> | 2023-09-20 15:52:41 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2023-09-20 15:52:41 +0000 |
commit | 40715f5ee6f5e321a35d47318ea037f71c05bf4e (patch) | |
tree | 80136257609a7b0fdc57d9a2c8a6d4dea42d8413 | |
parent | d2279cb4f17bb2266218a97fe993d8bf9f9df9fd (diff) | |
parent | 755671a6ac6f8ca0eff5a123ab1035902393829f (diff) |
Merge "Retry SSH set-reviewers cmd on lock failures" into stable-3.5
-rw-r--r-- | java/com/google/gerrit/sshd/commands/SetReviewersCommand.java | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java b/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java index 4f23d1df83..f42eb5cb53 100644 --- a/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java +++ b/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java @@ -27,6 +27,8 @@ import com.google.gerrit.server.permissions.PermissionBackendException; import com.google.gerrit.server.project.ProjectState; import com.google.gerrit.server.restapi.change.DeleteReviewer; import com.google.gerrit.server.restapi.change.PostReviewers; +import com.google.gerrit.server.update.RetryHelper; +import com.google.gerrit.server.update.RetryableAction; import com.google.gerrit.sshd.ChangeArgumentParser; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; @@ -89,6 +91,8 @@ public class SetReviewersCommand extends SshCommand { @Inject private ChangeArgumentParser changeArgumentParser; + @Inject private RetryHelper retryHelper; + private Set<Account.Id> toRemove = new HashSet<>(); private Map<Change.Id, ChangeResource> changes = new LinkedHashMap<>(); @@ -121,7 +125,15 @@ public class SetReviewersCommand extends SshCommand { ReviewerResource rsrc = reviewerFactory.create(changeRsrc, reviewer); String error = null; try { - deleteReviewer.apply(rsrc, new DeleteReviewerInput()); + retryHelper + .action( + RetryableAction.ActionType.CHANGE_UPDATE, + "removeReviewers", + () -> { + deleteReviewer.apply(rsrc, new DeleteReviewerInput()); + return null; + }) + .call(); } catch (ResourceNotFoundException e) { error = String.format("could not remove %s: not found", reviewer); } catch (Exception e) { @@ -139,15 +151,26 @@ public class SetReviewersCommand extends SshCommand { ReviewerInput input = new ReviewerInput(); input.reviewer = reviewer; input.confirmed = true; - String error; + var error = + new Object() { + String value; + }; try { - error = postReviewers.apply(changeRsrc, input).value().error; + retryHelper + .action( + RetryableAction.ActionType.CHANGE_UPDATE, + "applyReview", + () -> { + error.value = postReviewers.apply(changeRsrc, input).value().error; + return null; + }) + .call(); } catch (Exception e) { - error = String.format("could not add %s: %s", reviewer, e.getMessage()); + error.value = String.format("could not add %s: %s", reviewer, e.getMessage()); } - if (error != null) { + if (error.value != null) { ok = false; - writeError("error", error); + writeError("error", error.value); } } |