]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: merge *_sync() methods
authorSage Weil <sage@newdream.net>
Fri, 16 Jan 2009 04:22:31 +0000 (20:22 -0800)
committerSage Weil <sage@newdream.net>
Fri, 16 Jan 2009 04:22:31 +0000 (20:22 -0800)
src/mds/Locker.cc
src/mds/locks.c

index eb1fc37d1d978e0ad175b91541170cfbf7b0ee38..ea3b3e4701035f8c4a1a5a7b7c6dea2dc0138b96 100644 (file)
@@ -577,7 +577,7 @@ bool Locker::rdlock_start(SimpleLock *lock, MDRequest *mut)
        if (lock->get_parent()->is_replicated())
          scatter_tempsync((ScatterLock*)lock);
        else
-         scatter_sync((ScatterLock*)lock);
+         simple_sync(lock);
       } else if (lock->sm == &sm_filelock)
        simple_lock(lock);
       else
@@ -2106,31 +2106,51 @@ bool Locker::simple_sync(SimpleLock *lock)
   if (lock->get_cap_shift())
     in = (CInode *)lock->get_parent();
 
-  switch (lock->get_state()) {
-  case LOCK_LOCK: lock->set_state(LOCK_LOCK_SYNC); break;
-  case LOCK_EXCL: lock->set_state(LOCK_EXCL_SYNC); break;
-  default: assert(0);
-  }
+  int old_state = lock->get_state();
 
-  int gather = 0;
-  if (lock->is_wrlocked())
-    gather++;
-  if (lock->is_xlocked())
-    gather++;
+  if (old_state != LOCK_TSYN) {
 
-  if (in) {
-    int loner_issued, other_issued;
-    in->get_caps_issued(&loner_issued, &other_issued, lock->get_cap_shift(), lock->get_cap_mask());
-    if ((loner_issued & ~lock->gcaps_allowed(true)) ||
-       (other_issued & ~lock->gcaps_allowed(false))) {
-      issue_caps(in);
-      gather++;
+    switch (lock->get_state()) {
+    case LOCK_MIX: lock->set_state(LOCK_MIX_SYNC); break;
+    case LOCK_LOCK: lock->set_state(LOCK_LOCK_SYNC); break;
+    case LOCK_EXCL: lock->set_state(LOCK_EXCL_SYNC); break;
+    default: assert(0);
     }
-  }
 
-  if (gather) {
-    lock->get_parent()->auth_pin(lock);
-    return false;
+    int gather = 0;
+    if (lock->is_wrlocked())
+      gather++;
+    if (lock->is_xlocked())
+      gather++;
+    
+    if (lock->get_parent()->is_replicated() && 
+       old_state == LOCK_MIX) {
+      send_lock_message(lock, LOCK_AC_SYNC);
+      lock->init_gather();
+      gather++;
+    }
+    
+    if (in) {
+      int loner_issued, other_issued;
+      in->get_caps_issued(&loner_issued, &other_issued, lock->get_cap_shift(), lock->get_cap_mask());
+      if ((loner_issued & ~lock->gcaps_allowed(true)) ||
+         (other_issued & ~lock->gcaps_allowed(false))) {
+       issue_caps(in);
+       gather++;
+      }
+    }
+    
+    if (lock->get_type() == CEPH_LOCK_IFILE &&
+      in->state_test(CInode::STATE_NEEDSRECOVER)) {
+      mds->mdcache->queue_file_recover(in);
+      mds->mdcache->do_file_recover();
+      gather++;
+    }
+    
+    if (gather) {
+      lock->get_parent()->auth_pin(lock);
+      return false;
+    }
   }
 
   if (lock->get_parent()->is_replicated()) {
@@ -2422,7 +2442,7 @@ void Locker::scatter_eval(ScatterLock *lock)
        !lock->is_xlocked() &&
        lock->get_state() != LOCK_SYNC) {
       dout(10) << "scatter_eval no wrlocks|xlocks, not subtree root inode, syncing" << dendl;
-      scatter_sync(lock);
+      simple_sync(lock);
     }
   }
 }
@@ -2546,58 +2566,6 @@ void Locker::scatter_tick()
 }
 
 
-void Locker::scatter_sync(ScatterLock *lock)
-{
-  dout(10) << "scatter_sync " << *lock
-          << " on " << *lock->get_parent() << dendl;
-  assert(lock->get_parent()->is_auth());
-  assert(lock->is_stable());
-
-  switch (lock->get_state()) {
-  case LOCK_SYNC:
-    return;    // already sync.
-
-  case LOCK_TSYN:
-    break;    // just do it.
-
-  case LOCK_LOCK:
-    if (lock->is_wrlocked() || lock->is_xlocked()) {
-      lock->set_state(LOCK_LOCK_SYNC);
-      lock->get_parent()->auth_pin(lock);
-      return;
-    }
-    break; // do it.
-
-  case LOCK_MIX:
-    if (!lock->get_parent()->is_replicated() &&
-       !lock->is_wrlocked())
-      break; // do it now
-
-    lock->set_state(LOCK_MIX_LOCK);
-    lock->get_parent()->auth_pin(lock);
-
-    if (lock->get_parent()->is_replicated()) {
-      lock->init_gather();
-      send_lock_message(lock, LOCK_AC_LOCK);
-    }    
-    return;
-
-  default:
-    assert(0);
-  }
-  
-  // do sync
-  if (lock->get_parent()->is_replicated()) {
-    // encode and bcast
-    bufferlist data;
-    lock->encode_locked_state(data);
-    send_lock_message(lock, LOCK_AC_SYNC, data);
-  }
-
-  lock->set_state(LOCK_SYNC);
-  lock->finish_waiters(ScatterLock::WAIT_RD|ScatterLock::WAIT_STABLE);
-}
-
 
 bool Locker::scatter_scatter_fastpath(ScatterLock *lock)
 {
@@ -3006,7 +2974,7 @@ void Locker::file_eval(FileLock *lock)
            lock->is_wrlocked())
          file_mixed(lock);
        else
-         file_sync(lock);
+         simple_sync(lock);
       }
     }    
   }
@@ -3046,7 +3014,7 @@ void Locker::file_eval(FileLock *lock)
           ) {
     dout(7) << "file_eval stable, bump to sync " << *lock 
            << " on " << *lock->get_parent() << dendl;
-    file_sync(lock);
+    simple_sync(lock);
   }
   
   else if (in->is_any_caps())
@@ -3054,65 +3022,6 @@ void Locker::file_eval(FileLock *lock)
 }
 
 
-// mid
-
-bool Locker::file_sync(FileLock *lock)
-{
-  CInode *in = (CInode*)lock->get_parent();
-  dout(7) << "file_sync " << *lock << " on " << *lock->get_parent() << dendl;  
-
-  assert(in->is_auth());
-  assert(lock->is_stable());
-
-  // gather?
-  switch (lock->get_state()) {
-  case LOCK_MIX: lock->set_state(LOCK_MIX_SYNC); break;
-  case LOCK_EXCL: lock->set_state(LOCK_EXCL_SYNC); break;
-  case LOCK_LOCK: lock->set_state(LOCK_LOCK_SYNC); break;
-  default: assert(0);
-  }
-
-  int gather = 0;
-  int loner_issued, other_issued;
-  in->get_caps_issued(&loner_issued, &other_issued, CEPH_CAP_SFILE);
-  if ((loner_issued & ~lock->gcaps_allowed(true)) ||
-      (other_issued & ~lock->gcaps_allowed(false))) {
-    issue_caps(in);
-    gather++;
-  }
-  if (lock->is_wrlocked())
-    gather++;
-  if (in->is_replicated() && lock->get_state() == LOCK_MIX_SYNC) {
-    send_lock_message(lock, LOCK_AC_SYNC);
-    lock->init_gather();
-    gather++;
-  }
-  if (in->state_test(CInode::STATE_NEEDSRECOVER)) {
-    mds->mdcache->queue_file_recover(in);
-    mds->mdcache->do_file_recover();
-    gather++;
-  }
-  
-  if (gather) {
-    lock->get_parent()->auth_pin(lock);
-    return false;
-  }
-
-  // ok
-  if (in->is_replicated()) {
-    bufferlist softdata;
-    lock->encode_locked_state(softdata);
-    send_lock_message(lock, LOCK_AC_SYNC, softdata);
-  }
-  
-  lock->set_state(LOCK_SYNC);
-  in->loner_cap = -1;
-  issue_caps(in);
-  lock->finish_waiters(FileLock::WAIT_RD|FileLock::WAIT_STABLE);
-  return true;
-}
-
-
 
 void Locker::file_mixed(FileLock *lock)
 {
index 104091cbdcb2eb7e4a29f6625e81ee8d4f2c05eb..51961f4fde2f4418ab42596d470fba3b9faec878 100644 (file)
@@ -51,6 +51,7 @@ struct sm_state_t scatterlock[30] = {
                       // stable     loner  rep state  r     rp   rd   wr   l    x    caps,other
     [LOCK_SYNC]      = { 0,         false, LOCK_SYNC, ANY,  0,   ANY, 0,   ANY, 0,   CEPH_CAP_GRDCACHE,0,CEPH_CAP_GRDCACHE },
     [LOCK_LOCK_SYNC] = { LOCK_SYNC, false, LOCK_LOCK, AUTH, 0,   0,   0,   0,   0,   0,0,0 },
+    [LOCK_MIX_SYNC]  = { LOCK_SYNC, false, LOCK_LOCK, 0,    0,   0,   0,   0,   0,   0,0,0 },
     
     [LOCK_LOCK]      = { 0,         false, LOCK_LOCK, AUTH, 0,   FW,  AUTH,0,   ANY, 0,0,0 },
     [LOCK_SYNC_LOCK] = { LOCK_LOCK, false, LOCK_LOCK, AUTH, 0,   0,   0,   0,   0,   0,0,0 },