This is an automated email from the ASF dual-hosted git repository.

DomGarguilo pushed a commit to branch 2.1
in repository https://gitbox.apache.org/repos/asf/accumulo.git


The following commit(s) were added to refs/heads/2.1 by this push:
     new e63a13ac75 Stop MAC servers in parallel (#6575)
e63a13ac75 is described below

commit e63a13ac755b757532ab6f04b933f77f79739e84
Author: Dom G. <[email protected]>
AuthorDate: Thu Oct 8 10:29:59 2026 -0400

    Stop MAC servers in parallel (#6575)
    
    * Stop MAC servers in parallel
    
    * New method to wait for all procs under single timeout
---
 .../MiniAccumuloClusterControl.java                | 33 ++++------------------
 .../miniclusterImpl/MiniAccumuloClusterImpl.java   | 27 ++++++++++++++++++
 2 files changed, 33 insertions(+), 27 deletions(-)

diff --git 
a/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterControl.java
 
b/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterControl.java
index 5b83301611..492c79d417 100644
--- 
a/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterControl.java
+++ 
b/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterControl.java
@@ -349,15 +349,8 @@ public class MiniAccumuloClusterControl implements 
ClusterControl {
       case TABLET_SERVER:
         synchronized (tabletServerProcesses) {
           try {
-            for (Process tserver : tabletServerProcesses) {
-              try {
-                cluster.stopProcessWithTimeout(tserver, 30, TimeUnit.SECONDS);
-              } catch (ExecutionException | TimeoutException e) {
-                log.warn("TabletServer did not fully stop after 30 seconds", 
e);
-              } catch (InterruptedException e) {
-                Thread.currentThread().interrupt();
-              }
-            }
+            cluster.stopProcessesWithTimeout(ServerType.TABLET_SERVER, 
tabletServerProcesses, 30,
+                TimeUnit.SECONDS);
           } finally {
             tabletServerProcesses.clear();
           }
@@ -379,15 +372,8 @@ public class MiniAccumuloClusterControl implements 
ClusterControl {
       case SCAN_SERVER:
         synchronized (scanServerProcesses) {
           try {
-            for (Process sserver : scanServerProcesses) {
-              try {
-                cluster.stopProcessWithTimeout(sserver, 30, TimeUnit.SECONDS);
-              } catch (ExecutionException | TimeoutException e) {
-                log.warn("ScanServer did not fully stop after 30 seconds", e);
-              } catch (InterruptedException e) {
-                Thread.currentThread().interrupt();
-              }
-            }
+            cluster.stopProcessesWithTimeout(ServerType.SCAN_SERVER, 
scanServerProcesses, 30,
+                TimeUnit.SECONDS);
           } finally {
             scanServerProcesses.clear();
           }
@@ -409,15 +395,8 @@ public class MiniAccumuloClusterControl implements 
ClusterControl {
       case COMPACTOR:
         synchronized (compactorProcesses) {
           try {
-            for (Process compactor : compactorProcesses) {
-              try {
-                cluster.stopProcessWithTimeout(compactor, 30, 
TimeUnit.SECONDS);
-              } catch (ExecutionException | TimeoutException e) {
-                log.warn("Compactor did not fully stop after 30 seconds", e);
-              } catch (InterruptedException e) {
-                Thread.currentThread().interrupt();
-              }
-            }
+            cluster.stopProcessesWithTimeout(ServerType.COMPACTOR, 
compactorProcesses, 30,
+                TimeUnit.SECONDS);
           } finally {
             compactorProcesses.clear();
           }
diff --git 
a/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterImpl.java
 
b/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterImpl.java
index cf550433f2..4bce23d5e9 100644
--- 
a/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterImpl.java
+++ 
b/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterImpl.java
@@ -82,6 +82,7 @@ import 
org.apache.accumulo.core.manager.thrift.ManagerMonitorInfo;
 import org.apache.accumulo.core.rpc.clients.ThriftClientTypes;
 import org.apache.accumulo.core.trace.TraceUtil;
 import org.apache.accumulo.core.util.Pair;
+import org.apache.accumulo.core.util.Timer;
 import org.apache.accumulo.manager.state.SetGoalState;
 import org.apache.accumulo.minicluster.MiniAccumuloCluster;
 import org.apache.accumulo.minicluster.ServerType;
@@ -989,6 +990,32 @@ public class MiniAccumuloClusterImpl implements 
AccumuloCluster {
     return executor;
   }
 
+  /**
+   * Stops the processes in parallel. The given timeout is the total wait for 
all given processes.
+   */
+  public void stopProcessesWithTimeout(final ServerType type, final 
List<Process> procs,
+      final long timeout, final TimeUnit unit) {
+
+    // signal all first so they stop in parallel
+    procs.forEach(Process::destroy);
+
+    final Timer timer = Timer.startNew();
+    final long timeoutNanos = unit.toNanos(timeout);
+    try {
+      for (Process proc : procs) {
+        long remainingNanos = timeoutNanos - 
timer.elapsed(TimeUnit.NANOSECONDS);
+        boolean stopped = proc.waitFor(remainingNanos, TimeUnit.NANOSECONDS);
+        if (!stopped) {
+          log.warn("{} (pid {}) did not fully stop after {} seconds", type, 
proc.pid(),
+              unit.toSeconds(timeout));
+        }
+      }
+    } catch (InterruptedException e) {
+      log.warn("Interrupted while trying to stop {} processes.", type);
+      Thread.currentThread().interrupt();
+    }
+  }
+
   public int stopProcessWithTimeout(final Process proc, long timeout, TimeUnit 
unit)
       throws InterruptedException, ExecutionException, TimeoutException {
     FutureTask<Integer> future = new FutureTask<>(() -> {

Reply via email to