]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: project projected inodes' rstat. introduce old_fnode_t
authorSage Weil <sage@newdream.net>
Wed, 23 Jul 2008 17:55:12 +0000 (10:55 -0700)
committerSage Weil <sage@newdream.net>
Wed, 23 Jul 2008 17:55:12 +0000 (10:55 -0700)
src/mds/CDir.h
src/mds/CInode.cc
src/mds/MDCache.cc
src/mds/mdstypes.h
src/osdc/ObjectCacher.cc

index 40396830637b036dbc9a7305bd63dcd5f2737700..bf3681f63110ac212102c47d4b07ede70d143dcd 100644 (file)
@@ -158,7 +158,7 @@ class CDir : public MDSCacheObject {
 
   fnode_t fnode;
   snapid_t first;
-  map<snapid_t,pair<snapid_t,fnode_t> > dirty_old_fnodes;  // [value.first,key]
+  map<snapid_t,old_fnode_t> dirty_old_fnodes;  // [value.first,key]
 
 protected:
   version_t projected_version;
index 479bd07cdfdef1113d2ffa806470c943f9d815c6..358848c844fab8cb9a95b51fb3a03dd54cb28b77 100644 (file)
@@ -612,8 +612,10 @@ void CInode::encode_lock_state(int type, bufferlist& bl)
          dout(20) << "   accounted_rstat " << p->second->fnode.accounted_rstat << dendl;
          frag_t fg = p->second->dirfrag().frag;
          ::encode(fg, tmp);
+         ::encode(p->second->first, tmp);
          ::encode(p->second->fnode.rstat, tmp);
          ::encode(p->second->fnode.accounted_rstat, tmp);
+         ::encode(p->second->dirty_old_fnodes, tmp);
          n++;
        }
       ::encode(n, bl);
@@ -715,9 +717,11 @@ void CInode::decode_lock_state(int type, bufferlist& bl)
        frag_t fg;
        frag_info_t fragstat;
        frag_info_t accounted_fragstat;
+       map<snapid_t,old_fnode_t> dirty_old_fnodes;
        ::decode(fg, p);
        ::decode(fragstat, p);
        ::decode(accounted_fragstat, p);
+       ::decode(dirty_old_fnodes, p);
        dout(10) << fg << " got changed fragstat " << fragstat << dendl;
        dout(20) << fg << "   accounted_fragstat " << accounted_fragstat << dendl;
 
@@ -728,18 +732,22 @@ void CInode::decode_lock_state(int type, bufferlist& bl)
          dout(20) << " " << fg << " accounted_fragstat " << accounted_fragstat << dendl;
          dir->fnode.fragstat = fragstat;
          dir->fnode.accounted_fragstat = accounted_fragstat;
-         if (!(fragstat == accounted_fragstat))
+         dir->dirty_old_fnodes.swap(dirty_old_fnodes);
+         if (!(fragstat == accounted_fragstat) ||
+             dirty_old_fnodes.size())
            dirlock.set_updated();
        } else {
          if (dir &&
              dir->is_auth() &&
-             !(dir->fnode.accounted_fragstat == fragstat)) {
+             (!(dir->fnode.accounted_fragstat == fragstat) ||
+              dirty_old_fnodes.size())) {
            dout(10) << " setting accounted_fragstat " << fragstat << " and setting dirty bit on "
                     << *dir << dendl;
            fnode_t *pf = dir->get_projected_fnode();
            pf->accounted_fragstat = fragstat;
            if (dir->is_auth())
              dir->_set_dirty_flag();       // bit of a hack
+           dir->dirty_old_fnodes.swap(dirty_old_fnodes);
          }
        }
       }
@@ -759,9 +767,11 @@ void CInode::decode_lock_state(int type, bufferlist& bl)
       dout(10) << " ...got " << n << " rstats on " << *this << dendl;
       while (n--) {
        frag_t fg;
+       snapid_t fgfirst;
        nest_info_t rstat;
        nest_info_t accounted_rstat;
        ::decode(fg, p);
+       ::decode(fgfirst, p);
        ::decode(rstat, p);
        ::decode(accounted_rstat, p);
        dout(10) << fg << " got changed rstat " << rstat << dendl;
@@ -782,6 +792,7 @@ void CInode::decode_lock_state(int type, bufferlist& bl)
              !(dir->fnode.accounted_rstat == rstat)) {
            dout(10) << " setting accounted_rstat " << rstat << " and setting dirty bit on "
                     << *dir << dendl;
+           dir->first = fgfirst;
            fnode_t *pf = dir->get_projected_fnode();
            pf->accounted_rstat = rstat;
            if (dir->is_auth())
@@ -874,17 +885,14 @@ void CInode::finish_scatter_gather_update(int type)
       for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
           p != dirfrags.end();
           p++) {
-       fnode_t *pf = p->second->get_projected_fnode();
-       if (true) { // FIXME pf->accounted_rstat.version == pi->rstat.version) {
-         dout(20) << "  frag " << p->first << " " << *p->second << dendl;
-         dout(20) << "             rstat " << pf->rstat << dendl;
-         dout(20) << "   accounted_rstat " << pf->accounted_rstat << dendl;
-         pi->rstat.take_diff(pf->rstat, 
-                             pf->accounted_rstat);
-       } else {
-         dout(20) << "  frag " << p->first << " on " << *p->second << dendl;
-         dout(20) << "    ignoring OLD accounted_rstat " << pf->accounted_rstat << dendl;
-       }
+       CDir *dir = p->second;
+       fnode_t *pf = dir->get_projected_fnode();
+       mdcache->project_rstat_frag_to_inode(*pf, dir->first, CEPH_NOSNAP, this);
+       for (map<snapid_t,old_fnode_t>::iterator q = dir->dirty_old_fnodes.begin();
+            q != dir->dirty_old_fnodes.end();
+            q++)
+         mdcache->project_rstat_frag_to_inode(q->second.fnode, q->second.first, q->first, this);
+       dir->dirty_old_fnodes.clear();
       }
       pi->rstat.version++;
       dout(20) << "       final rstat " << pi->rstat << dendl;
index f5ccd29301a70044297faab248a520ad65baf7cd..8b741a90b44867ecc7eefe4026c122e59998aa02 100644 (file)
@@ -1114,29 +1114,29 @@ void MDCache::project_rstat_inode_to_frag(inode_t& inode, snapid_t ofirst, snapi
                 << " " << pf->rstat << "/" << pf->accounted_rstat
                 << dendl;
        parent->dirty_old_fnodes[first-1].first = parent->first;
-       parent->dirty_old_fnodes[first-1].second = *pf;
+       parent->dirty_old_fnodes[first-1].fnode = *pf;
        parent->first = first;
       }
     } else if (last >= parent->first) {
       first = parent->first;
       parent->dirty_old_fnodes[last].first = first;
-      parent->dirty_old_fnodes[last].second = *parent->get_projected_fnode();
-      pf = &parent->dirty_old_fnodes[last].second;
+      parent->dirty_old_fnodes[last].fnode = *parent->get_projected_fnode();
+      pf = &parent->dirty_old_fnodes[last].fnode;
       dout(10) << " projecting to newly split dirty_old_fnode [" << first << "," << last << "] "
               << " " << pf->rstat << "/" << pf->accounted_rstat << dendl;
     } else {
-      map<snapid_t,pair<snapid_t,fnode_t> >::iterator p = parent->dirty_old_fnodes.lower_bound(last);
+      map<snapid_t,old_fnode_t>::iterator p = parent->dirty_old_fnodes.lower_bound(last);
       if (p == parent->dirty_old_fnodes.end()) {
        first = ofirst;
        parent->dirty_old_fnodes[last].first = first;
-       pf = &parent->dirty_old_fnodes[last].second;      
+       pf = &parent->dirty_old_fnodes[last].fnode;      
       } else {
        first = p->second.first;
        if (last < p->first) {
          parent->dirty_old_fnodes[last] = p->second;
          p->second.first = last+1;
        }
-       pf = &parent->dirty_old_fnodes[last].second;
+       pf = &parent->dirty_old_fnodes[last].fnode;
       }
     }
     
@@ -1302,7 +1302,7 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob,
 
       dout(10) << "    frag head is [" << parent->first << ",head] " << dendl;
       dout(10) << " inode update is [" << follows+1 << "," << cur->last << "]" << dendl;
-      project_rstat_inode_to_frag(cur->inode, follows+1, cur->last, parent, linkunlink);
+      project_rstat_inode_to_frag(*curi, follows+1, cur->last, parent, linkunlink);
       
       for (set<snapid_t>::iterator p = cur->dirty_old_rstats.begin();
           p != cur->dirty_old_rstats.end();
@@ -1372,10 +1372,10 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob,
     // rstat
     if (primary_dn) {
       project_rstat_frag_to_inode(*pf, follows+1, CEPH_NOSNAP, pin);
-      for (map<snapid_t,pair<snapid_t,fnode_t> >::iterator p = parent->dirty_old_fnodes.begin();
+      for (map<snapid_t,old_fnode_t>::iterator p = parent->dirty_old_fnodes.begin();
           p != parent->dirty_old_fnodes.end();
           p++)
-       project_rstat_frag_to_inode(p->second.second, p->second.first, p->first, pin);
+       project_rstat_frag_to_inode(p->second.fnode, p->second.first, p->first, pin);
       parent->dirty_old_fnodes.clear();
     }
 
index 93deae3ce5b91d9113b4090f896bfbe2e3056c4b..d5f12a1ac7dd3eeeb641a34f3d5140dd01b5e83d 100644 (file)
@@ -376,6 +376,21 @@ struct fnode_t {
 WRITE_CLASS_ENCODER(fnode_t)
 
 
+struct old_fnode_t {
+  snapid_t first;
+  fnode_t fnode;
+
+  void encode(bufferlist& bl) const {
+    ::encode(first, bl);
+    ::encode(fnode, bl);
+  }
+  void decode(bufferlist::iterator& bl) {
+    ::decode(first, bl);
+    ::decode(fnode, bl);
+  }
+};
+WRITE_CLASS_ENCODER(old_fnode_t)
+
 
 
 // =======
index 9bc3865f8b450fd3af2d96511c47f1e9de3f55a1..675c05ad19d56847ca400d336f2d734f8aab8c39 100644 (file)
@@ -1337,15 +1337,15 @@ void ObjectCacher::purge(Object *ob)
        p != ob->data.end();
        p++) {
     BufferHead *bh = p->second;
-       if (!bh->is_clean())
-         dout(0) << "purge forcibly removing " << *ob << " " << *bh << dendl;
-       bh_remove(ob, bh);
-       delete bh;
+    if (!bh->is_clean())
+      dout(0) << "purge forcibly removing " << *ob << " " << *bh << dendl;
+    bh_remove(ob, bh);
+    delete bh;
   }
-
+  
   if (ob->can_close()) {
-       dout(10) << "trim trimming " << *ob << dendl;
-       close_object(ob);
+    dout(10) << "trim trimming " << *ob << dendl;
+    close_object(ob);
   }
 }