]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: make scatterlock revoke leases
authorSage Weil <sage@newdream.net>
Wed, 26 Mar 2008 20:13:53 +0000 (13:13 -0700)
committerSage Weil <sage@newdream.net>
Wed, 26 Mar 2008 20:13:53 +0000 (13:13 -0700)
src/TODO
src/mds/Locker.cc

index 0fd3b94d50351d3d2d948e5fc051f16383c4a2d5..842795aebce32b561a4511b3f85d061a9d756903 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -6,9 +6,7 @@ code cleanup
 
 client leases
 - FIX max_size!!!!!!!!!
-- IFILE lease vs filelock and caps...
-- IFILE lease vs dirlock...
-  - do i need to unify filelock and scatterlock?
+- scatterlock needs to do lease callbacks
 - lease length heuristics
   - mds lock last_change stamp?
 - client: preemptively release lease on dentry we are unlinking, renaming from/to, etc.
index 843a13eb7b7b65b29d471020a71227f9b56ff302..aeefd4ab84916b40ee15784f19ac7e1cbc6d15e6 100644 (file)
@@ -1803,6 +1803,7 @@ void Locker::scatter_eval_gather(ScatterLock *lock)
     if ((lock->get_state() == LOCK_GLOCKS || 
         lock->get_state() == LOCK_GLOCKT) &&
        !lock->is_gathering() &&
+       lock->get_num_client_lease() == 0 &&
        !lock->is_rdlocked()) {
       dout(7) << "scatter_eval finished lock gather/un-rdlock on " << *lock
              << " on " << *lock->get_parent() << dendl;
@@ -1846,6 +1847,7 @@ void Locker::scatter_eval_gather(ScatterLock *lock)
     else if ((lock->get_state() == LOCK_GSCATTERT ||
              lock->get_state() == LOCK_GSCATTERS) &&
             !lock->is_gathering() &&
+            lock->get_num_client_lease() == 0 &&
             !lock->is_rdlocked()) {
       dout(7) << "scatter_eval finished scatter un-rdlock(/gather) on " << *lock
              << " on " << *lock->get_parent() << dendl;
@@ -2042,12 +2044,14 @@ void Locker::scatter_scatter(ScatterLock *lock)
   switch (lock->get_state()) {
   case LOCK_SYNC:
     if (!lock->is_rdlocked() &&
-       !lock->get_parent()->is_replicated())
+       !lock->get_parent()->is_replicated() &&
+       !lock->get_num_client_lease())
       break; // do it
     if (lock->get_parent()->is_replicated()) {
       send_lock_message(lock, LOCK_AC_LOCK);
       lock->init_gather();
     }
+    revoke_client_leases(lock);
     lock->set_state(LOCK_GSCATTERS);
     lock->get_parent()->auth_pin();
     return;
@@ -2093,13 +2097,15 @@ void Locker::scatter_lock(ScatterLock *lock)
   switch (lock->get_state()) {
   case LOCK_SYNC:
     if (!lock->is_rdlocked() &&
-       !lock->get_parent()->is_replicated())
+       !lock->get_parent()->is_replicated() &&
+       !lock->get_num_client_lease())
       break; // do it.
 
     if (lock->get_parent()->is_replicated()) {
       send_lock_message(lock, LOCK_AC_LOCK);
       lock->init_gather();
     } 
+    revoke_client_leases(lock);  
     lock->set_state(LOCK_GLOCKS);
     lock->get_parent()->auth_pin();
     return;
@@ -2144,7 +2150,7 @@ void Locker::scatter_tempsync(ScatterLock *lock)
 
   switch (lock->get_state()) {
   case LOCK_SYNC:
-    break;  // do it.
+    assert(0);   // this shouldn't happen
 
   case LOCK_LOCK:
     if (lock->is_wrlocked() ||