summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaushik Lingarkar <kaushik.lingarkar@linaro.org>2023-09-20 15:52:41 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2023-09-20 15:52:41 +0000
commit40715f5ee6f5e321a35d47318ea037f71c05bf4e (patch)
tree80136257609a7b0fdc57d9a2c8a6d4dea42d8413
parentd2279cb4f17bb2266218a97fe993d8bf9f9df9fd (diff)
parent755671a6ac6f8ca0eff5a123ab1035902393829f (diff)
Merge "Retry SSH set-reviewers cmd on lock failures" into stable-3.5
-rw-r--r--java/com/google/gerrit/sshd/commands/SetReviewersCommand.java35
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);
}
}