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

mblow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git

commit de6041e1742f404aefd83dd622e796f0f8edaa7f
Author: Michael Blow <michael.b...@couchbase.com>
AuthorDate: Sat Jun 28 16:47:05 2025 -0400

    [NO ISSUE][HTTP][MISC] += ClusterStateManager.isPendingRemoval, HTTP stop 
bind at shutdown
    
    * [NO ISSUE][HYR][*DB][HTTP] Stop accepting web connections at shutdown
    * [NO ISSUE][*DB][MISC] += ClusterStateManager.isPendingRemoval
    
    Ext-ref: MB-68075
    Change-Id: I5b136c5a7ca847e3f96073bacf84e62b660a6959
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20214
    Reviewed-by: Michael Blow <mb...@apache.org>
    Tested-by: Michael Blow <mb...@apache.org>
---
 .../asterix/hyracks/bootstrap/CCApplication.java   |  1 +
 .../asterix/hyracks/bootstrap/NCApplication.java   |  1 +
 .../common/cluster/IClusterStateManager.java       |  4 ++++
 .../asterix/runtime/utils/ClusterStateManager.java |  6 ++++++
 .../org/apache/hyracks/http/server/HttpServer.java |  6 +++---
 .../org/apache/hyracks/http/server/WebManager.java | 23 ++++++++++++++++++++++
 6 files changed, 38 insertions(+), 3 deletions(-)

diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java
index 6928b64a0b..4e35ade636 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java
@@ -300,6 +300,7 @@ public class CCApplication extends BaseCCApplication {
     public void stop() throws Exception {
         LOGGER.info("Stopping Asterix cluster controller");
         super.stop();
+        webManager.closeChannels(); // stop accepting new requests
         appCtx.getClusterStateManager().setState(SHUTTING_DOWN);
         ((ActiveNotificationHandler) 
appCtx.getActiveNotificationHandler()).stop();
         AsterixStateProxy.unregisterRemoteObject();
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
index 0da4e0db83..0e6a04be20 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
@@ -299,6 +299,7 @@ public class NCApplication extends BaseNCApplication {
 
     @Override
     public void preStop() throws Exception {
+        webManager.closeChannels();
         runtimeContext.preStop();
     }
 
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java
index a5d503b8c3..6c0982a38e 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java
@@ -248,6 +248,10 @@ public interface IClusterStateManager {
 
     Map<String, Map<IOption, Object>> getActiveNcConfiguration();
 
+    Set<String> getNodesPendingRemoval();
+
+    boolean isPendingRemoval(String nodeId);
+
     /**
      * Sets the cluster partition in which metadata datasets stored
      *
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/ClusterStateManager.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/ClusterStateManager.java
index 444d91bd32..668decfa3d 100644
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/ClusterStateManager.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/ClusterStateManager.java
@@ -474,10 +474,16 @@ public class ClusterStateManager implements 
IClusterStateManager {
         return ncConfigMap;
     }
 
+    @Override
     public synchronized Set<String> getNodesPendingRemoval() {
         return new HashSet<>(pendingRemoval);
     }
 
+    @Override
+    public synchronized boolean isPendingRemoval(String nodeId) {
+        return pendingRemoval.contains(nodeId);
+    }
+
     @Override
     public synchronized void setMetadataPartitionId(ClusterPartition 
partition) {
         metadataPartition = partition;
diff --git 
a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServer.java
 
b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServer.java
index 271de53a9a..1198945eb9 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServer.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServer.java
@@ -433,12 +433,12 @@ public class HttpServer {
         return addresses.iterator().next();
     }
 
-    private void closeChannels() throws InterruptedException {
+    void closeChannels() throws InterruptedException {
         synchronized (lock) {
             for (Channel channel : channels) {
                 channel.closeFuture().removeListener(channelCloseListener);
-                channel.close();
-                channel.closeFuture().sync();
+                channel.close().sync();
+                LOGGER.info("channel {} closed", channel);
             }
             channels.clear();
         }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/WebManager.java
 
b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/WebManager.java
index 3b17c06ad0..9a0aa754d3 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/WebManager.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/WebManager.java
@@ -113,4 +113,27 @@ public class WebManager {
     public void add(HttpServer server) {
         servers.add(server);
     }
+
+    /**
+     * Closes all channels associated with the servers in this WebManager.
+     * This prevents any additional connections from being established.
+     */
+    public void closeChannels() throws Exception {
+        List<Exception> closeExceptions = Collections.synchronizedList(new 
ArrayList<>());
+        servers.parallelStream().forEach(server -> {
+            try {
+                server.closeChannels();
+            } catch (Exception e) {
+                closeExceptions.add(e);
+            }
+        });
+        if (!closeExceptions.isEmpty()) {
+            Exception ex = null;
+            for (Exception closeException : closeExceptions) {
+                ex = ExceptionUtils.suppress(ex, closeException);
+            }
+            throw ex;
+        }
+
+    }
 }

Reply via email to