From 3445480eeb0eec2f01aafd80d3218541998bff44 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 31 Jan 2008 11:34:51 -0800 Subject: [PATCH] mds: only journal size_max extended inodes once on open --- src/mds/Locker.cc | 28 ++++++++++++++++------------ src/mds/Server.cc | 2 +- src/mds/events/EOpen.h | 5 ++++- src/mds/journal.cc | 2 +- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 7fb7f6bc4e65f..365e7b72519a6 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -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; } diff --git a/src/mds/Server.cc b/src/mds/Server.cc index ab9fe550daec0..5f080c937ac12 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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); } diff --git a/src/mds/events/EOpen.h b/src/mds/events/EOpen.h index 1cd94fcc75621..ffd1848537494 100644 --- a/src/mds/events/EOpen.h +++ b/src/mds/events/EOpen.h @@ -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); diff --git a/src/mds/journal.cc b/src/mds/journal.cc index c2bf14cec408f..987821c18e8fd 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -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) { -- 2.39.5