From 02afe9855a4d04fe56951a9e9ffd3e32537ff77e Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Mon, 10 Apr 2017 14:53:46 +0800 Subject: [PATCH] mon/MonClient: make get_mon_log_message() atomic * LogClient: move reset_session() into get_mon_log_message() and add a "flush" param to the latter. so it can get_mon_log_message() atomically. otherwise another call changing the log queue could sneak in between reset_session() and get_mon_log_message(). * MonClient: add a "flush" param to do_send() so we can reset the LogClient session once we are connected to a monitor. Fixes: http://tracker.ceph.com/issues/19427 Signed-off-by: Kefu Chai (cherry picked from commit 5215e291da2b527d85e129eda86043490843178e) Conflicts: src/mon/MonClient.cc: handle_auth: replaced 'log_client->reset_session(); send_log();' sequence with newly introduced 'send_log(true);' like the original patch does --- src/common/LogClient.cc | 12 +++++------- src/common/LogClient.h | 3 +-- src/mon/MonClient.cc | 10 +++------- src/mon/MonClient.h | 2 +- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/common/LogClient.cc b/src/common/LogClient.cc index f52912f7fccc4..e5c069fd7031b 100644 --- a/src/common/LogClient.cc +++ b/src/common/LogClient.cc @@ -264,15 +264,13 @@ void LogChannel::do_log(clog_type prio, const std::string& s) } } -void LogClient::reset_session() -{ - Mutex::Locker l(log_lock); - last_log_sent = last_log - log_queue.size(); -} - -Message *LogClient::get_mon_log_message() +Message *LogClient::get_mon_log_message(bool flush) { Mutex::Locker l(log_lock); + if (flush) { + // reset session + last_log_sent = last_log - log_queue.size(); + } return _get_mon_log_message(); } diff --git a/src/common/LogClient.h b/src/common/LogClient.h index bf70e39a80522..0e8a2578bf1d1 100644 --- a/src/common/LogClient.h +++ b/src/common/LogClient.h @@ -206,8 +206,7 @@ public: } bool handle_log_ack(MLogAck *m); - void reset_session(); - Message *get_mon_log_message(); + Message *get_mon_log_message(bool flush); bool are_pending(); LogChannelRef create_channel() { diff --git a/src/mon/MonClient.cc b/src/mon/MonClient.cc index 3db182f6da283..6eaa395f40eba 100644 --- a/src/mon/MonClient.cc +++ b/src/mon/MonClient.cc @@ -302,10 +302,10 @@ bool MonClient::ms_dispatch(Message *m) return true; } -void MonClient::send_log() +void MonClient::send_log(bool flush) { if (log_client) { - Message *lm = log_client->get_mon_log_message(); + Message *lm = log_client->get_mon_log_message(flush); if (lm) _send_mon_message(lm); more_log_pending = log_client->are_pending(); @@ -544,13 +544,9 @@ void MonClient::handle_auth(MAuthReply *m) _send_mon_message(waiting_for_session.front()); waiting_for_session.pop_front(); } - _resend_mon_commands(); - if (log_client) { - log_client->reset_session(); - send_log(); - } + send_log(true); if (session_established_context) { cb = session_established_context; session_established_context = NULL; diff --git a/src/mon/MonClient.h b/src/mon/MonClient.h index d2a29953ff4c5..0164cb3d3b97c 100644 --- a/src/mon/MonClient.h +++ b/src/mon/MonClient.h @@ -129,7 +129,7 @@ private: LogClient *log_client; bool more_log_pending; - void send_log(); + void send_log(bool flush = false); AuthMethodList *auth_supported; -- 2.39.5