You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mb...@apache.org on 2025/08/15 17:50:18 UTC
(asterixdb) 15/17: [NO ISSUE][HTTP][MISC] += ClusterStateManager.isPendingRemoval, HTTP stop bind at shutdown
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 <mi...@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;
+ }
+
+ }
}