From 4a49a87db77a50f97848ffaf86f2b3c52409d454 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 24 Jan 2011 10:59:21 -0800 Subject: [PATCH] msgr: make connection pipe reset atomic Close a small and unlikely race. Signed-off-by: Sage Weil --- src/msg/Message.h | 6 ++++++ src/msg/SimpleMessenger.cc | 3 +-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/msg/Message.h b/src/msg/Message.h index 8e054d6a12716..d161cb4033422 100644 --- a/src/msg/Message.h +++ b/src/msg/Message.h @@ -212,6 +212,12 @@ public: pipe = NULL; } } + void reset_pipe(RefCountedObject *p) { + Mutex::Locker l(lock); + if (pipe) + pipe->put(); + pipe = p->get(); + } int get_peer_type() { return peer_type; } void set_peer_type(int t) { peer_type = t; } diff --git a/src/msg/SimpleMessenger.cc b/src/msg/SimpleMessenger.cc index eb902bb048e9a..5f8f89929b960 100644 --- a/src/msg/SimpleMessenger.cc +++ b/src/msg/SimpleMessenger.cc @@ -876,8 +876,7 @@ int SimpleMessenger::Pipe::accept() if (!existing->policy.lossy) { /* if we're lossy, we can lose messages and should let the daemon handle it itself. Otherwise, take over other Connection so we don't lose older messages */ - existing->connection_state->clear_pipe(); - existing->connection_state->pipe = get(); + existing->connection_state->reset_pipe(this); existing->connection_state->put(); existing->connection_state = NULL; -- 2.39.5