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; + } + + } }