From: Greg Farnum Date: Thu, 13 Mar 2014 03:50:19 +0000 (-0700) Subject: MDCache: use raw MutationImpl* instead of MutationRef in a few places X-Git-Tag: v0.80-rc1~84^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=5f2ccab68ffd848e6da059c4442dd264eff6f911;p=ceph.git MDCache: use raw MutationImpl* instead of MutationRef in a few places 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 12a61f3ef847b..70223a9039ffa 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -2187,7 +2187,7 @@ bool Locker::check_inode_max_size(CInode *in, bool force_wrlock, metablob->add_primary_dentry(parent, in, true); } else { metablob->add_dir_context(in->get_projected_parent_dn()->get_dir()); - mdcache->journal_dirty_inode(mut, metablob, in); + mdcache->journal_dirty_inode(mut.get(), metablob, in); } mds->mdlog->submit_entry(le, new C_Locker_FileUpdate_finish(this, in, mut, true)); wrlock_force(&in->filelock, mut); // wrlock for duration of journal @@ -2748,7 +2748,7 @@ void Locker::_do_snap_update(CInode *in, snapid_t snap, int dirty, snapid_t foll mut->auth_pin(in); mdcache->predirty_journal_parents(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY, 0, follows); - mdcache->journal_dirty_inode(mut, &le->metablob, in, follows); + mdcache->journal_dirty_inode(mut.get(), &le->metablob, in, follows); mds->mdlog->submit_entry(le); mds->mdlog->wait_for_safe(new C_Locker_FileUpdate_finish(this, in, mut, false, @@ -2986,7 +2986,7 @@ bool Locker::_do_cap_update(CInode *in, Capability *cap, mut->auth_pin(in); mdcache->predirty_journal_parents(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY, 0, follows); - mdcache->journal_dirty_inode(mut, &le->metablob, in, follows); + mdcache->journal_dirty_inode(mut.get(), &le->metablob, in, follows); mds->mdlog->submit_entry(le); mds->mdlog->wait_for_safe(new C_Locker_FileUpdate_finish(this, in, mut, change_max, @@ -3849,7 +3849,7 @@ void Locker::scatter_writebehind(ScatterLock *lock) mds->mdlog->start_entry(le); mdcache->predirty_journal_parents(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY, false); - mdcache->journal_dirty_inode(mut, &le->metablob, in); + mdcache->journal_dirty_inode(mut.get(), &le->metablob, in); in->finish_scatter_gather_update_accounted(lock->get_type(), mut, &le->metablob); diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index b490b6519cd73..22b4875d1b227 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -459,7 +459,7 @@ void MDCache::_create_system_file(CDir *dir, const char *name, CInode *in, Conte le->metablob.add_primary_dentry(dn, in, true); } else { predirty_journal_parents(mut, &le->metablob, in, dir, PREDIRTY_DIR, 1); - journal_dirty_inode(mut, &le->metablob, in); + journal_dirty_inode(mut.get(), &le->metablob, in); dn->push_projected_linkage(in->ino(), in->d_type()); le->metablob.add_remote_dentry(dn, true, in->ino(), in->d_type()); le->metablob.add_root(true, in); @@ -873,7 +873,7 @@ void MDCache::try_subtree_merge_at(CDir *dir, bool do_eval) mds->mdlog->start_entry(le); le->metablob.add_dir_context(in->get_parent_dn()->get_dir()); - journal_dirty_inode(mut, &le->metablob, in); + journal_dirty_inode(mut.get(), &le->metablob, in); mds->mdlog->submit_entry(le); mds->mdlog->wait_for_safe(new C_MDC_SubtreeMergeWB(this, in, mut)); @@ -1484,7 +1484,7 @@ CInode *MDCache::cow_inode(CInode *in, snapid_t last) return oldin; } -void MDCache::journal_cow_dentry(MutationRef& mut, EMetaBlob *metablob, +void MDCache::journal_cow_dentry(MutationImpl *mut, EMetaBlob *metablob, CDentry *dn, snapid_t follows, CInode **pcow_inode, CDentry::linkage_t *dnl) { @@ -1574,10 +1574,10 @@ void MDCache::journal_cow_inode(MutationRef& mut, EMetaBlob *metablob, { dout(10) << "journal_cow_inode follows " << follows << " on " << *in << dendl; CDentry *dn = in->get_projected_parent_dn(); - journal_cow_dentry(mut, metablob, dn, follows, pcow_inode); + journal_cow_dentry(mut.get(), metablob, dn, follows, pcow_inode); } -void MDCache::journal_dirty_inode(MutationRef& mut, EMetaBlob *metablob, CInode *in, snapid_t follows) +void MDCache::journal_dirty_inode(MutationImpl *mut, EMetaBlob *metablob, CInode *in, snapid_t follows) { if (in->is_base()) { metablob->add_root(true, in, in->get_projected_inode()); @@ -1848,7 +1848,7 @@ void MDCache::project_rstat_frag_to_inode(nest_info_t& rstat, nest_info_t& accou * accounted_rstat on scatterlock sync may not match our current * rstat. this is normal and expected. */ -void MDCache::predirty_journal_parents(MutationRef& mut, EMetaBlob *blob, +void MDCache::predirty_journal_parents(MutationRef mut, EMetaBlob *blob, CInode *in, CDir *parent, int flags, int linkunlink, snapid_t cfollows) @@ -2132,7 +2132,7 @@ void MDCache::predirty_journal_parents(MutationRef& mut, EMetaBlob *blob, p != lsi.end(); ++p) { CInode *cur = *p; - journal_dirty_inode(mut, blob, cur); + journal_dirty_inode(mut.get(), blob, cur); } } @@ -6189,7 +6189,7 @@ void MDCache::truncate_inode_finish(CInode *in, LogSegment *ls) le->metablob.add_primary_dentry(dn, in, true); le->metablob.add_truncate_finish(in->ino(), ls->offset); - journal_dirty_inode(mut, &le->metablob, in); + journal_dirty_inode(mut.get(), &le->metablob, in); mds->mdlog->submit_entry(le, new C_MDC_TruncateLogged(this, in, mut)); // flush immediately if there are readers/writers waiting @@ -9234,7 +9234,7 @@ void MDCache::_anchor_prepared(CInode *in, version_t atid, bool add) EUpdate *le = new EUpdate(mds->mdlog, add ? "anchor_create":"anchor_destroy"); mds->mdlog->start_entry(le); predirty_journal_parents(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY); - journal_dirty_inode(mut, &le->metablob, in); + journal_dirty_inode(mut.get(), &le->metablob, in); le->metablob.add_table_transaction(TABLE_ANCHOR, atid); mds->mdlog->submit_entry(le, new C_MDC_AnchorLogged(this, in, atid, mut)); mds->mdlog->flush(); @@ -11612,7 +11612,7 @@ void MDCache::dispatch_fragment_dir(MDRequestRef& mdr) // journal dirfragtree inode_t *pi = diri->project_inode(); pi->version = diri->pre_dirty(); - journal_dirty_inode(mdr, &le->metablob, diri); + journal_dirty_inode(mdr.get(), &le->metablob, diri); } else { mds->locker->mark_updated_scatterlock(&diri->dirfragtreelock); mdr->ls->dirty_dirfrag_dirfragtree.push_back(&diri->item_dirty_dirfrag_dirfragtree); diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 67b97a7d1a5d4..13c3d5f72f093 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -266,12 +266,12 @@ public: // journal/snap helpers CInode *pick_inode_snap(CInode *in, snapid_t follows); CInode *cow_inode(CInode *in, snapid_t last); - void journal_cow_dentry(MutationRef& mut, EMetaBlob *metablob, CDentry *dn, + void journal_cow_dentry(MutationImpl *mut, EMetaBlob *metablob, CDentry *dn, snapid_t follows=CEPH_NOSNAP, CInode **pcow_inode=0, CDentry::linkage_t *dnl=0); void journal_cow_inode(MutationRef& mut, EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP, CInode **pcow_inode=0); - void journal_dirty_inode(MutationRef& mut, EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP); + void journal_dirty_inode(MutationImpl *mut, EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP); void project_rstat_inode_to_frag(CInode *cur, CDir *parent, snapid_t first, int linkunlink); void _project_rstat_inode_to_frag(inode_t& inode, snapid_t ofirst, snapid_t last, @@ -279,7 +279,7 @@ public: void project_rstat_frag_to_inode(nest_info_t& rstat, nest_info_t& accounted_rstat, snapid_t ofirst, snapid_t last, CInode *pin, bool cow_head); - void predirty_journal_parents(MutationRef& mut, EMetaBlob *blob, + void predirty_journal_parents(MutationRef mut, EMetaBlob *blob, CInode *in, CDir *parent, int flags, int linkunlink=0, snapid_t follows=CEPH_NOSNAP); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 9b00e4a79176c..11172e186793b 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -3295,7 +3295,7 @@ void Server::handle_client_setattr(MDRequestRef& mdr) // log + wait le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid()); mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); - mdcache->journal_dirty_inode(mdr, &le->metablob, cur); + mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur); journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur, truncating_smaller, changed_ranges)); @@ -3340,7 +3340,7 @@ void Server::do_open_truncate(MDRequestRef& mdr, int cmode) le->metablob.add_client_req(mdr->reqid, mdr->client_request->get_oldest_client_tid()); mdcache->predirty_journal_parents(mdr, &le->metablob, in, 0, PREDIRTY_PRIMARY, false); - mdcache->journal_dirty_inode(mdr, &le->metablob, in); + mdcache->journal_dirty_inode(mdr.get(), &le->metablob, in); // do the open SnapRealm *realm = in->find_snaprealm(); @@ -3439,7 +3439,7 @@ void Server::handle_client_setlayout(MDRequestRef& mdr) mdlog->start_entry(le); le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid()); mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); - mdcache->journal_dirty_inode(mdr, &le->metablob, cur); + mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur); journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur)); } @@ -3515,7 +3515,7 @@ void Server::handle_client_setdirlayout(MDRequestRef& mdr) mdlog->start_entry(le); le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid()); mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); - mdcache->journal_dirty_inode(mdr, &le->metablob, cur); + mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur); journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur)); } @@ -3704,7 +3704,7 @@ void Server::handle_set_vxattr(MDRequestRef& mdr, CInode *cur, mdlog->start_entry(le); le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid()); mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); - mdcache->journal_dirty_inode(mdr, &le->metablob, cur); + mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur); journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur)); return; @@ -3751,7 +3751,7 @@ void Server::handle_remove_vxattr(MDRequestRef& mdr, CInode *cur, mdlog->start_entry(le); le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid()); mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); - mdcache->journal_dirty_inode(mdr, &le->metablob, cur); + mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur); journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur)); return; @@ -3848,7 +3848,7 @@ void Server::handle_client_setxattr(MDRequestRef& mdr) mdlog->start_entry(le); le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid()); mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); - mdcache->journal_dirty_inode(mdr, &le->metablob, cur); + mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur); journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur)); } @@ -3904,7 +3904,7 @@ void Server::handle_client_removexattr(MDRequestRef& mdr) mdlog->start_entry(le); le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid()); mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); - mdcache->journal_dirty_inode(mdr, &le->metablob, cur); + mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur); journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur)); } @@ -4310,7 +4310,7 @@ void Server::_link_local(MDRequestRef& mdr, CDentry *dn, CInode *targeti) mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, dn->get_dir(), PREDIRTY_DIR, 1); // new dn mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, 0, PREDIRTY_PRIMARY); // targeti le->metablob.add_remote_dentry(dn, true, targeti->ino(), targeti->d_type()); // new remote - mdcache->journal_dirty_inode(mdr, &le->metablob, targeti); + mdcache->journal_dirty_inode(mdr.get(), &le->metablob, targeti); // do this after predirty_*, to avoid funky extra dnl arg dn->push_projected_linkage(targeti->ino(), targeti->d_type()); @@ -4418,7 +4418,7 @@ void Server::_link_remote(MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targ } else { dn->pre_dirty(); mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, dn->get_dir(), PREDIRTY_DIR, -1); - mdcache->journal_cow_dentry(mdr, &le->metablob, dn); + mdcache->journal_cow_dentry(mdr.get(), &le->metablob, dn); le->metablob.add_null_dentry(dn, true); } @@ -4581,7 +4581,7 @@ void Server::handle_slave_link_prep(MDRequestRef& mdr) // commit case mdcache->predirty_journal_parents(mdr, &le->commit, dnl->get_inode(), 0, PREDIRTY_SHALLOW|PREDIRTY_PRIMARY, 0); - mdcache->journal_dirty_inode(mdr, &le->commit, targeti); + mdcache->journal_dirty_inode(mdr.get(), &le->commit, targeti); // set up commit waiter mdr->more()->slave_commit = new C_MDS_SlaveLinkCommit(this, mdr, targeti); @@ -5029,10 +5029,10 @@ void Server::_unlink_local(MDRequestRef& mdr, CDentry *dn, CDentry *straydn) // remote link. update remote inode. mdcache->predirty_journal_parents(mdr, &le->metablob, in, dn->get_dir(), PREDIRTY_DIR, -1); mdcache->predirty_journal_parents(mdr, &le->metablob, in, 0, PREDIRTY_PRIMARY); - mdcache->journal_dirty_inode(mdr, &le->metablob, in); + mdcache->journal_dirty_inode(mdr.get(), &le->metablob, in); } - mdcache->journal_cow_dentry(mdr, &le->metablob, dn); + mdcache->journal_cow_dentry(mdr.get(), &le->metablob, dn); le->metablob.add_null_dentry(dn, true); if (in->is_dir()) { @@ -6236,7 +6236,7 @@ void Server::_rename_prepare(MDRequestRef& mdr, if (oldin->is_auth()) { // auth for targeti metablob->add_dir_context(oldin->get_projected_parent_dir()); - mdcache->journal_cow_dentry(mdr, metablob, oldin->get_projected_parent_dn(), + mdcache->journal_cow_dentry(mdr.get(), metablob, oldin->get_projected_parent_dn(), CEPH_NOSNAP, 0, destdnl); metablob->add_primary_dentry(oldin->get_projected_parent_dn(), oldin, true); } @@ -6247,7 +6247,7 @@ void Server::_rename_prepare(MDRequestRef& mdr, if (srcdnl->is_remote()) { if (!linkmerge) { if (destdn->is_auth() && !destdnl->is_null()) - mdcache->journal_cow_dentry(mdr, metablob, destdn, CEPH_NOSNAP, 0, destdnl); + mdcache->journal_cow_dentry(mdr.get(), metablob, destdn, CEPH_NOSNAP, 0, destdnl); else destdn->first = MAX(destdn->first, next_dest_snap); @@ -6255,12 +6255,12 @@ void Server::_rename_prepare(MDRequestRef& mdr, metablob->add_remote_dentry(destdn, true, srcdnl->get_remote_ino(), srcdnl->get_remote_d_type()); if (srci->get_projected_parent_dn()->is_auth()) { // it's remote metablob->add_dir_context(srci->get_projected_parent_dir()); - mdcache->journal_cow_dentry(mdr, metablob, srci->get_projected_parent_dn(), CEPH_NOSNAP, 0, srcdnl); + mdcache->journal_cow_dentry(mdr.get(), metablob, srci->get_projected_parent_dn(), CEPH_NOSNAP, 0, srcdnl); metablob->add_primary_dentry(srci->get_projected_parent_dn(), srci, true); } } else { if (destdn->is_auth() && !destdnl->is_null()) - mdcache->journal_cow_dentry(mdr, metablob, destdn, CEPH_NOSNAP, 0, destdnl); + mdcache->journal_cow_dentry(mdr.get(), metablob, destdn, CEPH_NOSNAP, 0, destdnl); else destdn->first = MAX(destdn->first, next_dest_snap); @@ -6274,7 +6274,7 @@ void Server::_rename_prepare(MDRequestRef& mdr, srci->project_past_snaprealm_parent(dest_realm); if (destdn->is_auth() && !destdnl->is_null()) - mdcache->journal_cow_dentry(mdr, metablob, destdn, CEPH_NOSNAP, 0, destdnl); + mdcache->journal_cow_dentry(mdr.get(), metablob, destdn, CEPH_NOSNAP, 0, destdnl); else destdn->first = MAX(destdn->first, next_dest_snap); @@ -6300,7 +6300,7 @@ void Server::_rename_prepare(MDRequestRef& mdr, // src if (srcdn->is_auth()) { dout(10) << " journaling srcdn " << *srcdn << dendl; - mdcache->journal_cow_dentry(mdr, metablob, srcdn, CEPH_NOSNAP, 0, srcdnl); + mdcache->journal_cow_dentry(mdr.get(), metablob, srcdn, CEPH_NOSNAP, 0, srcdnl); // also journal the inode in case we need do slave rename rollback. It is Ok to add // both primary and NULL dentries. Because during journal replay, null dentry is // processed after primary dentry. @@ -7459,7 +7459,7 @@ void Server::handle_client_mksnap(MDRequestRef& mdr) le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid()); le->metablob.add_table_transaction(TABLE_SNAP, stid); mdcache->predirty_journal_parents(mdr, &le->metablob, diri, 0, PREDIRTY_PRIMARY, false); - mdcache->journal_dirty_inode(mdr, &le->metablob, diri); + mdcache->journal_dirty_inode(mdr.get(), &le->metablob, diri); // journal the snaprealm changes mdlog->submit_entry(le, new C_MDS_mksnap_finish(mds, mdr, diri, info)); @@ -7578,7 +7578,7 @@ void Server::handle_client_rmsnap(MDRequestRef& mdr) le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid()); le->metablob.add_table_transaction(TABLE_SNAP, stid); mdcache->predirty_journal_parents(mdr, &le->metablob, diri, 0, PREDIRTY_PRIMARY, false); - mdcache->journal_dirty_inode(mdr, &le->metablob, diri); + mdcache->journal_dirty_inode(mdr.get(), &le->metablob, diri); mdlog->submit_entry(le, new C_MDS_rmsnap_finish(mds, mdr, diri, snapid)); mdlog->flush();