From 024b5bcbf0259eeecba234cff882564947c3a525 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Tue, 17 Oct 2017 09:55:57 +0800 Subject: [PATCH] osd/PrimaryLogPG: do not use approx_size() for log trimming There might be holes on log versions, thus the approx_size() should (almost) always overestimate the actual number of log entries. As a result, we might be at the risk of accessing violation while searching for the oldest log entry to keep in the log list later. Fix the above problem by counting the precise number of current log entries instead. Signed-off-by: xie xingguo --- src/osd/PrimaryLogPG.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 99a4230da78..6b68a4f552f 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -1539,10 +1539,11 @@ void PrimaryLogPG::calc_trim_to() eversion_t limit = MIN( min_last_complete_ondisk, pg_log.get_can_rollback_to()); + size_t log_size = pg_log.get_log().log.size(); if (limit != eversion_t() && limit != pg_trim_to && - pg_log.get_log().approx_size() > target) { - size_t num_to_trim = pg_log.get_log().approx_size() - target; + log_size > target) { + size_t num_to_trim = log_size - target; if (num_to_trim < cct->_conf->osd_pg_log_trim_min) { return; }