]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: disable snapshot rstat temporarily
authorYan, Zheng <zyan@redhat.com>
Tue, 10 Mar 2015 03:21:22 +0000 (11:21 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 13 Mar 2015 01:46:44 +0000 (09:46 +0800)
that code that propagates snapshot rstat is buggy and
difficult to fix. (the main problem this code causes is
that snapshot rstat is always propagated to parent node,
which results large size of CInode:old_inodes).

Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/common/config_opts.h
src/mds/CInode.cc
src/mds/MDCache.cc

index 83cb85db526d28638a2a58e269e1055d7be3f2d7..91bd3419daec3e60562f08f529d1478cb2fd89b8 100644 (file)
@@ -444,6 +444,7 @@ OPTION(mds_op_complaint_time, OPT_FLOAT, 30) // how many seconds old makes an op
 OPTION(mds_op_log_threshold, OPT_INT, 5) // how many op log messages to show in one go
 OPTION(mds_snap_min_uid, OPT_U32, 0) // The minimum UID required to create a snapshot
 OPTION(mds_snap_max_uid, OPT_U32, 65536) // The maximum UID allowed to create a snapshot
+OPTION(mds_snap_rstat, OPT_BOOL, false) // enable/disbale nested stat for snapshot
 OPTION(mds_verify_backtrace, OPT_U32, 1)
 
 OPTION(mds_action_on_write_error, OPT_U32, 1) // 0: ignore; 1: force readonly; 2: crash
index ce7a229563c43ee7f8f5a5d10e4522a17e6c648c..6819875dc797e9d71d24f3aa7c9409c7819eabf4 100644 (file)
@@ -2414,7 +2414,8 @@ old_inode_t& CInode::cow_old_inode(snapid_t follows, bool cow_head)
 
   old.inode.trim_client_ranges(follows);
 
-  if (!(old.inode.rstat == old.inode.accounted_rstat))
+  if (g_conf->mds_snap_rstat &&
+      !(old.inode.rstat == old.inode.accounted_rstat))
     dirty_old_rstats.insert(follows);
   
   first = follows+1;
index 1bf5c2819c3e41b0b4739854b3ad4f8c96495d27..da4685a8a788ce16c8029f01d7220aacb685c17e 100644 (file)
@@ -1710,17 +1710,19 @@ void MDCache::project_rstat_inode_to_frag(CInode *cur, CDir *parent, snapid_t fi
 
   if (cur->last >= floor)
     _project_rstat_inode_to_frag(*curi, MAX(first, floor), cur->last, parent, linkunlink);
-      
-  for (compact_set<snapid_t>::iterator p = cur->dirty_old_rstats.begin();
-       p != cur->dirty_old_rstats.end();
-       ++p) {
-    old_inode_t& old = cur->old_inodes[*p];
-    snapid_t ofirst = MAX(old.first, floor);
-    set<snapid_t>::const_iterator q = snaps.lower_bound(ofirst);
-    if (q == snaps.end() || *q > *p)
-      continue;
-    if (*p >= floor)
-      _project_rstat_inode_to_frag(old.inode, ofirst, *p, parent, 0);
+
+  if (g_conf->mds_snap_rstat) {
+    for (compact_set<snapid_t>::iterator p = cur->dirty_old_rstats.begin();
+        p != cur->dirty_old_rstats.end();
+        ++p) {
+      old_inode_t& old = cur->old_inodes[*p];
+      snapid_t ofirst = MAX(old.first, floor);
+      set<snapid_t>::const_iterator q = snaps.lower_bound(ofirst);
+      if (q == snaps.end() || *q > *p)
+       continue;
+      if (*p >= floor)
+       _project_rstat_inode_to_frag(old.inode, ofirst, *p, parent, 0);
+    }
   }
   cur->dirty_old_rstats.clear();
 }
@@ -1757,7 +1759,10 @@ void MDCache::_project_rstat_inode_to_frag(inode_t& inode, snapid_t ofirst, snap
     snapid_t first;
     fnode_t *pf = parent->get_projected_fnode();
     if (last == CEPH_NOSNAP) {
-      first = MAX(ofirst, parent->first);
+      if (g_conf->mds_snap_rstat)
+       first = MAX(ofirst, parent->first);
+      else
+       first = parent->first;
       prstat = &pf->rstat;
       dout(20) << " projecting to head [" << first << "," << last << "] " << *prstat << dendl;
 
@@ -1772,6 +1777,9 @@ void MDCache::_project_rstat_inode_to_frag(inode_t& inode, snapid_t ofirst, snap
        parent->dirty_old_rstat[first-1].accounted_rstat = pf->accounted_rstat;
       }
       parent->first = first;
+    } else if (!g_conf->mds_snap_rstat) {
+      // drop snapshots' rstats
+      break;
     } else if (last >= parent->first) {
       first = parent->first;
       parent->dirty_old_rstat[last].first = first;
@@ -2233,10 +2241,13 @@ void MDCache::predirty_journal_parents(MutationRef mut, EMetaBlob *blob,
       // first, if the frag is stale, bring it back in sync.
       parent->resync_accounted_rstat();
 
-      for (compact_map<snapid_t,old_rstat_t>::iterator p = parent->dirty_old_rstat.begin();
-          p != parent->dirty_old_rstat.end();
-          ++p)
-       project_rstat_frag_to_inode(p->second.rstat, p->second.accounted_rstat, p->second.first, p->first, pin, true);//false);
+      if (g_conf->mds_snap_rstat) {
+       for (compact_map<snapid_t,old_rstat_t>::iterator p = parent->dirty_old_rstat.begin();
+            p != parent->dirty_old_rstat.end();
+            ++p)
+         project_rstat_frag_to_inode(p->second.rstat, p->second.accounted_rstat, p->second.first,
+                                     p->first, pin, true);//false);
+      }
       parent->dirty_old_rstat.clear();
       project_rstat_frag_to_inode(pf->rstat, pf->accounted_rstat, parent->first, CEPH_NOSNAP, pin, true);//false);