]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: use MDlog::trim_all() to trim log when deactivating mds
authorYan, Zheng <zyan@redhat.com>
Tue, 9 Oct 2018 10:30:55 +0000 (18:30 +0800)
committerJonathan Brielmaier <jbrielmaier@suse.de>
Wed, 14 Nov 2018 15:56:29 +0000 (16:56 +0100)
The problem of MDLog::trim(0) is that it expires current segment.
New log events (scatter nudge) may get added to current segment
when MDLog::trim(0) expires current segement.

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit 49c0f072f60deb5761e6b6a6518d88c59510ee9b)
Signed-off-by: Jonathan Brielmaier <jbrielmaier@suse.de>
src/mds/MDCache.cc
src/mds/MDLog.cc

index c02ed7d84a4a7e580f7f30c97e6c81181778409a..94fbd5b6d8c288a6739da62ad625cc8d5a785581 100644 (file)
@@ -7800,7 +7800,13 @@ 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.
-  mds->mdlog->trim(0);
+  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();
+  }
+  mds->mdlog->trim_all();
   if (mds->mdlog->get_num_segments() > 1) {
     dout(7) << "still >1 segments, waiting for log to trim" << dendl;
     return false;
@@ -7849,9 +7855,11 @@ bool MDCache::shutdown_pass()
   if (!mds->mdlog->is_capped()) {
     dout(7) << "capping the log" << dendl;
     mds->mdlog->cap();
-    mds->mdlog->trim();
   }
   
+  if (!mds->mdlog->empty())
+    mds->mdlog->trim(0);
+
   if (!mds->mdlog->empty()) {
     dout(7) << "waiting for log to flush.. " << mds->mdlog->get_num_events() 
            << " in " << mds->mdlog->get_num_segments() << " segments" << dendl;
index e5f20e8bccbebbc1388195dc60f1f54953417766..f8718a76d1bf4c91cf13079277e670e7b3bc6941 100644 (file)
@@ -720,7 +720,8 @@ int MDLog::trim_all()
   uint64_t last_seq = 0;
   if (!segments.empty()) {
     last_seq = get_last_segment_seq();
-    if (!mds->mdcache->open_file_table.is_any_committing() &&
+    if (!capped &&
+       !mds->mdcache->open_file_table.is_any_committing() &&
        last_seq > mds->mdcache->open_file_table.get_committing_log_seq()) {
       submit_mutex.Unlock();
       mds->mdcache->open_file_table.commit(new C_OFT_Committed(this, last_seq),
@@ -731,7 +732,8 @@ int MDLog::trim_all()
 
   map<uint64_t,LogSegment*>::iterator p = segments.begin();
   while (p != segments.end() &&
-        p->first < last_seq && p->second->end <= safe_pos) {
+        p->first < last_seq &&
+        p->second->end < safe_pos) { // next segment should have been started
     LogSegment *ls = p->second;
     ++p;