]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
* some prelim work for locker authpin changes
authorsageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Fri, 29 Jun 2007 15:31:00 +0000 (15:31 +0000)
committersageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Fri, 29 Jun 2007 15:31:00 +0000 (15:31 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1458 29311d96-e01e-0410-9327-a35deaab8ce9

branches/sage/cephmds2/TODO
branches/sage/cephmds2/mds/Locker.cc
branches/sage/cephmds2/mds/Locker.h
branches/sage/cephmds2/mds/MDCache.cc
branches/sage/cephmds2/mds/MDCache.h
branches/sage/cephmds2/mds/Server.cc

index 793aed50a515ba7908fa4b35976549e77c742f85..e972c9bf81b8d6522cf72db5b4ab1e2f00c09ac6 100644 (file)
@@ -47,11 +47,8 @@ sage doc
 
 sage mds
 
-- fix utime to use acquire_locks.. don't call into locker manually!
-
-- projected inode content skipping.
-  - roll projected_version in to a *projected_inode.  clean up the *pi code in Server.cc.
-  - list<inode_t> projected_inode and list<fragtree_t> projected_dirfragtree, &push_projected_*(), etc.
+- unlink needs to journal on witnesses (probably), since unlinked inodes may be in those journals
+- rename_prep should create a subtree (auth,auth) so that cache expires are routed properly
 
 - make locks auth_pin for unstable states.
 
@@ -112,6 +109,8 @@ sage mds
 
 - roll EAlloc into EMetaBlob (and maybe Purge)
 
+- dir complete flag on migration.. does it go into the EMetaBlob too?  can it be safely dropped?
+
 - journal+recovery
   - file capabilities i/o
 - dirfrag split/merge
index b1370429d844b9407e5d20890b235a93cb8ae7c4..ffe721c502e3738ccb4f77777a6ef52029ee4537 100644 (file)
@@ -163,7 +163,7 @@ bool Locker::acquire_locks(MDRequest *mdr,
        // wait
        dout(10) << " ambiguous auth, waiting to authpin " << *object << endl;
        object->add_waiter(MDSCacheObject::WAIT_SINGLEAUTH, new C_MDS_RetryRequest(mdcache, mdr));
-       mdcache->request_drop_locks(mdr);
+       mds->locker->drop_locks(mdr);
        mdr->drop_local_auth_pins();
        return false;
       }
@@ -174,7 +174,7 @@ bool Locker::acquire_locks(MDRequest *mdr,
       // wait
       dout(10) << " can't auth_pin (freezing?), waiting to authpin " << *object << endl;
       object->add_waiter(MDSCacheObject::WAIT_AUTHPINNABLE, new C_MDS_RetryRequest(mdcache, mdr));
-      mdcache->request_drop_locks(mdr);
+      mds->locker->drop_locks(mdr);
       mdr->drop_local_auth_pins();
       return false;
     }
@@ -297,6 +297,17 @@ bool Locker::acquire_locks(MDRequest *mdr,
 }
 
 
+void Locker::drop_locks(MDRequest *mdr)
+{
+  // leftover locks
+  while (!mdr->xlocks.empty()) 
+    xlock_finish(*mdr->xlocks.begin(), mdr);
+  while (!mdr->rdlocks.empty()) 
+    rdlock_finish(*mdr->rdlocks.begin(), mdr);
+  while (!mdr->wrlocks.empty()) 
+    wrlock_finish(*mdr->wrlocks.begin(), mdr);
+}
+
 
 // generics
 
@@ -573,7 +584,7 @@ void Locker::handle_inode_file_caps(MInodeFileCaps *m)
   else
     in->mds_caps_wanted.erase(m->get_from());
 
-  file_eval(&in->filelock);
+  file_eval(&in->filelock);  // ** may or may not be auth_pinned **
   delete m;
 }
 
@@ -663,7 +674,7 @@ void Locker::handle_client_file_caps(MClientFileCaps *m)
   }  
 
   // reevaluate, waiters
-  file_eval(&in->filelock);
+  file_eval(&in->filelock);  // ** may or may not be auth_pinned **
   in->finish_waiting(CInode::WAIT_CAPS, 0);
 
   delete m;
index 109b7ba8f5c2080b7df9167d3b9b4f03284be4ee..a2a26592aea3b8c91220ff36bc11e737c70e3992 100644 (file)
@@ -61,40 +61,52 @@ private:
   void dispatch(Message *m);
   void handle_lock(MLock *m);
 
+protected:
   void send_lock_message(SimpleLock *lock, int msg);
   void send_lock_message(SimpleLock *lock, int msg, const bufferlist &data);
 
   // -- locks --
+public:
   bool acquire_locks(MDRequest *mdr,
                     set<SimpleLock*> &rdlocks,
                     set<SimpleLock*> &wrlocks,
                     set<SimpleLock*> &xlocks);
 
+  void drop_locks(MDRequest *mdr);
+
+protected:
   bool rdlock_start(SimpleLock *lock, MDRequest *mdr);
   void rdlock_finish(SimpleLock *lock, MDRequest *mdr);
   bool xlock_start(SimpleLock *lock, MDRequest *mdr);
-  void xlock_finish(SimpleLock *lock, MDRequest *mdr);
+public:
+  void xlock_finish(SimpleLock *lock, MDRequest *mdr);  // public for Server's slave UNXLOCK
+protected:
   bool wrlock_start(SimpleLock *lock, MDRequest *mdr);
   void wrlock_finish(SimpleLock *lock, MDRequest *mdr);
 
   // simple
-  void handle_simple_lock(SimpleLock *lock, MLock *m);
+public:
   void simple_eval(SimpleLock *lock);
+  bool simple_rdlock_try(SimpleLock *lock, Context *con);
+protected:
+  void handle_simple_lock(SimpleLock *lock, MLock *m);
   void simple_sync(SimpleLock *lock);
   void simple_lock(SimpleLock *lock);
-  bool simple_rdlock_try(SimpleLock *lock, Context *con);
   bool simple_rdlock_start(SimpleLock *lock, MDRequest *mdr);
   void simple_rdlock_finish(SimpleLock *lock, MDRequest *mdr);
   bool simple_xlock_start(SimpleLock *lock, MDRequest *mdr);
   void simple_xlock_finish(SimpleLock *lock, MDRequest *mdr);
 
+public:
   bool dentry_can_rdlock_trace(vector<CDentry*>& trace);
   void dentry_anon_rdlock_trace_start(vector<CDentry*>& trace);
   void dentry_anon_rdlock_trace_finish(vector<CDentry*>& trace);
 
   // scatter
-  void handle_scatter_lock(ScatterLock *lock, MLock *m);
+public:
   void scatter_eval(ScatterLock *lock);
+protected:
+  void handle_scatter_lock(ScatterLock *lock, MLock *m);
   void scatter_sync(ScatterLock *lock);
   void scatter_lock(ScatterLock *lock);
   void scatter_scatter(ScatterLock *lock);
@@ -105,8 +117,10 @@ private:
   void scatter_wrlock_finish(ScatterLock *lock, MDRequest *mdr);
 
   // file
-  void handle_file_lock(FileLock *lock, MLock *m);
+public:
   void file_eval(FileLock *lock);
+protected:
+  void handle_file_lock(FileLock *lock, MLock *m);
   bool file_sync(FileLock *lock);
   void file_lock(FileLock *lock);
   void file_mixed(FileLock *lock);
index ce412fb734c43054380325db797a51a4027c346e..28e46609dc8d04e1bdeb99420ca7e44f6a222e12 100644 (file)
@@ -403,7 +403,7 @@ void MDCache::adjust_subtree_auth(CDir *dir, pair<int,int> auth)
   // evaluate subtree inode dirlock?
   //  (we should scatter the dirlock on subtree bounds)
   if (dir->inode->is_auth())
-    mds->locker->scatter_eval(&dir->inode->dirlock);
+    mds->locker->scatter_eval(&dir->inode->dirlock);  // ** may or may not be auth_pinned **
 
   show_subtrees();
 }
@@ -3745,17 +3745,6 @@ void MDCache::request_forget_foreign_locks(MDRequest *mdr)
   }
 }
 
-void MDCache::request_drop_locks(MDRequest *mdr)
-{
-  // leftover locks
-  while (!mdr->xlocks.empty()) 
-    mds->locker->xlock_finish(*mdr->xlocks.begin(), mdr);
-  while (!mdr->rdlocks.empty()) 
-    mds->locker->rdlock_finish(*mdr->rdlocks.begin(), mdr);
-  while (!mdr->wrlocks.empty()) 
-    mds->locker->wrlock_finish(*mdr->wrlocks.begin(), mdr);
-}
-
 void MDCache::request_cleanup(MDRequest *mdr)
 {
   dout(15) << "request_cleanup " << *mdr << endl;
@@ -3778,7 +3767,7 @@ void MDCache::request_cleanup(MDRequest *mdr)
 
 
   // drop locks
-  request_drop_locks(mdr);
+  mds->locker->drop_locks(mdr);
 
   // drop (local) auth pins
   mdr->drop_local_auth_pins();
index 7f7ccf51b86b88a19a66fc210208b7f5cc423555..1ab0ffa946f0b5fb431a255b0c9d573d3a1e2fa4 100644 (file)
@@ -283,7 +283,6 @@ public:
   void request_forward(MDRequest *mdr, int mds, int port=0);
   void dispatch_request(MDRequest *mdr);
   void request_forget_foreign_locks(MDRequest *mdr);
-  void request_drop_locks(MDRequest *mdr);
   void request_cleanup(MDRequest *r);
 
 
index 7d35db01240d83d3b388a4e1da24e1df5d1070f0..ae35c48abc9db84a5c15fd181d8c0da078db9bfc 100644 (file)
@@ -3341,8 +3341,12 @@ void Server::handle_client_truncate(MDRequest *mdr)
   // check permissions?  
 
   // xlock inode
-  if (!mds->locker->xlock_start(&cur->filelock, mdr))
-    return;  // fw or (wait for) lock
+  set<SimpleLock*> rdlocks = mdr->rdlocks;
+  set<SimpleLock*> wrlocks = mdr->wrlocks;
+  set<SimpleLock*> xlocks = mdr->xlocks;
+  xlocks.insert(&cur->filelock);
+  if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks))
+    return;
   
   // already small enough?
   if (cur->inode.size >= req->args.truncate.length) {
@@ -3406,9 +3410,13 @@ void Server::handle_client_open(MDRequest *mdr)
     assert(cur->is_auth());
 
     // xlock file size
-    if (!mds->locker->xlock_start(&cur->filelock, mdr))
+    set<SimpleLock*> rdlocks = mdr->rdlocks;
+    set<SimpleLock*> wrlocks = mdr->wrlocks;
+    set<SimpleLock*> xlocks = mdr->xlocks;
+    xlocks.insert(&cur->filelock);
+    if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks))
       return;
-    
+
     if (cur->inode.size > 0) {
       handle_client_opent(mdr);
       return;