diff options
author | Sage Weil <sage@newdream.net> | 2009-02-23 20:27:03 -0800 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2009-02-23 20:27:03 -0800 |
commit | eeab259d4580597c8c1f9c02cd12deb442fc9363 (patch) | |
tree | 94e2e76df8cb531a032701b1effc3173cc77d3c1 | |
parent | 48f331c139d8c2743003e867a16104d83f0542b0 (diff) | |
download | ceph-eeab259d4580597c8c1f9c02cd12deb442fc9363.tar.gz |
mds: change lock state when rdlock_try blocks
Previously we would wait but leave the lock state unchanges. Der.
-rw-r--r-- | src/mds/Locker.cc | 50 | ||||
-rw-r--r-- | src/mds/Locker.h | 1 |
2 files changed, 34 insertions, 17 deletions
diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 211b6c22f0f..a144be819ab 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -540,17 +540,45 @@ void Locker::eval(SimpleLock *lock) // ------------------ // rdlock +bool Locker::_rdlock_kick(SimpleLock *lock) +{ + if (lock->is_stable() && + lock->get_parent()->is_auth()) { + if (lock->sm == &sm_scatterlock) { + if (lock->get_parent()->is_replicated()) + scatter_tempsync((ScatterLock*)lock); + else + simple_sync(lock); + } else if (lock->sm == &sm_filelock) + simple_lock(lock); + else + simple_sync(lock); + return true; + } else + return false; +} + bool Locker::rdlock_try(SimpleLock *lock, int client, Context *con) { dout(7) << "rdlock_try on " << *lock << " on " << *lock->get_parent() << dendl; - // can read? grab ref. - if (lock->can_rdlock(client)) - return true; - + while (1) { + // can read? grab ref. + if (lock->can_rdlock(client)) + return true; + + if (!_rdlock_kick(lock)) + break; + } + // wait! dout(7) << "rdlock_try waiting on " << *lock << " on " << *lock->get_parent() << dendl; if (con) lock->add_waiter(SimpleLock::WAIT_RD, con); + + // make sure we aren't waiting on a cap flush + if (lock->get_parent()->is_auth() && lock->is_wrlocked()) + mds->mdlog->flush(); + return false; } @@ -576,19 +604,7 @@ bool Locker::rdlock_start(SimpleLock *lock, MDRequest *mut) return true; } - if (lock->is_stable() && - lock->get_parent()->is_auth()) { - if (lock->sm == &sm_scatterlock) { - if (lock->get_parent()->is_replicated()) - scatter_tempsync((ScatterLock*)lock); - else - simple_sync(lock); - } else if (lock->sm == &sm_filelock) - simple_lock(lock); - else - simple_sync(lock); - } - else + if (!_rdlock_kick(lock)) break; } diff --git a/src/mds/Locker.h b/src/mds/Locker.h index eedace88107..9124668968a 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -89,6 +89,7 @@ public: void eval_cap_gather(CInode *in); void eval(SimpleLock *lock); + bool _rdlock_kick(SimpleLock *lock); bool rdlock_try(SimpleLock *lock, int client, Context *c); bool rdlock_start(SimpleLock *lock, MDRequest *mut); void rdlock_finish(SimpleLock *lock, Mutation *mut); |