Skip to content

Commit 1138347

Browse files
author
Laszlo Ersek
committed
generic_server: coroutinize server::shutdown()
By turning server::shutdown() into a coroutine, we need not dynamically allocate "nr_conn". Verified as follows: (1) In terminal #1: build/Dev/scylla --overprovisioned --developer-mode=yes \ --memory=2G --smp=1 --default-log-level error \ --logger-log-level cql_server=debug:cql_server_controller=debug > INFO [...] cql_server_controller - Starting listening for CQL clients > on 127.0.0.1:9042 (unencrypted, > non-shard-aware) > INFO [...] cql_server_controller - Starting listening for CQL clients > on 127.0.0.1:19042 (unencrypted, > shard-aware) (2) In terminals #2 and #3: tools/cqlsh/bin/cqlsh.py (3) Press ^C in terminal #1: > DEBUG [...] cql_server - abort accept nr_total=2 > DEBUG [...] cql_server - abort accept 1 out of 2 done > DEBUG [...] cql_server - abort accept 2 out of 2 done > DEBUG [...] cql_server - shutdown connection nr_total=4 > DEBUG [...] cql_server - shutdown connection 1 out of 4 done > DEBUG [...] cql_server - shutdown connection 2 out of 4 done > DEBUG [...] cql_server - shutdown connection 3 out of 4 done > DEBUG [...] cql_server - shutdown connection 4 out of 4 done > INFO [...] cql_server_controller - CQL server stopped This patch is best viewed with "git show --word-diff=color". Suggested-by: Benny Halevy <[email protected]> Signed-off-by: Laszlo Ersek <[email protected]>
1 parent 2216275 commit 1138347

File tree

1 file changed

+7
-9
lines changed

1 file changed

+7
-9
lines changed

generic_server.cc

+7-9
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
#include <fmt/ranges.h>
1313
#include <seastar/core/when_all.hh>
14-
#include <seastar/core/loop.hh>
14+
#include <seastar/coroutine/parallel_for_each.hh>
1515
#include <seastar/core/reactor.hh>
1616

1717
namespace generic_server {
@@ -119,7 +119,7 @@ future<> server::stop() {
119119

120120
future<> server::shutdown() {
121121
if (_gate.is_closed()) {
122-
return make_ready_future<>();
122+
co_return;
123123
}
124124
_all_connections_stopped = _gate.close();
125125
size_t nr = 0;
@@ -129,16 +129,14 @@ future<> server::shutdown() {
129129
l.abort_accept();
130130
_logger.debug("abort accept {} out of {} done", ++nr, nr_total);
131131
}
132-
auto nr_conn = make_lw_shared<size_t>(0);
132+
size_t nr_conn = 0;
133133
auto nr_conn_total = _connections_list.size();
134134
_logger.debug("shutdown connection nr_total={}", nr_conn_total);
135-
return parallel_for_each(_connections_list.begin(), _connections_list.end(), [this, nr_conn, nr_conn_total] (auto&& c) {
136-
return c.shutdown().then([this, nr_conn, nr_conn_total] {
137-
_logger.debug("shutdown connection {} out of {} done", ++(*nr_conn), nr_conn_total);
138-
});
139-
}).then([this] {
140-
return std::move(_listeners_stopped);
135+
co_await coroutine::parallel_for_each(_connections_list, [&] (auto&& c) -> future<> {
136+
co_await c.shutdown();
137+
_logger.debug("shutdown connection {} out of {} done", ++nr_conn, nr_conn_total);
141138
});
139+
co_await std::move(_listeners_stopped);
142140
}
143141

144142
future<>

0 commit comments

Comments
 (0)