]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: create only one ESubtreeMap during fs creation
authorSage Weil <sage@inktank.com>
Sat, 17 Aug 2013 05:08:00 +0000 (22:08 -0700)
committerSage Weil <sage@inktank.com>
Sat, 17 Aug 2013 05:08:00 +0000 (22:08 -0700)
Previously we would create an empty ESubtreeMap when we opened the log
segment and then immediately journal a second one that created the root
and mdsdir.  More importantly, for the second ESubtreeMap, we would not
wait for it to commit before requesting the ACTIVE state, leading to
#4894.

Instead, break start_new_segment() into two steps: one that creates the
in-memory LogSegment tracking structure, and one that journals the
ESubtreeMap.  Open things early and write the (one) ESubtreeMap at the
end of boot_create().. and then wait for it.

Fixes: #4894
Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Yan, Zheng <zheng.z.yan@intel.com>
src/mds/MDLog.cc
src/mds/MDLog.h
src/mds/MDS.cc

index 3dfc00fc221ec470567a4ab6ae0fddca292a38e2..1ace72e0ac378a14e2dbffd69997040de2d043f9 100644 (file)
@@ -267,16 +267,19 @@ void MDLog::cap()
 
 void MDLog::start_new_segment(Context *onsync)
 {
-  dout(7) << "start_new_segment at " << journaler->get_write_pos() << dendl;
-
-  segments[journaler->get_write_pos()] = new LogSegment(journaler->get_write_pos());
-
-  ESubtreeMap *le = mds->mdcache->create_subtree_map();
-  submit_entry(le);
+  prepare_new_segment();
+  journal_segment_subtree_map();
   if (onsync) {
-    wait_for_safe(onsync);  
+    wait_for_safe(onsync);
     flush();
   }
+}
+
+void MDLog::prepare_new_segment()
+{
+  dout(7) << __func__ << " at " << journaler->get_write_pos() << dendl;
+
+  segments[journaler->get_write_pos()] = new LogSegment(journaler->get_write_pos());
 
   logger->inc(l_mdl_segadd);
   logger->set(l_mdl_seg, segments.size());
@@ -287,6 +290,12 @@ void MDLog::start_new_segment(Context *onsync)
   mds->mdcache->advance_stray();
 }
 
+void MDLog::journal_segment_subtree_map()
+{
+  dout(7) << __func__ << dendl;
+  submit_entry(mds->mdcache->create_subtree_map());
+}
+
 void MDLog::trim(int m)
 {
   int max_segments = g_conf->mds_log_max_segments;
index 46b34d26f69871f7a73654ec8218a57529e6230f..82d51c33d150084fbd94fc67e1bd861ae6a7a3c3 100644 (file)
@@ -161,6 +161,8 @@ public:
 
   // -- segments --
   void start_new_segment(Context *onsync=0);
+  void prepare_new_segment();
+  void journal_segment_subtree_map();
 
   LogSegment *peek_current_segment() {
     return segments.empty() ? NULL : segments.rbegin()->second;
index 092d5ebec655c2b0243e2cbfc783b50010cb692b..fc05ca0ecb73594b183c7b122e0feaa89a070b2b 100644 (file)
@@ -1140,7 +1140,9 @@ void MDS::boot_create()
   // start with a fresh journal
   dout(10) << "boot_create creating fresh journal" << dendl;
   mdlog->create(fin.new_sub());
-  mdlog->start_new_segment(fin.new_sub());
+
+  // open new journal segment, but do not journal subtree map (yet)
+  mdlog->prepare_new_segment();
 
   if (whoami == mdsmap->get_root()) {
     dout(3) << "boot_create creating fresh hierarchy" << dendl;
@@ -1170,6 +1172,12 @@ void MDS::boot_create()
     snapserver->save(fin.new_sub());
     snapserver->handle_mds_recovery(whoami);
   }
+
+  // ok now journal it
+  mdlog->journal_segment_subtree_map();
+  mdlog->wait_for_safe(fin.new_sub());
+  mdlog->flush();
+
   fin.activate();
 }
 
@@ -1177,9 +1185,6 @@ void MDS::creating_done()
 {
   dout(1)<< "creating_done" << dendl;
   request_state(MDSMap::STATE_ACTIVE);
-
-  // start new segment
-  mdlog->start_new_segment(0);
 }