]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: more nesting lock, data type work
authorSage Weil <sage@newdream.net>
Mon, 12 May 2008 23:39:52 +0000 (16:39 -0700)
committerSage Weil <sage@newdream.net>
Thu, 22 May 2008 21:21:07 +0000 (14:21 -0700)
src/include/types.h
src/mds/CInode.cc
src/mds/CInode.h
src/mds/Locker.cc

index aebe285ff5f78491628c307ff165364ccf4ccefc..a9272ba3c0ca7be1a24406dfc31514d035eb91f6 100644 (file)
@@ -199,6 +199,21 @@ struct FileLayout {
   __u8  fl_pg_pool;      /* implies crush ruleset AND object namespace */
 };
 
+struct nested_info_t {
+  uint64_t nested_size;       // \sum_{children}(size + nested_size)
+  utime_t  nested_ctime;      // \max_{children}(ctime, nested_ctime)
+  
+  void encode(bufferlist &bl) const {
+    ::encode(nested_size, bl);
+    ::encode(nested_ctime, bl);
+  }
+  void decode(bufferlist::iterator &bl) {
+    ::decode(nested_size, bl);
+    ::decode(nested_ctime, bl);
+  }
+};
+WRITE_CLASS_ENCODER(nested_info_t)
+
 struct inode_t {
   // base (immutable)
   inodeno_t ino;
@@ -224,9 +239,8 @@ struct inode_t {
   utime_t    atime;   // file data access time.
   uint64_t   time_warp_seq;  // count of (potential) mtime/atime timewarps (i.e., utimes())
 
-  // recursive accounting
-  uint64_t nested_size;       // \sum_{children}(size + nested_size)
-  utime_t  nested_ctime;      // \max_{children}(ctime, nested_ctime)
+  // dirfrag, recursive accounting
+  nested_info_t nested;   // inline summation
  
   // special stuff
   version_t version;           // auth only
@@ -252,7 +266,7 @@ static inline void encode(const inode_t &i, bufferlist &bl) {
   ::encode(i.max_size, bl);
   ::encode(i.mtime, bl);
   ::encode(i.atime, bl);
-  ::encode(i.rmtime, bl);
+  ::encode(i.nested, bl);
   ::encode(i.version, bl);
   ::encode(i.file_data_version, bl);
 }
@@ -270,7 +284,7 @@ static inline void decode(inode_t &i, bufferlist::iterator &p) {
   ::decode(i.max_size, p);
   ::decode(i.mtime, p);
   ::decode(i.atime, p);
-  ::decode(i.rmtime, p);
+  ::decode(i.nested, p);
   ::decode(i.version, p);
   ::decode(i.file_data_version, p);
 }
index 92d5004fcf5daa5f3d510b649bc1b432ae94c902..3f996892c81c3c1095d6de776d188bac07a52009 100644 (file)
@@ -521,15 +521,16 @@ void CInode::encode_lock_state(int type, bufferlist& bl)
     break;
 
   case CEPH_LOCK_IDIR:
-    ::encode(inode.mtime, bl);
-    if (0) {
+    {
+      ::encode(inode.size, bl);
+      ::encode(inode.mtime, bl);
       map<frag_t,int> frag_sizes;
       for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
           p != dirfrags.end();
           ++p) 
        if (p->second->is_auth()) {
-         //frag_t fg = (*p)->get_frag();
-         //frag_sizes[f] = dirfrag_size[fg];
+         frag_t fg = (*p)->get_frag();
+         frag_sizes[f] = dirfrag_size[fg];
        }
       ::encode(frag_sizes, bl);
     }
@@ -540,8 +541,17 @@ void CInode::encode_lock_state(int type, bufferlist& bl)
     break;
   
   case CEPH_LOCK_INESTED:
-    //_encode(inode.nested_ctime, bl);
-    //_encode(inode.nested_size, bl);
+    {
+      map<frag_t,nested_info_t> dfn;
+      for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+          p != dirfrags.end();
+          ++p) 
+       if (p->second->is_auth()) {
+         frag_t fg = (*p)->get_frag();
+         dfn[fg] = dirfrag_nested[fg];
+       }
+      ::encode(dfn, bl);
+    }
     break;
 
   default:
@@ -552,7 +562,6 @@ void CInode::encode_lock_state(int type, bufferlist& bl)
 void CInode::decode_lock_state(int type, bufferlist& bl)
 {
   bufferlist::iterator p = bl.begin();
-  utime_t tm;
 
   switch (type) {
   case CEPH_LOCK_IAUTH:
@@ -594,21 +603,31 @@ void CInode::decode_lock_state(int type, bufferlist& bl)
     break;
 
   case CEPH_LOCK_IDIR:
-    //::_decode(inode.size, p);
-    ::decode(tm, p);
-    if (inode.mtime < tm) {
-      inode.mtime = tm;
-      if (is_auth()) {
-       dout(10) << "decode_lock_state auth got mtime " << tm << " > my " << inode.mtime
-                << ", setting dirlock updated flag on " << *this
-                << dendl;
-       dirlock.set_updated();
-      }
-    }
-    if (0) {
+    {
+      utime_t tm;
+      uint64_t sz;
       map<frag_t,int> dfsz;
+      ::decode(sz, p);
+      ::decode(tm, p);
       ::decode(dfsz, p);
-      // hmm which to keep?
+      
+      if (is_auth()) {
+       if (tm > inode.mtime) {
+         dout(10) << "decode_lock_state auth got mtime " << tm << " > my " << inode.mtime
+                  << ", setting dirlock updated flag on " << *this
+                  << dendl;
+         inode.mtime = tm;
+         dirlock.set_updated();
+       }
+       for (map<frag_t,int>::iterator p = dfsz.begin(); p != dfsz.end(); ++p) {
+         dirfragtree.force_to_leaf(p->first);
+         dirfrag_size[p->first] = p->second;
+       }
+      } else {
+       inode.mtime = tm;
+       inode.size = sz;
+       dirfrag_size.swap(dfsz);
+      }
     }
     break;
 
@@ -617,7 +636,14 @@ void CInode::decode_lock_state(int type, bufferlist& bl)
     break;
 
   case CEPH_LOCK_INESTED:
-    // ***
+    {
+      map<frag_t,nested_info_t> dfn;
+      ::decode(dfn, p);
+      for (map<frag_t,nested_info_t>::iterator p = dfn.begin(); p != dfn.end(); ++p) {
+       dirfragtree.force_to_leaf(p->first);
+       dirfrag_nested[p->first] = p->second;
+      }
+    }
     break;
 
   default:
@@ -632,6 +658,9 @@ void CInode::clear_dirty_scattered(int type)
   case CEPH_LOCK_IDIR:
     xlist_dirty_inode_mtime.remove_myself();
     break;
+  case CEPH_LOCK_INESTED:
+    assert(0); // hmm!
+    break;
   default:
     assert(0);
   }
index 3fa0f183229cae472a8940a0d5b12f5f9d4707cd..df58af9541326832a33defbd84ae98e11588d911 100644 (file)
@@ -136,6 +136,7 @@ class CInode : public MDSCacheObject {
   map<string, bufferptr> xattrs;
   fragtree_t       dirfragtree;  // dir frag tree, if any.  always consistent with our dirfrag map.
   map<frag_t,int>  dirfrag_size; // size of each dirfrag
+  map<frag_t,nested_info_t> dirfrag_nested;
 
   off_t last_journaled;       // log offset for the last time i was journaled
   off_t last_open_journaled;  // log offset for the last journaled EOpen
index 0238c6f9555d8991f3d8313635ad47e6eb21e6d8..2a620f5c96a854259bb04082148660f5ddcdad88 100644 (file)
@@ -341,6 +341,7 @@ void Locker::eval_gather(SimpleLock *lock)
     return file_eval_gather((FileLock*)lock);
   case CEPH_LOCK_IDFT:
   case CEPH_LOCK_IDIR:
+  case CEPH_LOCK_INESTED:
     return scatter_eval_gather((ScatterLock*)lock);
   default:
     return simple_eval_gather(lock);
@@ -354,6 +355,7 @@ bool Locker::rdlock_start(SimpleLock *lock, MDRequest *mdr)
     return file_rdlock_start((FileLock*)lock, mdr);
   case CEPH_LOCK_IDFT:
   case CEPH_LOCK_IDIR:
+  case CEPH_LOCK_INESTED:
     return scatter_rdlock_start((ScatterLock*)lock, mdr);
   default:
     return simple_rdlock_start(lock, mdr);
@@ -367,6 +369,7 @@ void Locker::rdlock_finish(SimpleLock *lock, MDRequest *mdr)
     return file_rdlock_finish((FileLock*)lock, mdr);
   case CEPH_LOCK_IDFT:
   case CEPH_LOCK_IDIR:
+  case CEPH_LOCK_INESTED:
     return scatter_rdlock_finish((ScatterLock*)lock, mdr);
   default:
     return simple_rdlock_finish(lock, mdr);
@@ -378,6 +381,7 @@ bool Locker::wrlock_start(SimpleLock *lock, MDRequest *mdr)
   switch (lock->get_type()) {
   case CEPH_LOCK_IDFT:
   case CEPH_LOCK_IDIR:
+  case CEPH_LOCK_INESTED:
     return scatter_wrlock_start((ScatterLock*)lock, mdr);
   case CEPH_LOCK_IVERSION:
     return local_wrlock_start((LocalLock*)lock, mdr);
@@ -394,6 +398,7 @@ void Locker::wrlock_finish(SimpleLock *lock, MDRequest *mdr)
   switch (lock->get_type()) {
   case CEPH_LOCK_IDFT:
   case CEPH_LOCK_IDIR:
+  case CEPH_LOCK_INESTED:
     return scatter_wrlock_finish((ScatterLock*)lock, mdr);
   case CEPH_LOCK_IVERSION:
     return local_wrlock_finish((LocalLock*)lock, mdr);
@@ -411,6 +416,7 @@ bool Locker::xlock_start(SimpleLock *lock, MDRequest *mdr)
     return local_xlock_start((LocalLock*)lock, mdr);
   case CEPH_LOCK_IDFT:
   case CEPH_LOCK_IDIR:
+  case CEPH_LOCK_INESTED:
     assert(0);
   default:
     return simple_xlock_start(lock, mdr);
@@ -426,6 +432,7 @@ void Locker::xlock_finish(SimpleLock *lock, MDRequest *mdr)
     return local_xlock_finish((LocalLock*)lock, mdr);
   case CEPH_LOCK_IDFT:
   case CEPH_LOCK_IDIR:
+  case CEPH_LOCK_INESTED:
     assert(0);
   default:
     return simple_xlock_finish(lock, mdr);
@@ -1235,6 +1242,7 @@ SimpleLock *Locker::get_lock(int lock_type, MDSCacheObjectInfo &info)
   case CEPH_LOCK_IFILE:
   case CEPH_LOCK_IDIR:
   case CEPH_LOCK_IXATTR:
+  case CEPH_LOCK_INESTED:
     {
       CInode *in = mdcache->get_inode(info.ino);
       if (!in) {
@@ -1248,6 +1256,7 @@ SimpleLock *Locker::get_lock(int lock_type, MDSCacheObjectInfo &info)
       case CEPH_LOCK_IFILE: return &in->filelock;
       case CEPH_LOCK_IDIR: return &in->dirlock;
       case CEPH_LOCK_IXATTR: return &in->xattrlock;
+      case CEPH_LOCK_INESTED: return &in->nestedlock;
       }
     }
 
@@ -1286,6 +1295,7 @@ void Locker::handle_lock(MLock *m)
     
   case CEPH_LOCK_IDFT:
   case CEPH_LOCK_IDIR:
+  case CEPH_LOCK_INESTED:
     handle_scatter_lock((ScatterLock*)lock, m);
     break;