From: Greg Farnum Date: Wed, 12 Mar 2014 20:03:26 +0000 (-0700) Subject: Locker: use raw MutationImpl* instead of MutationRef in several places X-Git-Tag: v0.80-rc1~84^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=6c3fc3eeea4f9cbae6411957f27fcda36ac00696;p=ceph.git Locker: use raw MutationImpl* instead of MutationRef in several places Sadly, you can't implicitly convert non-const references to shared pointers, so avoid the atomic ops necessary when copying a shared_ptr. Signed-off-by: Greg Farnum --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index b9894662ae054..12a61f3ef847b 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -288,7 +288,7 @@ bool Locker::acquire_locks(MDRequestRef& mdr, if (!object->is_auth()) { if (!mdr->locks.empty()) - mds->locker->drop_locks(mdr); + mds->locker->drop_locks(mdr.get()); if (object->is_ambiguous_auth()) { // wait dout(10) << " ambiguous auth, waiting to authpin " << *object << dendl; @@ -301,7 +301,7 @@ bool Locker::acquire_locks(MDRequestRef& mdr, } if (!object->can_auth_pin()) { // wait - mds->locker->drop_locks(mdr); + mds->locker->drop_locks(mdr.get()); mdr->drop_local_auth_pins(); if (auth_pin_nonblock) { dout(10) << " can't auth_pin (freezing?) " << *object << ", nonblocking" << dendl; @@ -393,7 +393,7 @@ bool Locker::acquire_locks(MDRequestRef& mdr, mdr->remote_wrlocks[have] != (*remote_wrlocks)[have]) { dout(10) << " unlocking remote_wrlock on wrong mds." << mdr->remote_wrlocks[have] << " " << *have << " " << *have->get_parent() << dendl; - remote_wrlock_finish(have, mdr->remote_wrlocks[have], mdr); + remote_wrlock_finish(have, mdr->remote_wrlocks[have], mdr.get()); } } if (need_wrlock || need_remote_wrlock) { @@ -422,7 +422,7 @@ bool Locker::acquire_locks(MDRequestRef& mdr, else if (need_remote_wrlock) // acquire remote_wrlock first dout(10) << " unlocking out-of-order " << *lock << " " << *lock->get_parent() << dendl; bool need_issue = false; - wrlock_finish(lock, mdr, &need_issue); + wrlock_finish(lock, mdr.get(), &need_issue); if (need_issue) issue_set.insert(static_cast(lock->get_parent())); } @@ -434,15 +434,15 @@ bool Locker::acquire_locks(MDRequestRef& mdr, dout(10) << " unlocking out-of-order " << *stray << " " << *stray->get_parent() << dendl; bool need_issue = false; if (mdr->xlocks.count(stray)) { - xlock_finish(stray, mdr, &need_issue); + xlock_finish(stray, mdr.get(), &need_issue); } else if (mdr->rdlocks.count(stray)) { - rdlock_finish(stray, mdr, &need_issue); + rdlock_finish(stray, mdr.get(), &need_issue); } else { // may have acquired both wrlock and remore wrlock if (mdr->wrlocks.count(stray)) - wrlock_finish(stray, mdr, &need_issue); + wrlock_finish(stray, mdr.get(), &need_issue); if (mdr->remote_wrlocks.count(stray)) - remote_wrlock_finish(stray, mdr->remote_wrlocks[stray], mdr); + remote_wrlock_finish(stray, mdr->remote_wrlocks[stray], mdr.get()); } if (need_issue) issue_set.insert(static_cast(stray->get_parent())); @@ -450,7 +450,7 @@ bool Locker::acquire_locks(MDRequestRef& mdr, // lock if (mdr->locking && *p != mdr->locking) { - cancel_locking(mdr, &issue_set); + cancel_locking(mdr.get(), &issue_set); } if (xlocks.count(*p)) { if (!xlock_start(*p, mdr)) @@ -465,7 +465,7 @@ bool Locker::acquire_locks(MDRequestRef& mdr, if (need_remote_wrlock && !(*p)->can_wrlock(mdr->get_client())) { // can't take the wrlock because the scatter lock is gathering. need to // release the remote wrlock, so that the gathering process can finish. - remote_wrlock_finish(*p, mdr->remote_wrlocks[*p], mdr); + remote_wrlock_finish(*p, mdr->remote_wrlocks[*p], mdr.get()); remote_wrlock_start(*p, (*remote_wrlocks)[*p], mdr); goto out; } @@ -487,15 +487,15 @@ bool Locker::acquire_locks(MDRequestRef& mdr, dout(10) << " unlocking extra " << *stray << " " << *stray->get_parent() << dendl; bool need_issue = false; if (mdr->xlocks.count(stray)) { - xlock_finish(stray, mdr, &need_issue); + xlock_finish(stray, mdr.get(), &need_issue); } else if (mdr->rdlocks.count(stray)) { - rdlock_finish(stray, mdr, &need_issue); + rdlock_finish(stray, mdr.get(), &need_issue); } else { // may have acquired both wrlock and remore wrlock if (mdr->wrlocks.count(stray)) - wrlock_finish(stray, mdr, &need_issue); + wrlock_finish(stray, mdr.get(), &need_issue); if (mdr->remote_wrlocks.count(stray)) - remote_wrlock_finish(stray, mdr->remote_wrlocks[stray], mdr); + remote_wrlock_finish(stray, mdr->remote_wrlocks[stray], mdr.get()); } if (need_issue) issue_set.insert(static_cast(stray->get_parent())); @@ -510,7 +510,7 @@ bool Locker::acquire_locks(MDRequestRef& mdr, } -void Locker::set_xlocks_done(MutationRef& mut, bool skip_dentry) +void Locker::set_xlocks_done(MutationImpl *mut, bool skip_dentry) { for (set::iterator p = mut->xlocks.begin(); p != mut->xlocks.end(); @@ -523,7 +523,7 @@ void Locker::set_xlocks_done(MutationRef& mut, bool skip_dentry) } } -void Locker::_drop_rdlocks(MutationRef& mut, set *pneed_issue) +void Locker::_drop_rdlocks(MutationImpl *mut, set *pneed_issue) { while (!mut->rdlocks.empty()) { bool ni = false; @@ -534,7 +534,7 @@ void Locker::_drop_rdlocks(MutationRef& mut, set *pneed_issue) } } -void Locker::_drop_non_rdlocks(MutationRef& mut, set *pneed_issue) +void Locker::_drop_non_rdlocks(MutationImpl *mut, set *pneed_issue) { set slaves; @@ -581,7 +581,7 @@ void Locker::_drop_non_rdlocks(MutationRef& mut, set *pneed_issue) } } -void Locker::cancel_locking(MutationRef& mut, set *pneed_issue) +void Locker::cancel_locking(MutationImpl *mut, set *pneed_issue) { SimpleLock *lock = mut->locking; assert(lock); @@ -602,7 +602,7 @@ void Locker::cancel_locking(MutationRef& mut, set *pneed_issue) mut->finish_locking(lock); } -void Locker::drop_locks(MutationRef& mut, set *pneed_issue) +void Locker::drop_locks(MutationImpl *mut, set *pneed_issue) { // leftover locks set my_need_issue; @@ -619,7 +619,7 @@ void Locker::drop_locks(MutationRef& mut, set *pneed_issue) mut->done_locking = false; } -void Locker::drop_non_rdlocks(MutationRef& mut, set *pneed_issue) +void Locker::drop_non_rdlocks(MutationImpl *mut, set *pneed_issue) { set my_need_issue; if (!pneed_issue) @@ -631,7 +631,7 @@ void Locker::drop_non_rdlocks(MutationRef& mut, set *pneed_issue) issue_caps_set(*pneed_issue); } -void Locker::drop_rdlocks(MutationRef& mut, set *pneed_issue) +void Locker::drop_rdlocks(MutationImpl *mut, set *pneed_issue) { set my_need_issue; if (!pneed_issue) @@ -1218,7 +1218,7 @@ void Locker::nudge_log(SimpleLock *lock) mds->mdlog->flush(); } -void Locker::rdlock_finish(SimpleLock *lock, MutationRef& mut, bool *pneed_issue) +void Locker::rdlock_finish(SimpleLock *lock, MutationImpl *mut, bool *pneed_issue) { // drop ref lock->put_rdlock(); @@ -1351,7 +1351,7 @@ bool Locker::wrlock_start(SimpleLock *lock, MDRequestRef& mut, bool nowait) return false; } -void Locker::wrlock_finish(SimpleLock *lock, MutationRef& mut, bool *pneed_issue) +void Locker::wrlock_finish(SimpleLock *lock, MutationImpl *mut, bool *pneed_issue) { if (lock->get_type() == CEPH_LOCK_IVERSION || lock->get_type() == CEPH_LOCK_DVERSION) @@ -1402,7 +1402,7 @@ void Locker::remote_wrlock_start(SimpleLock *lock, int target, MDRequestRef& mut } void Locker::remote_wrlock_finish(SimpleLock *lock, int target, - MutationRef& mut) + MutationImpl *mut) { // drop ref mut->remote_wrlocks.erase(lock); @@ -1523,7 +1523,7 @@ void Locker::_finish_xlock(SimpleLock *lock, client_t xlocker, bool *pneed_issue eval_gather(lock, true, pneed_issue); } -void Locker::xlock_finish(SimpleLock *lock, MutationRef& mut, bool *pneed_issue) +void Locker::xlock_finish(SimpleLock *lock, MutationImpl *mut, bool *pneed_issue) { if (lock->get_type() == CEPH_LOCK_IVERSION || lock->get_type() == CEPH_LOCK_DVERSION) @@ -1578,7 +1578,7 @@ void Locker::xlock_finish(SimpleLock *lock, MutationRef& mut, bool *pneed_issue) } } -void Locker::xlock_export(SimpleLock *lock, MutationRef& mut) +void Locker::xlock_export(SimpleLock *lock, MutationImpl *mut) { dout(10) << "xlock_export on " << *lock << " " << *lock->get_parent() << dendl; @@ -1645,7 +1645,7 @@ void Locker::file_update_finish(CInode *in, MutationRef& mut, bool share, client mds->send_message_client_counted(ack, client); set need_issue; - drop_locks(mut, &need_issue); + drop_locks(mut.get(), &need_issue); if (!in->is_head() && !in->client_snap_caps.empty()) { dout(10) << " client_snap_caps " << in->client_snap_caps << dendl; @@ -3878,7 +3878,7 @@ void Locker::scatter_writebehind_finish(ScatterLock *lock, MutationRef& mut) } mut->apply(); - drop_locks(mut); + drop_locks(mut.get()); mut->cleanup(); if (lock->is_stable()) @@ -4180,7 +4180,7 @@ bool Locker::local_wrlock_start(LocalLock *lock, MDRequestRef& mut) } } -void Locker::local_wrlock_finish(LocalLock *lock, MutationRef& mut) +void Locker::local_wrlock_finish(LocalLock *lock, MutationImpl *mut) { dout(7) << "local_wrlock_finish on " << *lock << " on " << *lock->get_parent() << dendl; @@ -4211,7 +4211,7 @@ bool Locker::local_xlock_start(LocalLock *lock, MDRequestRef& mut) return true; } -void Locker::local_xlock_finish(LocalLock *lock, MutationRef& mut) +void Locker::local_xlock_finish(LocalLock *lock, MutationImpl *mut) { dout(7) << "local_xlock_finish on " << *lock << " on " << *lock->get_parent() << dendl; diff --git a/src/mds/Locker.h b/src/mds/Locker.h index bcc19c750ec4c..17b3c47002e67 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -75,8 +75,8 @@ protected: void send_lock_message(SimpleLock *lock, int msg, const bufferlist &data); // -- locks -- - void _drop_rdlocks(MutationRef& mut, set *pneed_issue); - void _drop_non_rdlocks(MutationRef& mut, set *pneed_issue); + void _drop_rdlocks(MutationImpl *mut, set *pneed_issue); + void _drop_non_rdlocks(MutationImpl *mut, set *pneed_issue); public: void include_snap_rdlocks(set& rdlocks, CInode *in); void include_snap_rdlocks_wlayout(set& rdlocks, CInode *in, @@ -90,11 +90,11 @@ public: CInode *auth_pin_freeze=NULL, bool auth_pin_nonblock=false); - void cancel_locking(MutationRef& mut, set *pneed_issue); - void drop_locks(MutationRef& mut, set *pneed_issue=0); - void set_xlocks_done(MutationRef& mut, bool skip_dentry=false); - void drop_non_rdlocks(MutationRef& mut, set *pneed_issue=0); - void drop_rdlocks(MutationRef& mut, set *pneed_issue=0); + void cancel_locking(MutationImpl *mut, set *pneed_issue); + void drop_locks(MutationImpl *mut, set *pneed_issue=0); + void set_xlocks_done(MutationImpl *mut, bool skip_dentry=false); + void drop_non_rdlocks(MutationImpl *mut, set *pneed_issue=0); + void drop_rdlocks(MutationImpl *mut, set *pneed_issue=0); void eval_gather(SimpleLock *lock, bool first=false, bool *need_issue=0, list *pfinishers=0); void eval(SimpleLock *lock, bool *need_issue); @@ -128,23 +128,23 @@ public: bool _rdlock_kick(SimpleLock *lock, bool as_anon); bool rdlock_try(SimpleLock *lock, client_t client, Context *c); bool rdlock_start(SimpleLock *lock, MDRequestRef& mut, bool as_anon=false); - void rdlock_finish(SimpleLock *lock, MutationRef& mut, bool *pneed_issue); + void rdlock_finish(SimpleLock *lock, MutationImpl *mut, bool *pneed_issue); bool can_rdlock_set(set& locks); bool rdlock_try_set(set& locks); void rdlock_take_set(set& locks, MutationRef& mut); void wrlock_force(SimpleLock *lock, MutationRef& mut); bool wrlock_start(SimpleLock *lock, MDRequestRef& mut, bool nowait=false); - void wrlock_finish(SimpleLock *lock, MutationRef& mut, bool *pneed_issue); + void wrlock_finish(SimpleLock *lock, MutationImpl *mut, bool *pneed_issue); void remote_wrlock_start(SimpleLock *lock, int target, MDRequestRef& mut); - void remote_wrlock_finish(SimpleLock *lock, int target, MutationRef& mut); + void remote_wrlock_finish(SimpleLock *lock, int target, MutationImpl *mut); bool xlock_start(SimpleLock *lock, MDRequestRef& mut); void _finish_xlock(SimpleLock *lock, client_t xlocker, bool *pneed_issue); - void xlock_finish(SimpleLock *lock, MutationRef& mut, bool *pneed_issue); + void xlock_finish(SimpleLock *lock, MutationImpl *mut, bool *pneed_issue); - void xlock_export(SimpleLock *lock, MutationRef& mut); + void xlock_export(SimpleLock *lock, MutationImpl *mut); void xlock_import(SimpleLock *lock); @@ -233,9 +233,9 @@ public: void local_wrlock_grab(LocalLock *lock, MutationRef& mut); protected: bool local_wrlock_start(LocalLock *lock, MDRequestRef& mut); - void local_wrlock_finish(LocalLock *lock, MutationRef& mut); + void local_wrlock_finish(LocalLock *lock, MutationImpl *mut); bool local_xlock_start(LocalLock *lock, MDRequestRef& mut); - void local_xlock_finish(LocalLock *lock, MutationRef& mut); + void local_xlock_finish(LocalLock *lock, MutationImpl *mut); // file diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 250253ea1e228..b490b6519cd73 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -491,7 +491,7 @@ void MDCache::_create_system_file_finish(MutationRef& mut, CDentry *dn, version_ } mut->apply(); - mds->locker->drop_locks(mut); + mds->locker->drop_locks(mut.get()); mut->cleanup(); fin->complete(0); @@ -890,7 +890,7 @@ void MDCache::subtree_merge_writebehind_finish(CInode *in, MutationRef& mut) in->pop_and_dirty_projected_inode(mut->ls); mut->apply(); - mds->locker->drop_locks(mut); + mds->locker->drop_locks(mut.get()); mut->cleanup(); in->auth_unpin(this); @@ -5921,7 +5921,7 @@ void MDCache::_queued_file_recover_cow(CInode *in, MutationRef& mut) { in->pop_and_dirty_projected_inode(mut->ls); mut->apply(); - mds->locker->drop_locks(mut); + mds->locker->drop_locks(mut.get()); mut->cleanup(); } @@ -6201,7 +6201,7 @@ void MDCache::truncate_inode_logged(CInode *in, MutationRef& mut) { dout(10) << "truncate_inode_logged " << *in << dendl; mut->apply(); - mds->locker->drop_locks(mut); + mds->locker->drop_locks(mut.get()); mut->cleanup(); in->put(CInode::PIN_TRUNCATING); @@ -9021,13 +9021,13 @@ void MDCache::request_drop_foreign_locks(MDRequestRef& mdr) void MDCache::request_drop_non_rdlocks(MDRequestRef& mdr) { request_drop_foreign_locks(mdr); - mds->locker->drop_non_rdlocks(mdr); + mds->locker->drop_non_rdlocks(mdr.get()); } void MDCache::request_drop_locks(MDRequestRef& mdr) { request_drop_foreign_locks(mdr); - mds->locker->drop_locks(mdr); + mds->locker->drop_locks(mdr.get()); } void MDCache::request_cleanup(MDRequestRef& mdr) @@ -9267,7 +9267,7 @@ void MDCache::_anchor_logged(CInode *in, version_t atid, MutationRef& mut) mds->anchorclient->commit(atid, mut->ls); // drop locks and finish - mds->locker->drop_locks(mut); + mds->locker->drop_locks(mut.get()); mut->cleanup(); // trigger waiters @@ -9401,7 +9401,7 @@ void MDCache::_snaprealm_create_finish(MDRequestRef& mdr, MutationRef& mut, CIno // apply in->pop_and_dirty_projected_inode(mut->ls); mut->apply(); - mds->locker->drop_locks(mut); + mds->locker->drop_locks(mut.get()); mut->cleanup(); // tell table we've committed @@ -11707,7 +11707,7 @@ void MDCache::_fragment_stored(MDRequestRef& mdr) mds->mdlog->start_submit_entry(le, new C_MDC_FragmentCommit(this, basedirfrag, info.resultfrags)); - mds->locker->drop_locks(mdr); + mds->locker->drop_locks(mdr.get()); // unfreeze resulting frags for (list::iterator p = info.resultfrags.begin(); diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc index b0cb41849cbba..e873bf950470d 100644 --- a/src/mds/Migrator.cc +++ b/src/mds/Migrator.cc @@ -332,7 +332,7 @@ void Migrator::export_try_cancel(CDir *dir, bool notify_peer) mds->mdcache->request_finish(mdr); } else if (it->second.mut) { MutationRef& mut = it->second.mut; - mds->locker->drop_locks(mut); + mds->locker->drop_locks(mut.get()); mut->cleanup(); } @@ -1803,7 +1803,7 @@ void Migrator::export_finish(CDir *dir) // unpin path MutationRef& mut = it->second.mut; if (mut) { - mds->locker->drop_locks(mut); + mds->locker->drop_locks(mut.get()); mut->cleanup(); } @@ -2473,7 +2473,7 @@ void Migrator::import_reverse_final(CDir *dir) // clean up map::iterator it = import_state.find(dir->dirfrag()); if (it->second.mut) { - mds->locker->drop_locks(it->second.mut); + mds->locker->drop_locks(it->second.mut.get()); it->second.mut->cleanup(); } import_state.erase(it); @@ -2636,7 +2636,7 @@ void Migrator::import_finish(CDir *dir, bool notify, bool last) //audit(); // this fails, bc we munge up the subtree map during handle_import_map (resolve phase) if (mut) { - mds->locker->drop_locks(mut); + mds->locker->drop_locks(mut.get()); mut->cleanup(); } diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 2f45af98e81b3..9b00e4a79176c 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -807,7 +807,7 @@ void Server::journal_and_reply(MDRequestRef& mdr, CInode *in, CDentry *dn, LogEv mdlog->flush(); } } else if (mdr->did_early_reply) - mds->locker->drop_rdlocks(mdr); + mds->locker->drop_rdlocks(mdr.get()); else mdlog->flush(); } @@ -856,7 +856,7 @@ void Server::early_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn) //_rename_finish() does not send dentry link/unlink message to replicas. // so do not set xlocks on dentries "done", the xlocks prevent dentries // that have projected linkages from getting new replica. - mds->locker->set_xlocks_done(mdr, mdr->client_request->get_op() == CEPH_MDS_OP_RENAME); + mds->locker->set_xlocks_done(mdr.get(), mdr->client_request->get_op() == CEPH_MDS_OP_RENAME); char buf[80]; dout(10) << "early_reply " << reply->get_result() @@ -1552,10 +1552,10 @@ void Server::dispatch_slave_request(MDRequestRef& mdr) bool need_issue = false; switch (op) { case MMDSSlaveRequest::OP_UNXLOCK: - mds->locker->xlock_finish(lock, mdr, &need_issue); + mds->locker->xlock_finish(lock, mdr.get(), &need_issue); break; case MMDSSlaveRequest::OP_UNWRLOCK: - mds->locker->wrlock_finish(lock, mdr, &need_issue); + mds->locker->wrlock_finish(lock, mdr.get(), &need_issue); break; } if (need_issue) @@ -1568,7 +1568,7 @@ void Server::dispatch_slave_request(MDRequestRef& mdr) break; case MMDSSlaveRequest::OP_DROPLOCKS: - mds->locker->drop_locks(mdr); + mds->locker->drop_locks(mdr.get()); mdr->slave_request->put(); mdr->slave_request = 0; break; @@ -2139,7 +2139,7 @@ CInode* Server::rdlock_path_pin_ref(MDRequestRef& mdr, int n, * a single MDS request; otherwise we'd be in * rdlock_path_xlock_dentry. */ - mds->locker->drop_locks(mdr, NULL); + mds->locker->drop_locks(mdr.get(), NULL); mdr->drop_local_auth_pins(); return 0; } @@ -2843,7 +2843,7 @@ void Server::handle_client_readdir(MDRequestRef& mdr) if (!dir->is_complete()) { if (dir->is_frozen()) { dout(7) << "dir is frozen " << *dir << dendl; - mds->locker->drop_locks(mdr); + mds->locker->drop_locks(mdr.get()); mdr->drop_local_auth_pins(); dir->add_waiter(CDir::WAIT_UNFREEZE, new C_MDS_RetryRequest(mdcache, mdr)); return; @@ -2948,7 +2948,7 @@ void Server::handle_client_readdir(MDRequestRef& mdr) break; } - mds->locker->drop_locks(mdr); + mds->locker->drop_locks(mdr.get()); mdr->drop_local_auth_pins(); mdcache->open_remote_dentry(dn, dnp, new C_MDS_RetryRequest(mdcache, mdr)); return; @@ -3136,7 +3136,7 @@ void Server::handle_client_file_setlock(MDRequestRef& mdr) dout(10) << " added to waiting list" << dendl; assert(lock_state->is_waiting(set_lock)); mdr->more()->flock_was_waiting = true; - mds->locker->drop_locks(mdr); + mds->locker->drop_locks(mdr.get()); mdr->drop_local_auth_pins(); cur->add_waiter(CInode::WAIT_FLOCK, new C_MDS_RetryRequest(mdcache, mdr)); } @@ -6803,7 +6803,7 @@ void Server::_commit_slave_rename(MDRequestRef& mdr, int r, // we only care about xlocks on the exported inode if (lock->get_parent() == in && !lock->is_locallock()) - mds->locker->xlock_export(lock, mdr); + mds->locker->xlock_export(lock, mdr.get()); } map peer_imported;