From: Greg Farnum Date: Thu, 29 Apr 2010 23:09:27 +0000 (-0700) Subject: mds: Now actually requeues blocked locks whenever locks are removed. X-Git-Tag: v0.22~346^2~23 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=80412537ee79cc3c883cb8254dc97cc50d67c56c;p=ceph.git mds: Now actually requeues blocked locks whenever locks are removed. --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index eb93a7e473c..d7c84b8faa1 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -575,6 +575,15 @@ void CInode::remove_client_cap(client_t client) mdcache->num_inodes_with_caps--; } 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); + if (fcntl_removed || flock_removed) { + list waiters; + take_waiting(CInode::WAIT_FLOCK, waiters); + mdcache->mds->queue_waiters(waiters); + } } void CInode::move_to_realm(SnapRealm *realm) diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 32a136e3702..ce4c721e9c5 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -2605,6 +2605,9 @@ void Server::handle_client_file_setlock(MDRequest *mdr) /* For now we're ignoring the activated locks because their responses * will be sent when the lock comes up again in rotation by the MDS. * It's a cheap hack, but it's easy to code. */ + list waiters; + cur->take_waiting(CInode::WAIT_FLOCK, waiters); + mds->queue_waiters(waiters); } else { if (lock_state->add_lock(set_lock, will_wait)) { // lock set successfully