ctld: Add a dedicated conf method for shutting down
Currently the main loop creates an empty config and applies it to force a shutdown of all of the existing configuration. While this is functional and does avoid duplicating some code, it is also a bit clunky and requires a special hack in the pidfile path handling in the conf::apply method. Instead, use a dedicated conf::shutdown method which tears down the CTL ports and LUNs and closes the sockets. Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D56532
This commit is contained in:
+40
-16
@@ -1976,11 +1976,9 @@ conf::apply(struct conf *oldconf)
|
||||
/*
|
||||
* Rename the pidfile if the pathname changes. On startup,
|
||||
* oldconf created via conf_new_from_kernel will not contain a
|
||||
* valid pidfile_path. On shutdown, the temporary newconf
|
||||
* will not contain a valid pidfile_path.
|
||||
* valid pidfile_path.
|
||||
*/
|
||||
if (!oldconf->conf_pidfile_path.empty() &&
|
||||
!conf_pidfile_path.empty()) {
|
||||
if (!oldconf->conf_pidfile_path.empty()) {
|
||||
if (oldconf->conf_pidfile_path != conf_pidfile_path) {
|
||||
/* pidfile has changed. rename it */
|
||||
log_debugx("moving pidfile to %s",
|
||||
@@ -2210,6 +2208,41 @@ conf::apply(struct conf *oldconf)
|
||||
return (cumulated_error);
|
||||
}
|
||||
|
||||
void
|
||||
conf::shutdown()
|
||||
{
|
||||
/* Deregister from iSNS servers. */
|
||||
for (auto &kv : conf_isns)
|
||||
isns_deregister_targets(&kv.second);
|
||||
|
||||
/* Remove all ports. */
|
||||
for (const auto &kv : conf_ports) {
|
||||
const std::string &name = kv.first;
|
||||
port *port = kv.second.get();
|
||||
|
||||
if (port->is_dummy())
|
||||
continue;
|
||||
log_debugx("removing port \"%s\"", name.c_str());
|
||||
if (!port->kernel_remove())
|
||||
log_warnx("failed to remove port %s", name.c_str());
|
||||
}
|
||||
|
||||
/* Remove all LUNs. */
|
||||
for (const auto &kv : conf_luns) {
|
||||
struct lun *lun = kv.second.get();
|
||||
|
||||
if (!lun->kernel_remove())
|
||||
log_warnx("failed to remove lun \"%s\", CTL lun %d",
|
||||
lun->name(), lun->ctl_lun());
|
||||
}
|
||||
|
||||
/* Close sockets on all portal groups. */
|
||||
for (auto &kv : conf_portal_groups)
|
||||
kv.second->close_sockets();
|
||||
for (auto &kv : conf_transport_groups)
|
||||
kv.second->close_sockets();
|
||||
}
|
||||
|
||||
bool
|
||||
timed_out(void)
|
||||
{
|
||||
@@ -2767,21 +2800,12 @@ main(int argc, char **argv)
|
||||
oldconf.reset();
|
||||
}
|
||||
} else if (sigterm_received) {
|
||||
log_debugx("exiting on signal; "
|
||||
"reloading empty configuration");
|
||||
log_debugx("exiting on signal");
|
||||
|
||||
log_debugx("removing CTL iSCSI ports "
|
||||
log_debugx("removing CTL iSCSI and NVMeoF ports "
|
||||
"and terminating all connections");
|
||||
|
||||
oldconf = std::move(newconf);
|
||||
newconf = std::make_unique<conf>();
|
||||
if (debug > 0)
|
||||
newconf->set_debug(debug);
|
||||
error = newconf->apply(oldconf.get());
|
||||
if (error != 0)
|
||||
log_warnx("failed to apply configuration");
|
||||
oldconf.reset();
|
||||
|
||||
newconf->shutdown();
|
||||
log_warnx("exiting on signal");
|
||||
return (0);
|
||||
} else {
|
||||
|
||||
@@ -513,6 +513,7 @@ struct conf {
|
||||
int apply(struct conf *oldconf);
|
||||
void delete_target_luns(struct lun *lun);
|
||||
bool reuse_portal_group_socket(struct portal &newp);
|
||||
void shutdown();
|
||||
bool verify();
|
||||
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user