]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/MonClient: make get_mon_log_message() atomic 14422/head
authorKefu Chai <kchai@redhat.com>
Mon, 10 Apr 2017 06:53:46 +0000 (14:53 +0800)
committerKefu Chai <kchai@redhat.com>
Mon, 10 Apr 2017 06:58:05 +0000 (14:58 +0800)
* 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 <kchai@redhat.com>
src/common/LogClient.cc
src/common/LogClient.h
src/mon/MonClient.cc
src/mon/MonClient.h

index 05ba6739db521a3134a1bf1da1ac6dfc9513048f..c0e4a7bf5aed288de0030aad1320e4ff8866dd53 100644 (file)
@@ -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();
 }
 
index 8e150cf5327c3b9c2f36e9b13e43e16eda7758df..843b9bff02fe885685f03f5e161f19abc190816a 100644 (file)
@@ -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() {
index 9e36ff032bc5faf8ae84aa542b01d2c65b14a038..cfdcee53e009c2deb27cc497f858c860a27b37f4 100644 (file)
@@ -295,10 +295,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();
@@ -521,13 +521,8 @@ 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 (active_con) {
       std::swap(auth, active_con->get_auth());
       global_id = active_con->get_global_id();
index 4361852f4149cfae16d3bc1df334ecb9452cc316..cad75e1babcacebb5a8697eb3beeff41e9a1448a 100644 (file)
@@ -167,7 +167,7 @@ private:
   LogClient *log_client;
   bool more_log_pending;
 
-  void send_log();
+  void send_log(bool flush = false);
 
   std::unique_ptr<AuthMethodList> auth_supported;