From 9c412d3eeef06be0fcfc03d7bb0d50db7fa7f468 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Tue, 9 Oct 2018 18:30:55 +0800 Subject: [PATCH] mds: use MDlog::trim_all() to trim log when deactivating mds The problem of MDLog::trim(0) is that it expires current segment. New log events (scatter nudge) may get added to current segment when MDLog::trim(0) expires current segement. Signed-off-by: "Yan, Zheng" --- src/mds/MDCache.cc | 10 ++++++++-- src/mds/MDLog.cc | 6 ++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 84330df475b8f5..b10de06d5d98ae 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -7668,7 +7668,13 @@ bool MDCache::shutdown_pass() // Fully trim the log so that all objects in cache are clean and may be // trimmed by a future MDCache::trim. Note that MDSRank::tick does not // trim the log such that the cache eventually becomes clean. - mds->mdlog->trim(0); + if (mds->mdlog->get_num_segments() > 0 && + mds->mdlog->get_current_segment()->num_events > 1) { + // current segment contains events other than subtreemap + mds->mdlog->start_new_segment(); + mds->mdlog->flush(); + } + mds->mdlog->trim_all(); if (mds->mdlog->get_num_segments() > 1) { dout(7) << "still >1 segments, waiting for log to trim" << dendl; return false; @@ -7717,7 +7723,7 @@ bool MDCache::shutdown_pass() if (!mds->mdlog->is_capped()) { dout(7) << "capping the log" << dendl; mds->mdlog->cap(); - mds->mdlog->trim(); + mds->mdlog->trim(0); } if (!mds->mdlog->empty()) { diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index 5990693e6e5418..2e5a368e455749 100644 --- a/src/mds/MDLog.cc +++ b/src/mds/MDLog.cc @@ -720,7 +720,8 @@ int MDLog::trim_all() uint64_t last_seq = 0; if (!segments.empty()) { last_seq = get_last_segment_seq(); - if (!mds->mdcache->open_file_table.is_any_committing() && + if (!capped && + !mds->mdcache->open_file_table.is_any_committing() && last_seq > mds->mdcache->open_file_table.get_committing_log_seq()) { submit_mutex.Unlock(); mds->mdcache->open_file_table.commit(new C_OFT_Committed(this, last_seq), @@ -731,7 +732,8 @@ int MDLog::trim_all() map::iterator p = segments.begin(); while (p != segments.end() && - p->first < last_seq && p->second->end <= safe_pos) { + p->first < last_seq && + p->second->end < safe_pos) { // next segment should have been started LogSegment *ls = p->second; ++p;