From 294ddf9ba779d40b0bc859e55f5287379c75624f Mon Sep 17 00:00:00 2001 From: Gerald Yang Date: Wed, 3 Mar 2021 04:37:15 +0000 Subject: [PATCH] common: reset last_log_sent when clog_to_monitors is updated 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 --- src/common/LogClient.cc | 17 +++++++++++++++-- src/common/LogClient.h | 1 + 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/common/LogClient.cc b/src/common/LogClient.cc index 71877d0242d..5082d45fac5 100644 --- a/src/common/LogClient.cc +++ b/src/common/LogClient.cc @@ -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 &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); diff --git a/src/common/LogClient.h b/src/common/LogClient.h index f4ed31fdbee..c20fde4f157 100644 --- a/src/common/LogClient.h +++ b/src/common/LogClient.h @@ -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 _get_mon_log_message(); -- 2.39.5