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());
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;
// -- 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;
// 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;
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();
}
{
dout(1)<< "creating_done" << dendl;
request_state(MDSMap::STATE_ACTIVE);
-
- // start new segment
- mdlog->start_new_segment(0);
}