diff options
author | Sage Weil <sage@inktank.com> | 2013-06-17 12:47:11 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-06-23 15:10:24 -0700 |
commit | 5fc1dabfb3b2cbffdee3214d24d7769d6e440e45 (patch) | |
tree | efc6a90196a3b9fb8aa2bb5a2302be811c0c38d3 | |
parent | b89d7420e3501247d6ed282d2253c95c758526b1 (diff) | |
download | ceph-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.cc | 2 |
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(); } |