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
The following commit(s) were added to refs/heads/master by this push:
new d494f9486d [NO ISSUE][HYR][*DB][HTTP] Stop accepting web connections
at shutdown
d494f9486d is described below
commit d494f9486debd777838d3a3baede03a79142ec1b
Author: Michael Blow <[email protected]>
AuthorDate: Wed Jul 2 22:23:24 2025 -0400
[NO ISSUE][HYR][*DB][HTTP] Stop accepting web connections at shutdown
Avoid returning 503s while shutting down, by stopping web
listeners at start of shutdown process
Ext-ref: MB-67428
Change-Id: I7cacccec8c44d6bac55d8e46129eb7ad1e6c251c
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20012
Integration-Tests: Jenkins <[email protected]>
Tested-by: Jenkins <[email protected]>
Reviewed-by: Michael Blow <[email protected]>
Reviewed-by: Hussain Towaileb <[email protected]>
---
.../asterix/hyracks/bootstrap/CCApplication.java | 1 +
.../asterix/hyracks/bootstrap/NCApplication.java | 1 +
.../common/cluster/IClusterStateManager.java | 2 ++
.../asterix/runtime/utils/ClusterStateManager.java | 1 +
.../org/apache/hyracks/http/server/HttpServer.java | 6 +++---
.../org/apache/hyracks/http/server/WebManager.java | 23 ++++++++++++++++++++++
6 files changed, 31 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 a5c8073d61..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,8 @@ public interface IClusterStateManager {
Map<String, Map<IOption, Object>> getActiveNcConfiguration();
+ Set<String> getNodesPendingRemoval();
+
boolean isPendingRemoval(String nodeId);
/**
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 7c9fd5bdd0..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,6 +474,7 @@ public class ClusterStateManager implements
IClusterStateManager {
return ncConfigMap;
}
+ @Override
public synchronized Set<String> getNodesPendingRemoval() {
return new HashSet<>(pendingRemoval);
}
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;
+ }
+
+ }
}