From f5a7b8d8e634cf26346baa13d9560a05c416bce9 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 8 May 2008 10:00:25 -0700 Subject: [PATCH] mds: initial nested lock types, inode fields --- src/include/ceph_fs.h | 7 ++++++- src/include/types.h | 9 ++++++--- src/mds/CInode.cc | 9 +++++++++ src/mds/CInode.h | 8 ++++++-- src/messages/MClientReply.h | 10 +++++++--- 5 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index 22f52ccb56629..7c73f462f7a13 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -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)); diff --git a/src/include/types.h b/src/include/types.h index af5aa2bf776a8..aebe285ff5f78 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -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 diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index cc7eaeaf9895a..92d5004fcf5da 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -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); } diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 729f32899a6e9..3fa0f183229ca 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -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); diff --git a/src/messages/MClientReply.h b/src/messages/MClientReply.h index f43fc32b2ac74..66112a9c8931c 100644 --- a/src/messages/MClientReply.h +++ b/src/messages/MClientReply.h @@ -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); -- 2.39.5