]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/Accepter: fix race in accepter shutdown
authorSage Weil <sage@inktank.com>
Thu, 20 Sep 2012 17:14:24 +0000 (10:14 -0700)
committerSage Weil <sage@inktank.com>
Fri, 21 Sep 2012 17:17:00 +0000 (10:17 -0700)
We want to avoid a race like:

- entry() starts, populates pfd with listen_sd, gets past !done check
- stop() does shutdown + close on listen_sd
- someone else opens a new fd
- entry() thread calls poll(2) on wrong sd
- stop() calls join, waits forever for entry thread

Signed-off-by: Sage Weil <sage@inktank.com>
src/msg/Accepter.cc

index 03e2d65211e4cc4e4552304f58ec240e238fb7e4..28a475079c6953d00d661b053b1e45cc408e1d10 100644 (file)
@@ -247,10 +247,16 @@ void Accepter::stop()
   ldout(msgr->cct,10) << "stop accepter" << dendl;
   if (listen_sd >= 0) {
     ::shutdown(listen_sd, SHUT_RDWR);
+  }
+
+  // wait for thread to stop before closing the socket, to avoid
+  // racing against fd re-use.
+  join();
+
+  if (listen_sd >= 0) {
     ::close(listen_sd);
     listen_sd = -1;
   }
-  join();
   done = false;
 }