]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common: reset last_log_sent when clog_to_monitors is updated 40247/head
authorGerald Yang <gerald.yang@canonical.com>
Wed, 3 Mar 2021 04:37:15 +0000 (04:37 +0000)
committersinguliere <singuliere@autistici.org>
Fri, 19 Mar 2021 17:58:13 +0000 (18:58 +0100)
When clog_to_monitors is disabled, "last_log" still keeps increasing by
get_next_seq() if OSD writes info to clog

But "last_log_sent" doesn't increase, if we disable clog_to_monitors for
a bit longer and then re-enabling it, the num_unsent could be bigger than
log_queue_size(), it will trigger an assertion in _get_mon_log_message

We need to reset last_log_sent to last_log before updating clog_to_monitors

Signed-off-by: Gerald Yang <gerald.yang@canonical.com>
(cherry picked from commit 294ddf9ba779d40b0bc859e55f5287379c75624f)

src/common/LogClient.cc
src/common/LogClient.h

index 71877d0242d4c20a13bb56115fd32173102604b5..5082d45fac5108f33358dce4acfff16746166349 100644 (file)
@@ -133,8 +133,12 @@ LogClient::LogClient(CephContext *cct, Messenger *m, MonMap *mm,
 {
 }
 
-void LogChannel::set_log_to_monitors(bool v) {
-  log_to_monitors = v;
+void LogChannel::set_log_to_monitors(bool v)
+{
+  if (log_to_monitors != v) {
+    parent->reset();
+    log_to_monitors = v;
+  }
 }
 
 void LogChannel::update_config(map<string,string> &log_to_monitors,
@@ -332,6 +336,15 @@ version_t LogClient::queue(LogEntry &entry)
   return entry.seq;
 }
 
+void LogClient::reset()
+{
+  std::lock_guard l(log_lock);
+  if (log_queue.size()) {
+    log_queue.clear();
+  }
+  last_log_sent = last_log;
+}
+
 uint64_t LogClient::get_next_seq()
 {
   std::lock_guard l(log_lock);
index f4ed31fdbee3de5a2d2b45ed2bde2f7f601f6ed9..c20fde4f157d67b6d34681742e099680d68940b3 100644 (file)
@@ -232,6 +232,7 @@ public:
   const EntityName& get_myname();
   entity_name_t get_myrank();
   version_t queue(LogEntry &entry);
+  void reset();
 
 private:
   ceph::ref_t<Message> _get_mon_log_message();