From: Sage Weil Date: Mon, 25 Apr 2011 18:42:31 +0000 (-0700) Subject: mds: always trim standby segments after rereading the head X-Git-Tag: v0.27.1~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b31400d75ff903956afafbac28cb863a63249222;p=ceph.git mds: always trim standby segments after rereading the head When we re-read the head we may get an expire_pos that has moved forward in time. That is the appropriate time to trim segments during standby-replay. Signed-off-by: Sage Weil --- diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index fea18035b322..b5e27b876a64 100644 --- a/src/mds/MDLog.cc +++ b/src/mds/MDLog.cc @@ -502,6 +502,7 @@ void MDLog::_replay_thread() while (!done) cond.Wait(mylock); mds->mds_lock.Lock(); + standby_trim_segments(); if (journaler->get_read_pos() < journaler->get_expire_pos()) { dout(0) << "expire_pos is higher than read_pos, returning EAGAIN" << dendl; r = -EAGAIN; @@ -601,3 +602,32 @@ void MDLog::_replay_truncated() } +void MDLog::standby_trim_segments() +{ + dout(10) << "standby_trim_segments" << dendl; + uint64_t expire_pos = journaler->get_expire_pos(); + dout(10) << " expire_pos=" << expire_pos << dendl; + LogSegment *seg = NULL; + bool removed_segment = false; + while ((seg = get_oldest_segment())->end <= expire_pos) { + dout(10) << " removing segment " << seg->offset << dendl; + seg->dirty_dirfrags.clear_list(); + seg->new_dirfrags.clear_list(); + seg->dirty_inodes.clear_list(); + seg->dirty_dentries.clear_list(); + seg->open_files.clear_list(); + seg->renamed_files.clear_list(); + seg->dirty_dirfrag_dir.clear_list(); + seg->dirty_dirfrag_nest.clear_list(); + seg->dirty_dirfrag_dirfragtree.clear_list(); + remove_oldest_segment(); + removed_segment = true; + } + + if (removed_segment) { + dout(20) << " calling mdcache->trim!" << dendl; + mds->mdcache->trim(-1); + } else + dout(20) << " removed no segments!" << dendl; +} + diff --git a/src/mds/MDLog.h b/src/mds/MDLog.h index 072f9655f9e8..be7bd5dbe80f 100644 --- a/src/mds/MDLog.h +++ b/src/mds/MDLog.h @@ -241,6 +241,8 @@ public: void open(Context *onopen); // append() or replay() to follow! void append(); void replay(Context *onfinish); + + void standby_trim_segments(); }; #endif diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index 3aad2dc14c83..8cafd00bd0ef 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -1290,6 +1290,7 @@ public: mds->respawn(); /* we're too far back, and this is easier than trying to reset everything in the cache, etc */ } else { + mds->mdlog->standby_trim_segments(); mds->boot_start(3, r); } } @@ -1331,7 +1332,6 @@ void MDS::replay_done() } if (is_standby_replay()) { - standby_trim_segments(); dout(10) << "setting replay timer" << dendl; timer.add_event_after(g_conf.mds_replay_interval, new C_MDS_StandbyReplayRestart(this)); @@ -1375,35 +1375,6 @@ void MDS::replay_done() } } -void MDS::standby_trim_segments() -{ - dout(10) << "standby_trim_segments" << dendl; - LogSegment *seg = NULL; - uint64_t expire_pos = mdlog->get_journaler()->get_expire_pos(); - dout(10) << "expire_pos=" << expire_pos << dendl; - bool removed_segment = false; - while ((seg=mdlog->get_oldest_segment())->end <= expire_pos) { - dout(0) << "removing segment" << dendl; - seg->dirty_dirfrags.clear_list(); - seg->new_dirfrags.clear_list(); - seg->dirty_inodes.clear_list(); - seg->dirty_dentries.clear_list(); - seg->open_files.clear_list(); - seg->renamed_files.clear_list(); - seg->dirty_dirfrag_dir.clear_list(); - seg->dirty_dirfrag_nest.clear_list(); - seg->dirty_dirfrag_dirfragtree.clear_list(); - mdlog->remove_oldest_segment(); - removed_segment = true; - } - - if (removed_segment) { - dout(20) << "calling mdcache->trim!" << dendl; - mdcache->trim(-1); - } else dout(20) << "removed no segments!" << dendl; - return; -} - void MDS::reopen_log() { dout(1) << "reopen_log" << dendl; diff --git a/src/mds/MDS.h b/src/mds/MDS.h index bc383fc8087d..172645839e08 100644 --- a/src/mds/MDS.h +++ b/src/mds/MDS.h @@ -360,7 +360,6 @@ class MDS : public Dispatcher { void starting_done(); void replay_done(); void standby_replay_restart(); - void standby_trim_segments(); class C_MDS_StandbyReplayRestart; class C_MDS_StandbyReplayRestartFinish;