From b8f70fb7aad87d19600da0865c8a789ca6f94b83 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 2 Sep 2024 15:00:15 +0200 Subject: [PATCH] [#3506] Final improvements --- changelog_unreleased/3506-unix-control-socket | 3 +++ src/lib/config/unix_command_mgr.cc | 19 +++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 changelog_unreleased/3506-unix-control-socket diff --git a/changelog_unreleased/3506-unix-control-socket b/changelog_unreleased/3506-unix-control-socket new file mode 100644 index 0000000000..37773b90be --- /dev/null +++ b/changelog_unreleased/3506-unix-control-socket @@ -0,0 +1,3 @@ +[func] fdupont + Reorganized UNIX control socket code. + (Gitlab #3506) diff --git a/src/lib/config/unix_command_mgr.cc b/src/lib/config/unix_command_mgr.cc index 43fc24c789..48a0849111 100644 --- a/src/lib/config/unix_command_mgr.cc +++ b/src/lib/config/unix_command_mgr.cc @@ -573,8 +573,8 @@ UnixCommandMgrImpl::openCommandSocket(const isc::data::ConstElementPtr& socket_i // First let's open lock file. std::string lock_name = getLockName(); - int new_lock_fd = open(lock_name.c_str(), O_RDONLY | O_CREAT, 0600); - if (new_lock_fd == -1) { + lock_fd_ = open(lock_name.c_str(), O_RDONLY | O_CREAT, 0600); + if (lock_fd_ == -1) { std::string errmsg = strerror(errno); isc_throw(SocketError, "cannot create socket lockfile, " << lock_name << ", : " << errmsg); @@ -582,10 +582,11 @@ UnixCommandMgrImpl::openCommandSocket(const isc::data::ConstElementPtr& socket_i // Try to acquire lock. If we can't somebody else is actively // using it. - int ret = flock(new_lock_fd, LOCK_EX | LOCK_NB); + int ret = flock(lock_fd_, LOCK_EX | LOCK_NB); if (ret != 0) { std::string errmsg = strerror(errno); - close(new_lock_fd); + close(lock_fd_); + lock_fd_ = -1; isc_throw(SocketError, "cannot lock socket lockfile, " << lock_name << ", : " << errmsg); } @@ -597,12 +598,6 @@ UnixCommandMgrImpl::openCommandSocket(const isc::data::ConstElementPtr& socket_i LOG_INFO(command_logger, COMMAND_ACCEPTOR_START) .arg(socket_name_); - // Close previous lock to avoid file descriptor leak. - if (lock_fd_ != -1) { - close(lock_fd_); - } - lock_fd_ = new_lock_fd; - try { // Start asynchronous acceptor service. acceptor_.reset(new UnixDomainSocketAcceptor(io_service_)); @@ -639,6 +634,10 @@ UnixCommandMgrImpl::closeCommandSocket() { // the server. This connection will be held until the UnixCommandMgr // responds to such request. connection_pool_.stopAll(); + if (lock_fd_ != -1) { + close(lock_fd_); + lock_fd_ = -1; + } } void