summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2009-02-23 20:27:03 -0800
committerSage Weil <sage@newdream.net>2009-02-23 20:27:03 -0800
commiteeab259d4580597c8c1f9c02cd12deb442fc9363 (patch)
tree94e2e76df8cb531a032701b1effc3173cc77d3c1
parent48f331c139d8c2743003e867a16104d83f0542b0 (diff)
downloadceph-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.cc50
-rw-r--r--src/mds/Locker.h1
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);