]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: update CInode/CDentry's first according to global snapshot seq
authorYan, Zheng <zyan@redhat.com>
Tue, 6 Feb 2018 08:33:51 +0000 (16:33 +0800)
committerYan, Zheng <zyan@redhat.com>
Tue, 6 Mar 2018 02:34:27 +0000 (10:34 +0800)
This simplifies case that inode gets moved into different snaprealm

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
src/mds/CInode.cc
src/mds/MDCache.cc
src/mds/Server.cc

index 45d90b464e4c2101184173874d3fff42a5a9f68d..eed856169108520a61d55f2b8f89836dc9f9c0c8 100644 (file)
@@ -2677,7 +2677,7 @@ void CInode::split_old_inode(snapid_t snap)
 
 void CInode::pre_cow_old_inode()
 {
-  snapid_t follows = find_snaprealm()->get_newest_seq();
+  snapid_t follows = mdcache->get_global_snaprealm()->get_newest_seq();
   if (first <= follows)
     cow_old_inode(follows, true);
 }
index ccbc439f26925be90638da55b9d57694b3db2b8d..7992fa98abd381a63e0dd0e229d09d45c64993c6 100644 (file)
@@ -1594,7 +1594,8 @@ void MDCache::journal_cow_dentry(MutationImpl *mut, EMetaBlob *metablob,
     if (in->get_projected_parent_dn() != dn) {
       assert(follows == CEPH_NOSNAP);
       realm = dn->dir->inode->find_snaprealm();
-      snapid_t dir_follows = realm->get_newest_seq();
+      snapid_t dir_follows = get_global_snaprealm()->get_newest_seq();
+      assert(dir_follows >= realm->get_newest_seq());
 
       if (dir_follows+1 > dn->first) {
        snapid_t oldfirst = dn->first;
@@ -1613,15 +1614,17 @@ void MDCache::journal_cow_dentry(MutationImpl *mut, EMetaBlob *metablob,
        }
       }
 
+      follows = dir_follows;
       if (in->snaprealm) {
        realm = in->snaprealm;
-       follows = realm->get_newest_seq();
-      } else
-       follows = dir_follows;
+       assert(follows >= realm->get_newest_seq());
+      }
     } else {
       realm = in->find_snaprealm();
-      if (follows == CEPH_NOSNAP)
-       follows = realm->get_newest_seq();
+      if (follows == CEPH_NOSNAP) {
+       follows = get_global_snaprealm()->get_newest_seq();
+       assert(follows >= realm->get_newest_seq());
+      }
     }
 
     // already cloned?
@@ -1640,8 +1643,10 @@ void MDCache::journal_cow_dentry(MutationImpl *mut, EMetaBlob *metablob,
 
   } else {
     SnapRealm *realm = dn->dir->inode->find_snaprealm();
-    if (follows == CEPH_NOSNAP)
-      follows = realm->get_newest_seq();
+    if (follows == CEPH_NOSNAP) {
+      follows = get_global_snaprealm()->get_newest_seq();
+      assert(follows >= realm->get_newest_seq());
+    }
 
     // already cloned?
     if (follows < dn->first) {
index d78b48510edf0db0e12f1d934a7f9a5d3301a7c2..56276f663c04979165d136afa29d2be9c09dc699 100644 (file)
@@ -2530,10 +2530,10 @@ CDentry* Server::prepare_null_dentry(MDRequestRef& mdr, CDir *dir, std::string_v
         respond_to_request(mdr, -EEXIST);
         return 0;
       }
-    } else if (!dir->inode->is_stray()) {
-      dn->first = dir->inode->find_snaprealm()->get_newest_seq() + 1;
+    } else {
+      snapid_t next_snap = mdcache->get_global_snaprealm()->get_newest_seq() + 1;
+      dn->first = std::max(dn->first, next_snap);
     }
-
     return dn;
   }
 
@@ -2545,7 +2545,7 @@ CDentry* Server::prepare_null_dentry(MDRequestRef& mdr, CDir *dir, std::string_v
   }
   
   // create
-  dn = dir->add_null_dentry(dname, dir->inode->find_snaprealm()->get_newest_seq() + 1);
+  dn = dir->add_null_dentry(dname, mdcache->get_global_snaprealm()->get_newest_seq() + 1);
   dn->mark_new();
   dout(10) << "prepare_null_dentry added " << *dn << dendl;
   return dn;
@@ -3464,10 +3464,9 @@ void Server::handle_client_open(MDRequestRef& mdr)
 class C_MDS_openc_finish : public ServerLogContext { 
   CDentry *dn;
   CInode *newi;
-  snapid_t follows;
 public:
-  C_MDS_openc_finish(Server *s, MDRequestRef& r, CDentry *d, CInode *ni, snapid_t f) :
-    ServerLogContext(s, r), dn(d), newi(ni), follows(f) {}
+  C_MDS_openc_finish(Server *s, MDRequestRef& r, CDentry *d, CInode *ni) :
+    ServerLogContext(s, r), dn(d), newi(ni) {}
   void finish(int r) override {
     assert(r == 0);
 
@@ -3614,9 +3613,6 @@ void Server::handle_client_openc(MDRequestRef& mdr)
   }
 
   // create inode.
-  SnapRealm *realm = diri->find_snaprealm();   // use directory's realm; inode isn't attached yet.
-  snapid_t follows = realm->get_newest_seq();
-
   CInode *in = prepare_new_inode(mdr, dn->get_dir(), inodeno_t(req->head.ino),
                                 req->head.args.open.mode | S_IFREG, &layout);
   assert(in);
@@ -3628,6 +3624,11 @@ void Server::handle_client_openc(MDRequestRef& mdr)
   if (layout.pool_id != mdcache->default_file_layout.pool_id)
     in->inode.add_old_pool(mdcache->default_file_layout.pool_id);
   in->inode.update_backtrace();
+
+  SnapRealm *realm = diri->find_snaprealm();
+  snapid_t follows = mdcache->get_global_snaprealm()->get_newest_seq();
+  assert(follows >= realm->get_newest_seq());
+
   if (cmode & CEPH_FILE_MODE_WR) {
     in->inode.client_ranges[client].range.first = 0;
     in->inode.client_ranges[client].range.last = in->inode.get_layout_size_increment();
@@ -3657,7 +3658,7 @@ void Server::handle_client_openc(MDRequestRef& mdr)
   LogSegment *ls = mds->mdlog->get_current_segment();
   ls->open_files.push_back(&in->item_open_file);
 
-  C_MDS_openc_finish *fin = new C_MDS_openc_finish(this, mdr, dn, in, follows);
+  C_MDS_openc_finish *fin = new C_MDS_openc_finish(this, mdr, dn, in);
 
   if (mdr->client_request->get_connection()->has_feature(CEPH_FEATURE_REPLY_CREATE_INODE)) {
     dout(10) << "adding ino to reply to indicate inode was created" << dendl;
@@ -5147,10 +5148,7 @@ void Server::handle_client_mknod(MDRequestRef& mdr)
   else
     layout = mdcache->default_file_layout;
 
-  SnapRealm *realm = dn->get_dir()->inode->find_snaprealm();
-  snapid_t follows = realm->get_newest_seq();
-  CInode *newi = prepare_new_inode(mdr, dn->get_dir(), inodeno_t(req->head.ino),
-                                  mode, &layout);
+  CInode *newi = prepare_new_inode(mdr, dn->get_dir(), inodeno_t(req->head.ino), mode, &layout);
   assert(newi);
 
   dn->push_projected_linkage(newi);
@@ -5162,6 +5160,10 @@ void Server::handle_client_mknod(MDRequestRef& mdr)
     newi->inode.add_old_pool(mdcache->default_file_layout.pool_id);
   newi->inode.update_backtrace();
 
+  snapid_t follows = mdcache->get_global_snaprealm()->get_newest_seq();
+  SnapRealm *realm = dn->get_dir()->inode->find_snaprealm();
+  assert(follows >= realm->get_newest_seq());
+
   // if the client created a _regular_ file via MKNOD, it's highly likely they'll
   // want to write to it (e.g., if they are reexporting NFS)
   if (S_ISREG(newi->inode.mode)) {
@@ -5230,9 +5232,6 @@ void Server::handle_client_mkdir(MDRequestRef& mdr)
     return;
 
   // new inode
-  SnapRealm *realm = dn->get_dir()->inode->find_snaprealm();
-  snapid_t follows = realm->get_newest_seq();
-
   unsigned mode = req->head.args.mkdir.mode;
   mode &= ~S_IFMT;
   mode |= S_IFDIR;
@@ -5246,6 +5245,10 @@ void Server::handle_client_mkdir(MDRequestRef& mdr)
   newi->inode.rstat.rsubdirs = 1;
   newi->inode.update_backtrace();
 
+  snapid_t follows = mdcache->get_global_snaprealm()->get_newest_seq();
+  SnapRealm *realm = dn->get_dir()->inode->find_snaprealm();
+  assert(follows >= realm->get_newest_seq());
+
   dout(12) << " follows " << follows << dendl;
   assert(dn->first == follows + 1);
   newi->first = dn->first;
@@ -6111,10 +6114,8 @@ void Server::handle_client_unlink(MDRequestRef& mdr)
       return;
   }
 
-  SnapRealm *realm = in->find_snaprealm();
-  snapid_t follows = realm->get_newest_seq();
   if (straydn)
-    straydn->first = std::max<uint64_t>(in->first, follows + 1);
+    straydn->first = mdcache->get_global_snaprealm()->get_newest_seq() + 1;
 
   if (!mdr->more()->desti_srnode) {
     if (in->is_projected_snaprealm_global()) {
@@ -6130,6 +6131,8 @@ void Server::handle_client_unlink(MDRequestRef& mdr)
       mdr->more()->desti_srnode = new_srnode;
     } else if (dnl->is_primary()) {
       // prepare snaprealm blob for slave request
+      SnapRealm *realm = in->find_snaprealm();
+      snapid_t follows = realm->get_newest_seq();
       if (in->snaprealm || follows + 1 > in->get_oldest_snap()) {
        sr_t *new_srnode = in->prepare_new_srnode(follows);
        in->record_snaprealm_past_parent(new_srnode, straydn->get_dir()->inode->find_snaprealm());
@@ -7554,10 +7557,6 @@ void Server::_rename_prepare(MDRequestRef& mdr,
   if (destdn->is_auth())
     mdcache->predirty_journal_parents(mdr, metablob, srci, destdn->get_dir(), flags, 1);
 
-  SnapRealm *src_realm = srci->find_snaprealm();
-  SnapRealm *dest_realm = destdn->get_dir()->inode->find_snaprealm();
-  snapid_t next_dest_snap = std::max(dest_realm->get_newest_seq(), src_realm->get_newest_seq()) + 1;
-
   // add it all to the metablob
   // target inode
   if (!linkmerge) {
@@ -7571,7 +7570,7 @@ void Server::_rename_prepare(MDRequestRef& mdr,
            assert(!desti_srnode->is_parent_global());
          desti_srnode = NULL;
        }
-       straydn->first = std::max<uint64_t>(oldin->first, dest_realm->get_newest_seq() + 1);
+       straydn->first = mdcache->get_global_snaprealm()->get_newest_seq() + 1;
        metablob->add_primary_dentry(straydn, oldin, true, true);
       } else if (force_journal_stray) {
        dout(10) << " forced journaling straydn " << *straydn << dendl;
@@ -7611,7 +7610,7 @@ void Server::_rename_prepare(MDRequestRef& mdr,
     if (destdn->is_auth() && !destdnl->is_null())
       mdcache->journal_cow_dentry(mdr.get(), metablob, destdn, CEPH_NOSNAP, 0, destdnl);
     else
-      destdn->first = next_dest_snap;
+      destdn->first = mdcache->get_global_snaprealm()->get_newest_seq() + 1;
 
     if (destdn->is_auth())
       metablob->add_remote_dentry(destdn, true, srcdnl->get_remote_ino(), srcdnl->get_remote_d_type());
@@ -7646,7 +7645,7 @@ void Server::_rename_prepare(MDRequestRef& mdr,
     if (destdn->is_auth() && !destdnl->is_null())
       mdcache->journal_cow_dentry(mdr.get(), metablob, destdn, CEPH_NOSNAP, 0, destdnl);
 
-    destdn->first = std::max(srci->first, next_dest_snap);
+    destdn->first = mdcache->get_global_snaprealm()->get_newest_seq() + 1;
 
     if (destdn->is_auth())
       metablob->add_primary_dentry(destdn, srci, true, true);