From: Yan, Zheng Date: Mon, 9 Feb 2015 04:56:44 +0000 (+0800) Subject: mds: dynamiclly allocate data structures for file locks X-Git-Tag: v9.0.0~201^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=151494f407093706f971dbff7d07d1562110bf80;p=ceph.git mds: dynamiclly allocate data structures for file locks Size of ceph_lock_state_t is about 200 bytes, CInode contains two ceph_lock_state_t. Dynamiclly allocating them can save about 400 bytes. Signed-off-by: Yan, Zheng --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 839ad6a4871..4569234116f 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -1452,8 +1452,7 @@ void CInode::encode_lock_state(int type, bufferlist& bl) case CEPH_LOCK_IFLOCK: ::encode(inode.version, bl); - ::encode(fcntl_locks, bl); - ::encode(flock_locks, bl); + _encode_file_locks(bl); break; case CEPH_LOCK_IPOLICY: @@ -1707,8 +1706,7 @@ void CInode::decode_lock_state(int type, bufferlist& bl) case CEPH_LOCK_IFLOCK: ::decode(inode.version, p); - ::decode(fcntl_locks, p); - ::decode(flock_locks, p); + _decode_file_locks(p); break; case CEPH_LOCK_IPOLICY: @@ -2714,8 +2712,8 @@ void CInode::remove_client_cap(client_t client) mdcache->num_caps--; //clean up advisory locks - bool fcntl_removed = fcntl_locks.remove_all_from(client); - bool flock_removed = flock_locks.remove_all_from(client); + bool fcntl_removed = fcntl_locks ? fcntl_locks->remove_all_from(client) : false; + bool flock_removed = flock_locks ? flock_locks->remove_all_from(client) : false; if (fcntl_removed || flock_removed) { list waiters; take_waiting(CInode::WAIT_FLOCK, waiters); @@ -3429,8 +3427,8 @@ void CInode::encode_export(bufferlist& bl) _encode_locks_full(bl); - ::encode(fcntl_locks, bl); - ::encode(flock_locks, bl); + _encode_file_locks(bl); + ENCODE_FINISH(bl); get(PIN_TEMPEXPORTING); @@ -3521,10 +3519,7 @@ void CInode::decode_import(bufferlist::iterator& p, _decode_locks_full(p); - if (struct_v >= 5) { - ::decode(fcntl_locks, p); - ::decode(flock_locks, p); - } + _decode_file_locks(p); DECODE_FINISH(p); } diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 35c4f923670..1dfa26f3ced 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -451,12 +451,54 @@ public: protected: - ceph_lock_state_t fcntl_locks; - ceph_lock_state_t flock_locks; + ceph_lock_state_t *fcntl_locks; + ceph_lock_state_t *flock_locks; + ceph_lock_state_t *get_fcntl_lock_state() { + if (!fcntl_locks) + fcntl_locks = new ceph_lock_state_t(g_ceph_context); + return fcntl_locks; + } + void clear_fcntl_lock_state() { + delete fcntl_locks; + fcntl_locks = NULL; + } + ceph_lock_state_t *get_flock_lock_state() { + if (!flock_locks) + flock_locks = new ceph_lock_state_t(g_ceph_context); + return flock_locks; + } + void clear_flock_lock_state() { + delete flock_locks; + flock_locks = NULL; + } void clear_file_locks() { - fcntl_locks.clear(); - flock_locks.clear(); + clear_fcntl_lock_state(); + clear_flock_lock_state(); + } + void _encode_file_locks(bufferlist& bl) const { + bool has_fcntl_locks = fcntl_locks && !fcntl_locks->empty(); + ::encode(has_fcntl_locks, bl); + if (has_fcntl_locks) + ::encode(*fcntl_locks, bl); + bool has_flock_locks = flock_locks && !flock_locks->empty(); + ::encode(has_flock_locks, bl); + if (has_flock_locks) + ::encode(*flock_locks, bl); + } + void _decode_file_locks(bufferlist::iterator& p) { + bool has_fcntl_locks; + ::decode(has_fcntl_locks, p); + if (has_fcntl_locks) + ::decode(*get_fcntl_lock_state(), p); + else + clear_fcntl_lock_state(); + bool has_flock_locks; + ::decode(has_flock_locks, p); + if (has_flock_locks) + ::decode(*get_flock_lock_state(), p); + else + clear_flock_lock_state(); } // LogSegment lists i (may) belong to @@ -500,7 +542,7 @@ public: parent(0), inode_auth(CDIR_AUTH_DEFAULT), replica_caps_wanted(0), - fcntl_locks(g_ceph_context), flock_locks(g_ceph_context), + fcntl_locks(0), flock_locks(0), item_dirty(this), item_caps(this), item_open_file(this), item_dirty_parent(this), item_dirty_dirfrag_dir(this), item_dirty_dirfrag_nest(this), @@ -530,6 +572,7 @@ public: g_num_inos++; close_dirfrags(); close_snaprealm(); + clear_file_locks(); } diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 063322142f1..7a350cfbf6d 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -3054,17 +3054,17 @@ bool Locker::_do_cap_update(CInode *in, Capability *cap, for ( int i=0; i < num_locks; ++i) { ceph_filelock decoded_lock; ::decode(decoded_lock, bli); - in->fcntl_locks.held_locks. + in->get_fcntl_lock_state()->held_locks. insert(pair(decoded_lock.start, decoded_lock)); - ++in->fcntl_locks.client_held_lock_counts[(client_t)(decoded_lock.client)]; + ++in->get_fcntl_lock_state()->client_held_lock_counts[(client_t)(decoded_lock.client)]; } ::decode(num_locks, bli); for ( int i=0; i < num_locks; ++i) { ceph_filelock decoded_lock; ::decode(decoded_lock, bli); - in->flock_locks.held_locks. + in->get_flock_lock_state()->held_locks. insert(pair(decoded_lock.start, decoded_lock)); - ++in->flock_locks.client_held_lock_counts[(client_t)(decoded_lock.client)]; + ++in->get_flock_lock_state()->client_held_lock_counts[(client_t)(decoded_lock.client)]; } } diff --git a/src/mds/MDS.h b/src/mds/MDS.h index 5da3a8b4697..dca10c70249 100644 --- a/src/mds/MDS.h +++ b/src/mds/MDS.h @@ -39,7 +39,7 @@ #include "Beacon.h" -#define CEPH_MDS_PROTOCOL 24 /* cluster internal */ +#define CEPH_MDS_PROTOCOL 25 /* cluster internal */ enum { l_mds_first = 2000, diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 39b7bd7a22b..a484393e236 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -813,17 +813,15 @@ void Server::recover_filelocks(CInode *in, bufferlist locks, int64_t client) for (int i = 0; i < numlocks; ++i) { ::decode(lock, p); lock.client = client; - in->fcntl_locks.held_locks.insert(pair - (lock.start, lock)); - ++in->fcntl_locks.client_held_lock_counts[client]; + in->get_fcntl_lock_state()->held_locks.insert(pair(lock.start, lock)); + ++in->get_fcntl_lock_state()->client_held_lock_counts[client]; } ::decode(numlocks, p); for (int i = 0; i < numlocks; ++i) { ::decode(lock, p); lock.client = client; - in->flock_locks.held_locks.insert(pair - (lock.start, lock)); - ++in->flock_locks.client_held_lock_counts[client]; + in->get_flock_lock_state()->held_locks.insert(pair (lock.start, lock)); + ++in->get_flock_lock_state()->client_held_lock_counts[client]; } } @@ -3340,14 +3338,14 @@ void Server::handle_client_file_setlock(MDRequestRef& mdr) interrupt = true; // fall-thru case CEPH_LOCK_FLOCK: - lock_state = &cur->flock_locks; + lock_state = cur->get_flock_lock_state(); break; case CEPH_LOCK_FCNTL_INTR: interrupt = true; // fall-thru case CEPH_LOCK_FCNTL: - lock_state = &cur->fcntl_locks; + lock_state = cur->get_fcntl_lock_state(); break; default: @@ -3430,11 +3428,11 @@ void Server::handle_client_file_readlock(MDRequestRef& mdr) ceph_lock_state_t *lock_state = NULL; switch (req->head.args.filelock_change.rule) { case CEPH_LOCK_FLOCK: - lock_state = &cur->flock_locks; + lock_state = cur->get_flock_lock_state(); break; case CEPH_LOCK_FCNTL: - lock_state = &cur->fcntl_locks; + lock_state = cur->get_fcntl_lock_state(); break; default: diff --git a/src/mds/flock.h b/src/mds/flock.h index bf3980d094b..37149eb7c43 100644 --- a/src/mds/flock.h +++ b/src/mds/flock.h @@ -215,6 +215,11 @@ public: client_held_lock_counts.clear(); client_waiting_lock_counts.clear(); } + bool empty() const { + return held_locks.empty() && waiting_locks.empty() && + client_held_lock_counts.empty() && + client_waiting_lock_counts.empty(); + } }; WRITE_CLASS_ENCODER(ceph_lock_state_t)