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.
- 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
// 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;
}
// 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;
}
}
+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
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;
}
}
// 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;
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);
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);
// 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();
}
}
}
-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;
// drop locks
- request_drop_locks(mdr);
+ mds->locker->drop_locks(mdr);
// drop (local) auth pins
mdr->drop_local_auth_pins();
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);
// 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) {
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;