]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: make filelock a scatterlock child; move wrlock into simplelock
authorSage Weil <sage@newdream.net>
Thu, 18 Dec 2008 18:12:43 +0000 (10:12 -0800)
committerSage Weil <sage@newdream.net>
Tue, 23 Dec 2008 19:45:21 +0000 (11:45 -0800)
src/mds/FileLock.h
src/mds/Locker.cc
src/mds/Locker.h
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/ScatterLock.h
src/mds/Server.cc
src/mds/SimpleLock.h

index 91f61bb2a9c80d3177e53a5924b9e7c3b8a05b95..9238967bc254afce3ac1c19b325290ec3369da8f 100644 (file)
@@ -22,6 +22,7 @@ using namespace std;
 #include "include/buffer.h"
 
 #include "SimpleLock.h"
+#include "ScatterLock.h"
 
 // states and such.
 //  C = cache reads, R = read, W = write, A = append, B = buffer writes, L = lazyio
@@ -36,7 +37,7 @@ using namespace std;
 #define LOCK_SYNC_        1  // AR   R . / C R . . . L   R . / C R . . . L   stat()
 #define LOCK_LONER_SYNC  -12 // A    . . / C r . . . L *                     loner -> sync
 #define LOCK_MIXED_SYNC  -13 // A    . w / . R . . . L   . w / . R . . . L
-#define LOCK_LOCK_SYNC   -14 // A    . w / C . . . b L
+#define LOCK_LOCK_SYNC_  -14 // A    . w / C . . . b L
 
 #define LOCK_LOCK_        2  // AR   R W / C . . . B .   . . / C . . . . .   truncate()
 #define LOCK_SYNC_LOCK_  -3  // AR   R . / C . . . . .   r . / C . . . . .
@@ -95,17 +96,13 @@ any + statlite(mtime)
 
  */
 
-// -- lock... hard or file
 
 class Mutation;
 
-class FileLock : public SimpleLock {
-  int num_wrlock;
-
+class FileLock : public ScatterLock {
  public:
   FileLock(MDSCacheObject *o, int t, int wo) : 
-    SimpleLock(o, t, wo),
-    num_wrlock(0) { }
+    ScatterLock(o, t, wo) {}
   
   int get_replica_state() const {
     switch (state) {
@@ -122,6 +119,7 @@ class FileLock : public SimpleLock {
     case LOCK_SYNC_MIXED:
       return LOCK_MIXED;
     case LOCK_SYNC:
+    case LOCK_LOCK_SYNC:
       return LOCK_SYNC;
 
       // after gather auth will bc LOCK_AC_MIXED or whatever
@@ -141,8 +139,9 @@ class FileLock : public SimpleLock {
     state = get_replica_state();
   }
 
+
   // read/write access
-  bool can_rdlock(Mutation *mdr) {
+  bool can_rdlock() {
     if (!parent->is_auth()) {
       if (state == LOCK_LOCK && !xlock_by)
        return true;
@@ -177,17 +176,6 @@ class FileLock : public SimpleLock {
     else
       return (state == LOCK_MIXED);    
   }
-  void get_wrlock(bool force) {
-    assert(force || can_wrlock());
-    if (num_wrlock == 0) parent->get(MDSCacheObject::PIN_LOCK);
-    ++num_wrlock;
-  }
-  void put_wrlock() {
-    --num_wrlock;
-    if (num_wrlock == 0) parent->put(MDSCacheObject::PIN_LOCK);
-  }
-  bool is_wrlocked() { return num_wrlock > 0; }
-  int get_num_wrlocks() { return num_wrlock; }
 
 
   // client caps allowed
index 76959ca415e63705e1b85eb2c0634071326db206..f3ed76189f19afc906829c26d2bb7ced13aec4e5 100644 (file)
@@ -1991,7 +1991,7 @@ bool Locker::scatter_rdlock_start(ScatterLock *lock, MDRequest *mut)
     scatter_sync(lock);
 
   // can rdlock?
-  if (lock->can_rdlock(mut)) {
+  if (lock->can_rdlock()) {
     lock->get_rdlock();
     mut->rdlocks.insert(lock);
     mut->locks.insert(lock);
@@ -2277,7 +2277,7 @@ void Locker::scatter_eval_gather(ScatterLock *lock)
     }
 
     // gSyncL -> sync?
-    else if (lock->get_state() == LOCK_LONER_SYNC &&
+    else if (lock->get_state() == LOCK_LOCK_SYNC &&
             !lock->is_wrlocked()) {
       dout(7) << "scatter_eval finished sync un-wrlock on " << *lock
              << " on " << *lock->get_parent() << dendl;
@@ -2344,7 +2344,7 @@ void Locker::scatter_writebehind(ScatterLock *lock)
   if (in->is_base()) {
     dout(10) << "scatter_writebehind just clearing updated flag for base inode " << *in << dendl;
     lock->clear_updated();
-    scatter_eval_gather(lock);
+    eval_gather(lock);
     return;
   }
 
@@ -2536,7 +2536,7 @@ void Locker::scatter_sync(ScatterLock *lock)
 
   case LOCK_LOCK:
     if (lock->is_wrlocked() || lock->is_xlocked()) {
-      lock->set_state(LOCK_LONER_SYNC);
+      lock->set_state(LOCK_LOCK_SYNC);
       lock->get_parent()->auth_pin(lock);
       return;
     }
@@ -2955,7 +2955,7 @@ bool Locker::file_rdlock_start(FileLock *lock, MDRequest *mut)
   dout(7) << "file_rdlock_start " << *lock << " on " << *lock->get_parent() << dendl;
 
   // can read?  grab ref.
-  if (lock->can_rdlock(mut)) {
+  if (lock->can_rdlock()) {
     lock->get_rdlock();
     mut->rdlocks.insert(lock);
     mut->locks.insert(lock);
@@ -2975,7 +2975,7 @@ bool Locker::file_rdlock_start(FileLock *lock, MDRequest *mut)
       if (lock->is_stable()) {
         file_lock(lock);     // lock, bc easiest to back off ... FIXME
        
-        if (lock->can_rdlock(mut)) {
+        if (lock->can_rdlock()) {
           lock->get_rdlock();
          mut->rdlocks.insert(lock);
          mut->locks.insert(lock);
@@ -3230,8 +3230,13 @@ void Locker::file_eval_gather(FileLock *lock)
     
     switch (lock->get_state()) {
       // to lock
-    case LOCK_SYNC_LOCK:
     case LOCK_MIXED_LOCK:
+      if (lock->is_updated()) {
+       scatter_writebehind(lock);
+       return;
+      }
+
+    case LOCK_SYNC_LOCK:
     case LOCK_LONER_LOCK:
       lock->set_state(LOCK_LOCK);
       in->loner_cap = -1;
@@ -3268,8 +3273,13 @@ void Locker::file_eval_gather(FileLock *lock)
       break;
 
       // to loner
-    case LOCK_SYNC_LONER:
     case LOCK_MIXED_LONER:
+      if (lock->is_updated()) {
+       scatter_writebehind(lock);
+       return;
+      }
+
+    case LOCK_SYNC_LONER:
     case LOCK_LOCK_LONER:
       lock->set_state(LOCK_LONER);
       lock->finish_waiters(SimpleLock::WAIT_STABLE);
@@ -3278,6 +3288,11 @@ void Locker::file_eval_gather(FileLock *lock)
       
       // to sync
     case LOCK_MIXED_SYNC:
+      if (lock->is_updated()) {
+       scatter_writebehind(lock);
+       return;
+      }
+
     case LOCK_LONER_SYNC:
     case LOCK_LOCK_SYNC:
       lock->set_state(LOCK_SYNC);
@@ -3526,6 +3541,10 @@ void Locker::file_lock(FileLock *lock)
     mds->mdcache->do_file_recover();
     gather++;
   }
+  if (lock->is_updated()) {
+    scatter_writebehind(lock);
+    gather++;
+  }
 
   if (gather)
     lock->get_parent()->auth_pin(lock);
index d706db2557ea305d5f025461c80a0d035eea1ca3..59798828402a842588d23d895a1250e35d1b6f0c 100644 (file)
@@ -190,7 +190,9 @@ protected:
   bool file_xlock_start(FileLock *lock, MDRequest *mut);
   void file_xlock_finish(FileLock *lock, Mutation *mut);
 
-
+  xlist<FileLock*> updated_filelocks;
+public:
+  void mark_updated_Filelock(FileLock *lock);
 
   // -- file i/o --
  public:
index 7fd1f3b0328cc0f4350faa80f5b81b9648fa3c86..1e9c7700cb5e8c315b87b8d65001356a41e58638 100644 (file)
@@ -1500,7 +1500,7 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob,
       dout(10) << "predirty_journal_parents stop.  marking nestlock on " << *pin << dendl;
       mds->locker->mark_updated_scatterlock(&pin->nestlock);
       mut->ls->dirty_dirfrag_nest.push_back(&pin->xlist_dirty_dirfrag_nest);
-      mut->add_updated_scatterlock(&pin->nestlock);
+      mut->add_updated_lock(&pin->nestlock);
       break;
     }
     mds->locker->local_wrlock_grab(&pin->versionlock, mut);
@@ -7861,17 +7861,17 @@ void MDCache::fragment_stored(MDRequest *mdr)
   // dft lock
   mds->locker->mark_updated_scatterlock(&diri->dirfragtreelock);
   mdr->ls->dirty_dirfrag_dirfragtree.push_back(&diri->xlist_dirty_dirfrag_dirfragtree);
-  mdr->add_updated_scatterlock(&diri->dirfragtreelock);
+  mdr->add_updated_lock(&diri->dirfragtreelock);
 
   // dirlock
   mds->locker->mark_updated_scatterlock(&diri->dirlock);
   mdr->ls->dirty_dirfrag_dir.push_back(&diri->xlist_dirty_dirfrag_dir);
-  mdr->add_updated_scatterlock(&diri->dirlock);
+  mdr->add_updated_lock(&diri->dirlock);
 
   // dirlock
   mds->locker->mark_updated_scatterlock(&diri->nestlock);
   mdr->ls->dirty_dirfrag_nest.push_back(&diri->xlist_dirty_dirfrag_nest);
-  mdr->add_updated_scatterlock(&diri->nestlock);
+  mdr->add_updated_lock(&diri->nestlock);
 
   // journal new dirfrag fragstats for each new fragment.
   for (list<CDir*>::iterator p = resultfrags.begin();
index 7363ac06c9a4e3e77543d959ec5d4e889e175979..8fa6c6b3c04ff4cf964d3935cc4cb6e0b2012ed0 100644 (file)
@@ -101,7 +101,7 @@ struct Mutation {
   // for applying projected inode changes
   list<CInode*> projected_inodes;
   list<CDir*> projected_fnodes;
-  list<ScatterLock*> updated_scatterlocks;
+  list<ScatterLock*> updated_locks;
 
   list<CInode*> dirty_cow_inodes;
   list<CDentry*> dirty_cow_dentries;
@@ -191,8 +191,8 @@ struct Mutation {
     }
   }
   
-  void add_updated_scatterlock(ScatterLock *lock) {
-    updated_scatterlocks.push_back(lock);
+  void add_updated_lock(ScatterLock *lock) {
+    updated_locks.push_back(lock);
   }
 
   void add_cow_inode(CInode *in) {
@@ -217,8 +217,8 @@ struct Mutation {
         p++) 
       (*p)->_mark_dirty(ls);
 
-    for (list<ScatterLock*>::iterator p = updated_scatterlocks.begin();
-        p != updated_scatterlocks.end();
+    for (list<ScatterLock*>::iterator p = updated_locks.begin();
+        p != updated_locks.end();
         p++)
       (*p)->set_updated();
   }
index db5fbce371221fa528dff3c760d286e563b67fe4..9f8197ea66f8324b94c8ce47f7a05372bffa95e4 100644 (file)
@@ -27,7 +27,7 @@
 #define LOCK_SYNC_LOCK__       -20  // r .  r .  waiting for replicas+rdlocks (auth), or rdlocks to release (replica)
 #define LOCK_SYNC_SCATTER      -28  // r .  r .  
 
-#define LOCK_LOCK_SYNC__            // . w       LOCK on replica.
+#define LOCK_LOCK_SYNC         -29  // . w       LOCK on replica.
 #define LOCK_LOCK__                 // . W  . .
 #define LOCK_LOCK_TEMPSYNC     -21  // . w       LOCK on replica.
 
@@ -46,7 +46,7 @@ inline const char *get_scatterlock_state_name(int s) {
   case LOCK_SYNC_LOCK: return "sync->lock";
   case LOCK_SYNC_SCATTER: return "sync->scatter";
     
-  case LOCK_LONER_SYNC: return "loner->sync";
+  case LOCK_LOCK_SYNC: return "lock->sync";
   case LOCK_LOCK: return "lock";
   case LOCK_LOCK_TEMPSYNC: return "lock->tempsync";
     
@@ -63,7 +63,6 @@ inline const char *get_scatterlock_state_name(int s) {
 }
 
 class ScatterLock : public SimpleLock {
-  int num_wrlock;
   bool updated;
   utime_t last_scatter;
 
@@ -73,7 +72,6 @@ public:
 
   ScatterLock(MDSCacheObject *o, int t, int wo) : 
     SimpleLock(o, t, wo),
-    num_wrlock(0),
     updated(false),
     xlistitem_updated(this) {}
   ~ScatterLock() {
@@ -87,7 +85,7 @@ public:
       
     case LOCK_SYNC_SCATTER:  // hrm.
     case LOCK_SYNC_LOCK:
-    case LOCK_LONER_SYNC:
+    case LOCK_LOCK_SYNC:
     case LOCK_LOCK:
     case LOCK_LOCK_TEMPSYNC:
     case LOCK_SCATTER_LOCK:
@@ -134,7 +132,7 @@ public:
   }
 
   // rdlock
-  bool can_rdlock(MDRequest *mdr) {
+  bool can_rdlock() {
     return state == LOCK_SYNC || state == LOCK_TEMPSYNC;
   }
   bool can_rdlock_soon() {
@@ -156,17 +154,6 @@ public:
       state == LOCK_SCATTER ||
       (parent->is_auth() && state == LOCK_LOCK);
   }
-  void get_wrlock(bool force=false) {
-    assert(can_wrlock() || force);
-    if (num_wrlock == 0) parent->get(MDSCacheObject::PIN_LOCK);
-    ++num_wrlock;
-  }
-  void put_wrlock() {
-    --num_wrlock;
-    if (num_wrlock == 0) parent->put(MDSCacheObject::PIN_LOCK);
-  }
-  bool is_wrlocked() { return num_wrlock > 0; }
-  int get_num_wrlocks() { return num_wrlock; }
 
   void print(ostream& out) {
     out << "(";
index 469f978001f700a16a3447df747c4ad828db4dc6..5edad00df59880733f9dcaf2286b820a3c920a51 100644 (file)
@@ -2770,8 +2770,8 @@ void Server::do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr)
     pf->fragstat.mtime = rollback.old_dir_mtime;
     if (pf->rstat.rctime == pi->ctime)
       pf->rstat.rctime = rollback.old_dir_rctime;
-    mut->add_updated_scatterlock(&parent->get_inode()->dirlock);
-    mut->add_updated_scatterlock(&parent->get_inode()->nestlock);
+    mut->add_updated_lock(&parent->get_inode()->dirlock);
+    mut->add_updated_lock(&parent->get_inode()->nestlock);
   }
 
   // inode
@@ -4253,8 +4253,8 @@ void _rollback_repair_dir(Mutation *mut, CDir *dir, rename_rollback::drec &r, ut
     pf->fragstat.mtime = r.dirfrag_old_mtime;
     if (pf->rstat.rctime == ctime)
       pf->rstat.rctime = r.dirfrag_old_rctime;
-    mut->add_updated_scatterlock(&dir->get_inode()->dirlock);
-    mut->add_updated_scatterlock(&dir->get_inode()->nestlock);
+    mut->add_updated_lock(&dir->get_inode()->dirlock);
+    mut->add_updated_lock(&dir->get_inode()->nestlock);
   }
 }
 
index 1f91f73901eadf0d77330fe39792a84a2024f73f..d430e7aa6ca8f4b66c19e74ce93a71bdbb06b2f8 100644 (file)
@@ -96,7 +96,7 @@ protected:
   int num_client_lease;
 
   // local state
-  int num_rdlock;
+  int num_rdlock, num_wrlock;
   Mutation *xlock_by;
 
 
@@ -104,7 +104,7 @@ public:
   SimpleLock(MDSCacheObject *o, int t, int wo) :
     parent(o), type(t), wait_offset(wo),
     state(LOCK_SYNC), num_client_lease(0),
-    num_rdlock(0), xlock_by(0) { }
+    num_rdlock(0), num_wrlock(0), xlock_by(0) { }
   virtual ~SimpleLock() {}
 
   // parent
@@ -189,7 +189,7 @@ public:
     gather_set.erase(i);
   }
 
-  // ref counting
+  // rdlock
   bool is_rdlocked() { return num_rdlock > 0; }
   int get_rdlock() { 
     if (!num_rdlock) parent->get(MDSCacheObject::PIN_LOCK);
@@ -203,6 +203,21 @@ public:
   }
   int get_num_rdlocks() { return num_rdlock; }
 
+  // wrlock
+  virtual bool can_wrlock() { return false; }
+  void get_wrlock(bool force=false) {
+    assert(can_wrlock() || force);
+    if (num_wrlock == 0) parent->get(MDSCacheObject::PIN_LOCK);
+    ++num_wrlock;
+  }
+  void put_wrlock() {
+    --num_wrlock;
+    if (num_wrlock == 0) parent->put(MDSCacheObject::PIN_LOCK);
+  }
+  bool is_wrlocked() { return num_wrlock > 0; }
+  int get_num_wrlocks() { return num_wrlock; }
+
+  // xlock
   void get_xlock(Mutation *who) { 
     assert(xlock_by == 0);
     parent->get(MDSCacheObject::PIN_LOCK);
@@ -262,7 +277,6 @@ public:
   }
 
 
-  
   // simplelock specifics
   virtual int get_replica_state() const {
     switch (state) {