From ff6e854cd08e0c38c9ede05c4751360e03dc7d3d Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Wed, 17 Oct 2018 17:22:47 +0800 Subject: [PATCH] mds: flush dirty dirfrags that weren't logged when deactivating mds CDir::log_mark_dirty() may mark dirfrag dirty, without journal event. Signed-off-by: "Yan, Zheng" (cherry picked from commit 68b6073af92595da92c0032e814a2bb3d3cba5cd) --- src/mds/MDCache.cc | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 48e237030f366..14519a16e29a1 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -7642,11 +7642,14 @@ 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. - 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(); + if (mds->mdlog->get_num_segments() > 0) { + auto ls = mds->mdlog->get_current_segment(); + if (ls->num_events > 1 || !ls->dirty_dirfrags.empty()) { + // Current segment contains events other than subtreemap or + // there are dirty dirfrags (see CDir::log_mark_dirty()) + mds->mdlog->start_new_segment(); + mds->mdlog->flush(); + } } mds->mdlog->trim_all(); if (mds->mdlog->get_num_segments() > 1) { -- 2.39.5