From: Mike Christie Date: Tue, 30 Apr 2019 22:24:07 +0000 (-0500) Subject: rbd nbd: Add cond to signal nbd disconnection X-Git-Tag: v14.2.5~167^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bb7b11a0e473c9ef0b8191051c7b2b856725a7ab;p=ceph.git rbd nbd: Add cond to signal nbd disconnection With the ioctl interface we know when a disconnect has been executed because the NBD_DO_IO ioctl will return. The netlink interface returns after the nl connect cmd call has completed, so this patch adds a cond that signals when a nl disconnect/NBD_DISCONNECT has been executed and the server thread has handled the resulting NBD_CMD_DISC. Signed-off-by: Mike Christie (cherry picked from commit b4ba17659311c0854d2bfb11e27b052365e382f4) --- diff --git a/src/tools/rbd_nbd/rbd-nbd.cc b/src/tools/rbd_nbd/rbd-nbd.cc index d0abdff5a81..9919a0dfdac 100644 --- a/src/tools/rbd_nbd/rbd-nbd.cc +++ b/src/tools/rbd_nbd/rbd-nbd.cc @@ -141,6 +141,7 @@ public: NBDServer(int _fd, librbd::Image& _image) : fd(_fd) , image(_image) + , disconnect_lock("NBDServer::DisconnectLocker") , lock("NBDServer::Locker") , reader_thread(*this, &NBDServer::reader_entry) , writer_thread(*this, &NBDServer::writer_entry) @@ -148,6 +149,8 @@ public: {} private: + Mutex disconnect_lock; + Cond disconnect_cond; std::atomic terminated = { false }; void shutdown() @@ -272,12 +275,12 @@ private: if (r < 0) { derr << "failed to read nbd request header: " << cpp_strerror(r) << dendl; - return; + goto signal; } if (ctx->request.magic != htonl(NBD_REQUEST_MAGIC)) { derr << "invalid nbd request header" << dendl; - return; + goto signal; } ctx->request.from = ntohll(ctx->request.from); @@ -296,14 +299,14 @@ private: case NBD_CMD_DISC: // NBD_DO_IT will return when pipe is closed dout(0) << "disconnect request received" << dendl; - return; + goto signal; case NBD_CMD_WRITE: bufferptr ptr(ctx->request.len); r = safe_read_exact(fd, ptr.c_str(), ctx->request.len); if (r < 0) { derr << *ctx << ": failed to read nbd request data: " << cpp_strerror(r) << dendl; - return; + goto signal; } ctx->data.push_back(ptr); break; @@ -329,10 +332,14 @@ private: default: derr << *pctx << ": invalid request command" << dendl; c->release(); - return; + goto signal; } } dout(20) << __func__ << ": terminated" << dendl; + +signal: + Mutex::Locker l(disconnect_lock); + disconnect_cond.Signal(); } void writer_entry() @@ -401,6 +408,15 @@ public: } } + void wait_for_disconnect() + { + if (!started) + return; + + Mutex::Locker l(disconnect_lock); + disconnect_cond.Wait(disconnect_lock); + } + ~NBDServer() { if (started) {