]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: only journal size_max extended inodes once on open
authorSage Weil <sage@newdream.net>
Thu, 31 Jan 2008 19:34:51 +0000 (11:34 -0800)
committerSage Weil <sage@newdream.net>
Thu, 31 Jan 2008 19:34:51 +0000 (11:34 -0800)
src/mds/Locker.cc
src/mds/Server.cc
src/mds/events/EOpen.h
src/mds/journal.cc

index 7fb7f6bc4e65f6d3d901f7d77665ab4baffcf822..365e7b72519a6c6e61f856ce7f610a4f852af954 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "events/EString.h"
 #include "events/EUpdate.h"
+#include "events/EOpen.h"
 
 #include "msg/Messenger.h"
 
@@ -451,7 +452,9 @@ struct C_Locker_FileUpdate_finish : public Context {
   LogSegment *ls;
   bool share;
   C_Locker_FileUpdate_finish(Locker *l, CInode *i, LogSegment *s, bool e=false) : 
-    locker(l), in(i), ls(s), share(e) {}
+    locker(l), in(i), ls(s), share(e) {
+    in->get(CInode::PIN_PTRWAITER);
+  }
   void finish(int r) {
     in->pop_and_dirty_projected_inode(ls);
     in->put(CInode::PIN_PTRWAITER);
@@ -517,11 +520,12 @@ Capability* Locker::issue_new_caps(CInode *in,
     inode_t *pi = in->project_inode();
     pi->version = in->pre_dirty();
     pi->max_size = new_max;
-    EUpdate *le = new EUpdate(mds->mdlog, "max_size increase on open");
+    EOpen *le = new EOpen(mds->mdlog);
     le->metablob.add_dir_context(in->get_parent_dir());
     le->metablob.add_primary_dentry(in->parent, true, 0, pi);
     LogSegment *ls = mds->mdlog->get_current_segment();
-    in->get(CInode::PIN_PTRWAITER);
+    le->add_ino(in->ino());
+    ls->open_files.push_back(&in->xlist_open_file);
     mds->mdlog->submit_entry(le, new C_Locker_FileUpdate_finish(this, in, ls, true));
   }
   
@@ -632,7 +636,9 @@ class C_MDL_RequestInodeFileCaps : public Context {
   Locker *locker;
   CInode *in;
 public:
-  C_MDL_RequestInodeFileCaps(Locker *l, CInode *i) : locker(l), in(i) {}
+  C_MDL_RequestInodeFileCaps(Locker *l, CInode *i) : locker(l), in(i) {
+    in->get(CInode::PIN_PTRWAITER);
+  }
   void finish(int r) {
     in->put(CInode::PIN_PTRWAITER);
     if (!in->is_auth())
@@ -678,7 +684,6 @@ void Locker::request_inode_file_caps(CInode *in)
 
     // wait for single auth
     if (in->is_ambiguous_auth()) {
-      in->get(CInode::PIN_PTRWAITER);
       in->add_waiter(MDSCacheObject::WAIT_SINGLEAUTH, 
                     new C_MDL_RequestInodeFileCaps(this, in));
       return;
@@ -802,7 +807,6 @@ void Locker::maybe_journal_inode_update(CInode *in, bool had_or_has_wr,
     le->metablob.add_dir_context(in->get_parent_dir());
     le->metablob.add_primary_dentry(in->parent, true, 0, pi);
     LogSegment *ls = mds->mdlog->get_current_segment();
-    in->get(CInode::PIN_PTRWAITER);
     mds->mdlog->submit_entry(le, new C_Locker_FileUpdate_finish(this, in, ls));
   }
 }
@@ -1556,7 +1560,9 @@ class C_Locker_ScatterEval : public Context {
   Locker *locker;
   ScatterLock *lock;
 public:
-  C_Locker_ScatterEval(Locker *l, ScatterLock *lk) : locker(l), lock(lk) {}
+  C_Locker_ScatterEval(Locker *l, ScatterLock *lk) : locker(l), lock(lk) {
+    lock->get_parent()->get(CInode::PIN_PTRWAITER);
+  }
   void finish(int r) {
     lock->get_parent()->put(CInode::PIN_PTRWAITER);
     locker->try_scatter_eval(lock);
@@ -1571,7 +1577,6 @@ void Locker::try_scatter_eval(ScatterLock *lock)
       lock->get_parent()->is_ambiguous_auth()) {
     dout(7) << "try_scatter_eval not stable and ambiguous auth, waiting on " << *lock->get_parent() << dendl;
     //if (!lock->get_parent()->is_waiter(MDSCacheObject::WAIT_SINGLEAUTH))
-    lock->get_parent()->get(CInode::PIN_PTRWAITER);
     lock->get_parent()->add_waiter(MDSCacheObject::WAIT_SINGLEAUTH, new C_Locker_ScatterEval(this, lock));
     return;
   }
@@ -1584,7 +1589,6 @@ void Locker::try_scatter_eval(ScatterLock *lock)
   if (!lock->get_parent()->can_auth_pin()) {
     dout(7) << "try_scatter_eval can't auth_pin, waiting on " << *lock->get_parent() << dendl;
     //if (!lock->get_parent()->is_waiter(MDSCacheObject::WAIT_SINGLEAUTH))
-    lock->get_parent()->get(CInode::PIN_PTRWAITER);
     lock->get_parent()->add_waiter(MDSCacheObject::WAIT_UNFREEZE, new C_Locker_ScatterEval(this, lock));
     return;
   }
@@ -2373,7 +2377,9 @@ class C_Locker_FileEval : public Context {
   Locker *locker;
   FileLock *lock;
 public:
-  C_Locker_FileEval(Locker *l, FileLock *lk) : locker(l), lock(lk) {}
+  C_Locker_FileEval(Locker *l, FileLock *lk) : locker(l), lock(lk) {
+    lock->get_parent()->get(CInode::PIN_PTRWAITER);    
+  }
   void finish(int r) {
     lock->get_parent()->put(CInode::PIN_PTRWAITER);
     locker->try_file_eval(lock);
@@ -2389,7 +2395,6 @@ void Locker::try_file_eval(FileLock *lock)
       in->is_ambiguous_auth()) {
     dout(7) << "try_file_eval not stable and ambiguous auth, waiting on " << *in << dendl;
     //if (!lock->get_parent()->is_waiter(MDSCacheObject::WAIT_SINGLEAUTH))
-    in->get(CInode::PIN_PTRWAITER);
     in->add_waiter(CInode::WAIT_SINGLEAUTH, new C_Locker_FileEval(this, lock));
     return;
   }
@@ -2402,7 +2407,6 @@ void Locker::try_file_eval(FileLock *lock)
   if (!lock->get_parent()->can_auth_pin()) {
     dout(7) << "try_file_eval can't auth_pin, waiting on " << *in << dendl;
     //if (!lock->get_parent()->is_waiter(MDSCacheObject::WAIT_SINGLEAUTH))
-    in->get(CInode::PIN_PTRWAITER);
     in->add_waiter(CInode::WAIT_UNFREEZE, new C_Locker_FileEval(this, lock));
     return;
   }
index ab9fe550daec0d1ddc6320ab3fd50a5908d6c7f3..5f080c937ac12090b279eeb4c275e75293c22e6a 100644 (file)
@@ -3890,7 +3890,7 @@ void Server::_do_open(MDRequest *mdr, CInode *cur)
   if (cur->xlist_open_file.get_xlist() == 0) {
     LogSegment *ls = mds->mdlog->get_current_segment();
     EOpen *le = new EOpen(mds->mdlog);
-    le->add_inode(cur);
+    le->add_clean_inode(cur);
     ls->open_files.push_back(&cur->xlist_open_file);
     mds->mdlog->submit_entry(le);
   }
index 1cd94fcc75621bc970e2d551d03fc3c950a05eb6..ffd1848537494a39533a56385714e2ddaece0e1a 100644 (file)
@@ -31,7 +31,7 @@ public:
     out << "EOpen " << metablob;
   }
 
-  void add_inode(CInode *in) {
+  void add_clean_inode(CInode *in) {
     if (!in->is_base()) {
       inode_t *pi = in->get_projected_inode();
       metablob.add_dir_context(in->get_parent_dn()->get_dir());
@@ -39,6 +39,9 @@ public:
       inos.push_back(in->ino());
     }
   }
+  void add_ino(inodeno_t ino) {
+    inos.push_back(ino);
+  }
 
   void encode_payload(bufferlist& bl) {
     metablob._encode(bl);
index c2bf14cec408f9cc108b425f706c8613b8462274..987821c18e8fd22afd5bb1608ad6f306c1fea35b 100644 (file)
@@ -135,7 +135,7 @@ C_Gather *LogSegment::try_to_expire(MDS *mds)
       CInode *in = *p;
       dout(20) << "try_to_expire requeueing open file " << *in << dendl;
       if (!le) le = new EOpen(mds->mdlog);
-      le->add_inode(in);
+      le->add_clean_inode(in);
       ls->open_files.push_back(&in->xlist_open_file);
     }
     if (le) {