From 3407262de6e1b567c70ffe87b278f1d02b3683b2 Mon Sep 17 00:00:00 2001 From: Yin Congmin Date: Fri, 4 Jun 2021 14:46:16 +0800 Subject: [PATCH] librbd/cache/pwl/rwl: don't get front() when list is empty Signed-off-by: Yin Congmin --- src/librbd/cache/pwl/AbstractWriteLog.cc | 1 + src/librbd/cache/pwl/rwl/WriteLog.cc | 8 +++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/librbd/cache/pwl/AbstractWriteLog.cc b/src/librbd/cache/pwl/AbstractWriteLog.cc index 8194cc115fa..7c1fa44d724 100644 --- a/src/librbd/cache/pwl/AbstractWriteLog.cc +++ b/src/librbd/cache/pwl/AbstractWriteLog.cc @@ -2129,6 +2129,7 @@ bool AbstractWriteLog::can_retire_entry(std::shared_ptr log_ ldout(cct, 20) << dendl; ceph_assert(ceph_mutex_is_locked_by_me(m_lock)); + ceph_assert(log_entry); return log_entry->can_retire(); } diff --git a/src/librbd/cache/pwl/rwl/WriteLog.cc b/src/librbd/cache/pwl/rwl/WriteLog.cc index b2db20c3d49..3e3d8ad6d32 100644 --- a/src/librbd/cache/pwl/rwl/WriteLog.cc +++ b/src/librbd/cache/pwl/rwl/WriteLog.cc @@ -475,10 +475,9 @@ bool WriteLog::retire_entries(const unsigned long int frees_per_tx) { std::lock_guard locker(m_lock); initial_first_valid_entry = this->m_first_valid_entry; first_valid_entry = this->m_first_valid_entry; - auto entry = m_log_entries.front(); - while (!m_log_entries.empty() && - retiring_entries.size() < frees_per_tx && - this->can_retire_entry(entry)) { + while (!m_log_entries.empty() && retiring_entries.size() < frees_per_tx && + this->can_retire_entry(m_log_entries.front())) { + auto entry = m_log_entries.front(); if (entry->log_entry_index != first_valid_entry) { lderr(cct) << "Retiring entry index (" << entry->log_entry_index << ") and first valid log entry index (" << first_valid_entry @@ -495,7 +494,6 @@ bool WriteLog::retire_entries(const unsigned long int frees_per_tx) { this->m_blocks_to_log_entries.remove_log_entry(gen_write_entry); } } - entry = m_log_entries.front(); } } -- 2.39.5