]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: clear dirty rstat flag on non-auth inode when finishing scatter update 16337/head
authorZhi Zhang <willzzhang@tencent.com>
Fri, 14 Jul 2017 09:50:54 +0000 (17:50 +0800)
committerZhi Zhang <willzzhang@tencent.com>
Mon, 17 Jul 2017 09:04:56 +0000 (17:04 +0800)
Signed-off-by: Zhi Zhang <zhangz.david@outlook.com>
src/mds/CInode.cc
src/mds/Locker.cc

index 4e6af3e97cb5a34d78a479363826cd15cd544f7d..da5313f0c827853e09fbc8690e76f432e78a8b04 100644 (file)
@@ -1936,7 +1936,6 @@ void CInode::finish_scatter_update(ScatterLock *lock, CDir *dir,
 
       inode_t *pi = get_projected_inode();
       fnode_t *pf = dir->project_fnode();
-      pf->version = dir->pre_dirty();
 
       const char *ename = 0;
       switch (lock->get_type()) {
@@ -1949,11 +1948,19 @@ void CInode::finish_scatter_update(ScatterLock *lock, CDir *dir,
        pf->rstat.version = pi->rstat.version;
        pf->accounted_rstat = pf->rstat;
        ename = "lock inest accounted scatter stat update";
+
+       if (!is_auth() && lock->get_state() == LOCK_MIX) {
+         dout(10) << "finish_scatter_update try to assimilate dirty rstat on " 
+           << *dir << dendl; 
+         dir->assimilate_dirty_rstat_inodes();
+       }
+
        break;
       default:
        ceph_abort();
       }
        
+      pf->version = dir->pre_dirty();
       mut->add_projected_fnode(dir);
 
       EUpdate *le = new EUpdate(mdlog, ename);
@@ -1963,6 +1970,22 @@ void CInode::finish_scatter_update(ScatterLock *lock, CDir *dir,
       
       assert(!dir->is_frozen());
       mut->auth_pin(dir);
+
+      if (lock->get_type() == CEPH_LOCK_INEST && 
+         !is_auth() && lock->get_state() == LOCK_MIX) {
+        dout(10) << "finish_scatter_update finish assimilating dirty rstat on " 
+          << *dir << dendl; 
+        dir->assimilate_dirty_rstat_inodes_finish(mut, &le->metablob);
+
+        if (!(pf->rstat == pf->accounted_rstat)) {
+          if (mut->wrlocks.count(&nestlock) == 0) {
+            mdcache->mds->locker->wrlock_force(&nestlock, mut);
+          }
+
+          mdcache->mds->locker->mark_updated_scatterlock(&nestlock);
+          mut->ls->dirty_dirfrag_nest.push_back(&item_dirty_dirfrag_nest);
+        }
+      }
       
       mdlog->submit_entry(le, new C_Inode_FragUpdate(this, dir, mut));
     } else {
@@ -1976,6 +1999,7 @@ void CInode::_finish_frag_update(CDir *dir, MutationRef& mut)
 {
   dout(10) << "_finish_frag_update on " << *dir << dendl;
   mut->apply();
+  mdcache->mds->locker->drop_locks(mut.get());
   mut->cleanup();
 }
 
index cf795ed225d36ef91bbf2da8561b96fdfd402f02..507bddb46381c681f25f31be012a50bfee6c3b2f 100644 (file)
@@ -5168,10 +5168,10 @@ void Locker::handle_file_lock(ScatterLock *lock, MLock *m)
        mds->mdlog->flush();
       break;
     } 
-    
+
     // ok
-    lock->decode_locked_state(m->get_data());
     lock->set_state(LOCK_MIX);
+    lock->decode_locked_state(m->get_data());
 
     if (caps)
       issue_caps(in);