summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-06-17 12:47:11 -0700
committerSage Weil <sage@inktank.com>2013-06-23 15:10:24 -0700
commit5fc1dabfb3b2cbffdee3214d24d7769d6e440e45 (patch)
treeefc6a90196a3b9fb8aa2bb5a2302be811c0c38d3
parentb89d7420e3501247d6ed282d2253c95c758526b1 (diff)
downloadceph-5fc1dabfb3b2cbffdee3214d24d7769d6e440e45.tar.gz
msgr: clear_pipe inside pipe_lock on mark_down_all
Observed a segfault in rebind -> mark_down_all -> clear_pipe -> put that may have been due to a racing thread clearing the connection_state pointer. Do the clear_pipe() call under the protection of pipe_lock, as we do in all other contexts. Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/msg/SimpleMessenger.cc2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/msg/SimpleMessenger.cc b/src/msg/SimpleMessenger.cc
index f1e614628df..994f849c1eb 100644
--- a/src/msg/SimpleMessenger.cc
+++ b/src/msg/SimpleMessenger.cc
@@ -563,9 +563,9 @@ void SimpleMessenger::mark_down_all()
p->pipe_lock.Lock();
p->stop();
ConnectionRef con = p->connection_state;
- p->pipe_lock.Unlock();
if (con && con->clear_pipe(p))
dispatch_queue.queue_reset(con.get());
+ p->pipe_lock.Unlock();
}
lock.Unlock();
}