]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: always trim standby segments after rereading the head
authorSage Weil <sage@newdream.net>
Mon, 25 Apr 2011 18:42:31 +0000 (11:42 -0700)
committerSage Weil <sage@newdream.net>
Mon, 25 Apr 2011 21:14:41 +0000 (14:14 -0700)
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 <sage@newdream.net>
src/mds/MDLog.cc
src/mds/MDLog.h
src/mds/MDS.cc
src/mds/MDS.h

index fea18035b32277097b41c5d416bdac936cdddf9b..b5e27b876a644f580a2738bf5c7b12295d962771 100644 (file)
@@ -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;
+}
+
index 072f9655f9e8aa31c6be4d7020099a92307c821d..be7bd5dbe80f74fcd0b65fb8009760b28309329e 100644 (file)
@@ -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
index 3aad2dc14c83f467d9804595e829a8e74be17146..8cafd00bd0efa95625dee707e320766830d7939e 100644 (file)
@@ -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;
index bc383fc8087dfcf932975884350feac36b57b72e..172645839e0898a9193a8767dad36bbab2f93fd6 100644 (file)
@@ -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;