]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: initial nested lock types, inode fields
authorSage Weil <sage@newdream.net>
Thu, 8 May 2008 17:00:25 +0000 (10:00 -0700)
committerSage Weil <sage@newdream.net>
Thu, 22 May 2008 21:21:07 +0000 (14:21 -0700)
src/include/ceph_fs.h
src/include/types.h
src/mds/CInode.cc
src/mds/CInode.h
src/messages/MClientReply.h

index 22f52ccb56629db605b857a0cc2f65ef6b8c196a..7c73f462f7a138ff767c11c838dcbf15556d6d6c 100644 (file)
@@ -417,7 +417,8 @@ struct ceph_mds_getmap {
 #define CEPH_LOCK_IDFT        32    /* dir frag tree */
 #define CEPH_LOCK_IDIR        64    /* mds internal */
 #define CEPH_LOCK_IXATTR      128
-#define CEPH_LOCK_INO         256   /* immutable inode bits; not actually a lock */
+#define CEPH_LOCK_INESTED     256
+#define CEPH_LOCK_INO         2048   /* immutable inode bits; not actually a lock */
 
 #define CEPH_LOCK_ICONTENT    (CEPH_LOCK_IFILE|CEPH_LOCK_IDIR)  /* alias for either filelock or dirlock */
 
@@ -436,6 +437,8 @@ struct ceph_mds_getmap {
 #define CEPH_STAT_MASK_SIZE     CEPH_LOCK_ICONTENT
 #define CEPH_STAT_MASK_ATIME    CEPH_LOCK_ICONTENT  /* fixme */
 #define CEPH_STAT_MASK_XATTR    CEPH_LOCK_IXATTR
+#define CEPH_STAT_MASK_NSIZE    CEPH_LOCK_INESTED
+#define CEPH_STAT_MASK_NCTIME   CEPH_LOCK_INESTED
 #define CEPH_STAT_MASK_INODE_ALL (CEPH_LOCK_ICONTENT|CEPH_LOCK_IAUTH|CEPH_LOCK_ILINK|CEPH_LOCK_INO)
 
 #define CEPH_UTIME_ATIME               1
@@ -623,6 +626,8 @@ struct ceph_mds_reply_inode {
        __le32 mode, uid, gid;
        __le32 nlink;
        __le64 size, max_size;
+       __le64 nested_size;
+       struct ceph_timespec nested_ctime;
        __le32 rdev;
        struct ceph_frag_tree_head fragtree;
 } __attribute__ ((packed));
index af5aa2bf776a83b5d980d5b00495024e777f3d72..aebe285ff5f78491628c307ff165364ccf4ccefc 100644 (file)
@@ -218,12 +218,15 @@ struct inode_t {
   bool       anchored;          // auth only?
 
   // file (data access)
-  uint64_t    size;
-  uint64_t    max_size; // client(s) are auth to write this much...
+  uint64_t   size;        // on directory, # dentries
+  uint64_t   max_size;    // client(s) are auth to write this much...
   utime_t    mtime;   // file data modify time.
   utime_t    atime;   // file data access time.
-  utime_t    rmtime;  // recursive mtime?
   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)
  
   // special stuff
   version_t version;           // auth only
index cc7eaeaf9895a7eb9fbe200814e586da43af1ea1..92d5004fcf5daa5f3d510b649bc1b432ae94c902 100644 (file)
@@ -539,6 +539,11 @@ void CInode::encode_lock_state(int type, bufferlist& bl)
     ::encode(xattrs, bl);
     break;
   
+  case CEPH_LOCK_INESTED:
+    //_encode(inode.nested_ctime, bl);
+    //_encode(inode.nested_size, bl);
+    break;
+
   default:
     assert(0);
   }
@@ -611,6 +616,10 @@ void CInode::decode_lock_state(int type, bufferlist& bl)
     ::decode(xattrs, p);
     break;
 
+  case CEPH_LOCK_INESTED:
+    // ***
+    break;
+
   default:
     assert(0);
   }
index 729f32899a6e9abd2d03efba4c119982a0278947..3fa0f183229cae472a8940a0d5b12f5f9d4707cd 100644 (file)
@@ -118,6 +118,7 @@ class CInode : public MDSCacheObject {
   static const int WAIT_DIRLOCK_OFFSET = 5 + 4*SimpleLock::WAIT_BITS;
   static const int WAIT_VERSIONLOCK_OFFSET = 5 + 5*SimpleLock::WAIT_BITS;
   static const int WAIT_XATTRLOCK_OFFSET = 5 + 6*SimpleLock::WAIT_BITS;
+  static const int WAIT_NESTEDLOCK_OFFSET = 5 + 7*SimpleLock::WAIT_BITS;
 
   static const int WAIT_ANY_MASK       = (0xffffffff);
 
@@ -253,7 +254,8 @@ public:
     dirfragtreelock(this, CEPH_LOCK_IDFT, WAIT_DIRFRAGTREELOCK_OFFSET),
     filelock(this, CEPH_LOCK_IFILE, WAIT_FILELOCK_OFFSET),
     dirlock(this, CEPH_LOCK_IDIR, WAIT_DIRLOCK_OFFSET),
-    xattrlock(this, CEPH_LOCK_IXATTR, WAIT_XATTRLOCK_OFFSET)
+    xattrlock(this, CEPH_LOCK_IXATTR, WAIT_XATTRLOCK_OFFSET),
+    nestedlock(this, CEPH_LOCK_INESTED, WAIT_NESTEDLOCK_OFFSET)
   {
     memset(&inode, 0, sizeof(inode));
     state = 0;  
@@ -340,7 +342,7 @@ public:
   FileLock   filelock;
   ScatterLock dirlock;
   SimpleLock xattrlock;
-
+  ScatterLock nestedlock;
 
   SimpleLock* get_lock(int type) {
     switch (type) {
@@ -350,9 +352,11 @@ public:
     case CEPH_LOCK_IDFT: return &dirfragtreelock;
     case CEPH_LOCK_IDIR: return &dirlock;
     case CEPH_LOCK_IXATTR: return &xattrlock;
+    case CEPH_LOCK_INESTED: return &nestedlock;
     }
     return 0;
   }
+
   void set_object_info(MDSCacheObjectInfo &info);
   void encode_lock_state(int type, bufferlist& bl);
   void decode_lock_state(int type, bufferlist& bl);
index f43fc32b2ac74b7c5dea585885831237de9a227e..66112a9c8931cf0d2199e4fd5dd3531dc127bd07 100644 (file)
@@ -101,13 +101,12 @@ struct DirStat {
 };
 
 struct InodeStat {
-  //inode_t inode;
   inodeno_t ino;
   version_t version;
   ceph_file_layout layout;
-  utime_t ctime, mtime, atime;
+  utime_t ctime, mtime, atime, nested_ctime;
   unsigned mode, uid, gid, nlink, rdev;
-  loff_t size, max_size;
+  loff_t size, max_size, nested_size;
   version_t time_warp_seq;
   
   string  symlink;   // symlink content (if symlink)
@@ -138,6 +137,9 @@ struct InodeStat {
     max_size = e.max_size;
     rdev = e.rdev;
 
+    nested_ctime.decode_timeval(&e.nested_ctime);
+    nested_size = e.nested_size;
+
     int n = e.fragtree.nsplits;
     while (n) {
       ceph_frag_tree_split s;
@@ -165,6 +167,7 @@ struct InodeStat {
     in->inode.ctime.encode_timeval(&e.ctime);
     in->inode.mtime.encode_timeval(&e.mtime);
     in->inode.atime.encode_timeval(&e.atime);
+    in->inode.nested_ctime.encode_timeval(&e.nested_ctime);
     e.time_warp_seq = in->inode.time_warp_seq;
     e.mode = in->inode.mode;
     e.uid = in->inode.uid;
@@ -172,6 +175,7 @@ struct InodeStat {
     e.nlink = in->inode.nlink;
     e.size = in->inode.size;
     e.max_size = in->inode.max_size;
+    e.nested_size = in->inode.nested_size;
     e.rdev = in->inode.rdev;
     e.fragtree.nsplits = in->dirfragtree._splits.size();
     ::encode(e, bl);