keith-turner commented on code in PR #2967:
URL: https://github.com/apache/accumulo/pull/2967#discussion_r990196765


##########
core/src/main/java/org/apache/accumulo/core/clientImpl/InstanceOperationsImpl.java:
##########
@@ -119,6 +127,38 @@ public void modifyProperties(final 
Consumer<Map<String,String>> mapMutator)
     // Send to server
     ThriftClientTypes.MANAGER.executeVoid(context, client -> client
         .modifySystemProperties(TraceUtil.traceInfo(), context.rpcCreds(), 
vProperties));
+
+    return vProperties.getProperties();
+  }
+
+  @Override
+  public Map<String,String> modifyProperties(final 
Consumer<Map<String,String>> mapMutator)
+      throws AccumuloException, AccumuloSecurityException, 
IllegalArgumentException {
+
+    var log = LoggerFactory.getLogger(InstanceOperationsImpl.class);
+
+    Retry retry =
+        Retry.builder().infiniteRetries().retryAfter(25, 
MILLISECONDS).incrementBy(25, MILLISECONDS)
+            .maxWait(30, SECONDS).backOffFactor(1.5).logInterval(3, 
MINUTES).createRetry();
+
+    while (true) {
+      try {
+        var props = tryToModifyProperties(mapMutator);
+        retry.logCompletion(log, "Modifying instance properties");
+        return props;
+      } catch (ConcurrentModificationException cme) {
+        try {
+          retry.logRetry(log,
+              "Unable to modify instance properties for because of concurrent 
modification");
+          retry.waitForNextAttempt();
+        } catch (InterruptedException e) {
+          throw new RuntimeException(e);
+        }
+      } finally {
+        retry.useRetry();

Review Comment:
   > I did something similar when we were working on external compactions to 
retry thift calls - 
[RetryableThriftCall](https://github.com/apache/accumulo/blob/main/server/base/src/main/java/org/apache/accumulo/server/compaction/RetryableThriftCall.java)
   
   We need something more general like that so we can reuse retry code.  Still 
scratching my head over the best way to handle checked exceptions though.  Like 
what the most concise way to handle one operation that throws checked exception 
X and another that throws checked exception Y and these are checked exceptions 
that we want to pass up.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to