transport::controller: Shut down distributed object on startup exception

Fixes #7211

If we start a sharded<> object, then proceed to do potentially
exceptional stuff, we should destroy it on said exception.
Otherwise, the exception propagation will abort on RAII
destruction of the sharded<>. And we get no exception logging.
This commit is contained in:
Calle Wilund
2020-11-25 14:11:46 +00:00
parent 0aa1f7c70a
commit ae4d5a60ca

View File

@@ -89,7 +89,7 @@ future<> controller::do_start_server() {
cql_server_smp_service_group_config.max_nonlocal_requests = 5000;
cql_server_config.bounce_request_smp_service_group = create_smp_service_group(cql_server_smp_service_group_config).get0();
const seastar::net::inet_address ip = gms::inet_address::lookup(addr, family, preferred).get0();
cserver->start(std::ref(_qp), std::ref(_auth_service), std::ref(_mnotifier), cql_server_config).get();
struct listen_cfg {
socket_address addr;
bool is_shard_aware;
@@ -139,14 +139,21 @@ future<> controller::do_start_server() {
}
}
parallel_for_each(configs, [cserver, keepalive](const listen_cfg & cfg) {
return cserver->invoke_on_all(&cql_transport::cql_server::listen, cfg.addr, cfg.cred, cfg.is_shard_aware, keepalive).then([cfg] {
logger.info("Starting listening for CQL clients on {} ({}, {})"
, cfg.addr, cfg.cred ? "encrypted" : "unencrypted", cfg.is_shard_aware ? "shard-aware" : "non-shard-aware"
);
});
}).get();
cserver->start(std::ref(_qp), std::ref(_auth_service), std::ref(_mnotifier), cql_server_config).get();
try {
parallel_for_each(configs, [cserver, keepalive](const listen_cfg & cfg) {
return cserver->invoke_on_all(&cql_transport::cql_server::listen, cfg.addr, cfg.cred, cfg.is_shard_aware, keepalive).then([cfg] {
logger.info("Starting listening for CQL clients on {} ({}, {})"
, cfg.addr, cfg.cred ? "encrypted" : "unencrypted", cfg.is_shard_aware ? "shard-aware" : "non-shard-aware"
);
});
}).get();
} catch (...) {
cserver->stop().get();
throw;
}
set_cql_ready(true).get();
});
}