]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
MDCache: use raw MutationImpl* instead of MutationRef in a few places
authorGreg Farnum <greg@inktank.com>
Thu, 13 Mar 2014 03:50:19 +0000 (20:50 -0700)
committerGreg Farnum <greg@inktank.com>
Tue, 8 Apr 2014 00:00:19 +0000 (17:00 -0700)
Avoid the atomic ops necessary when copying a shared_ptr.

Signed-off-by: Greg Farnum <greg@inktank.com>
src/mds/Locker.cc
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/Server.cc

index 12a61f3ef847b0c0300f579fa27d7fc5eadd1894..70223a9039ffa7c67b760263220df1d3fee7cff7 100644 (file)
@@ -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);
 
index b490b6519cd733f42ae657498f27c16ea86834b5..22b4875d1b227a08bf1a89cb78a25d760554be52 100644 (file)
@@ -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);
index 67b97a7d1a5d4e75a6424aad28bc2441405c82ad..13c3d5f72f093ac41900582f2ba233b759b3a144 100644 (file)
@@ -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);
index 9b00e4a79176c1af9cf5f93c85ad7d00e7589d49..11172e186793b3180cfd4dcf1d35772fa5426e19 100644 (file)
@@ -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();