From: Yan, Zheng Date: Tue, 11 Sep 2018 02:52:47 +0000 (+0800) Subject: mds: prevent rctime from going back X-Git-Tag: v12.2.9~37^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F24378%2Fhead;p=ceph.git mds: prevent rctime from going back Fixes: http://tracker.ceph.com/issues/35916 Signed-off-by: "Yan, Zheng" (cherry picked from commit 920ef964311a61fcc6c0d6671b77ffe98522863d) Conflicts: src/mds/Server.cc - luminous does not increment or decrement pi.inode.rstat.rsnaps --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 251dad5ff37d8..76b38b1338874 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -2428,8 +2428,11 @@ bool Locker::check_inode_max_size(CInode *in, bool force_wrlock, pi.inode.rstat.rbytes = new_size; dout(10) << "check_inode_max_size mtime " << pi.inode.mtime << " -> " << new_mtime << dendl; pi.inode.mtime = new_mtime; - if (new_mtime > pi.inode.ctime) - pi.inode.ctime = pi.inode.rstat.rctime = new_mtime; + if (new_mtime > pi.inode.ctime) { + pi.inode.ctime = new_mtime; + if (new_mtime > pi.inode.rstat.rctime) + pi.inode.rstat.rctime = new_mtime; + } } // use EOpen if the file is still open; otherwise, use EUpdate. @@ -3156,7 +3159,9 @@ void Locker::_update_cap_fields(CInode *in, int dirty, MClientCaps *m, CInode::m if (m->get_ctime() > pi->ctime) { dout(7) << " ctime " << pi->ctime << " -> " << m->get_ctime() << " for " << *in << dendl; - pi->ctime = pi->rstat.rctime = m->get_ctime(); + pi->ctime = m->get_ctime(); + if (m->get_ctime() > pi->rstat.rctime) + pi->rstat.rctime = m->get_ctime(); } if ((features & CEPH_FEATURE_FS_CHANGE_ATTR) && diff --git a/src/mds/Server.cc b/src/mds/Server.cc index e36815af43bb6..8acf97d4d4f3c 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -4204,7 +4204,9 @@ void Server::handle_client_setattr(MDRequestRef& mdr) } pi.inode.version = cur->pre_dirty(); - pi.inode.ctime = pi.inode.rstat.rctime = mdr->get_op_stamp(); + pi.inode.ctime = mdr->get_op_stamp(); + if (mdr->get_op_stamp() > pi.inode.rstat.rctime) + pi.inode.rstat.rctime = mdr->get_op_stamp(); pi.inode.change_attr++; // log + wait @@ -4240,7 +4242,9 @@ void Server::do_open_truncate(MDRequestRef& mdr, int cmode) // prepare auto &pi = in->project_inode(); pi.inode.version = in->pre_dirty(); - pi.inode.mtime = pi.inode.ctime = pi.inode.rstat.rctime = mdr->get_op_stamp(); + pi.inode.mtime = pi.inode.ctime = mdr->get_op_stamp(); + if (mdr->get_op_stamp() > pi.inode.rstat.rctime) + pi.inode.rstat.rctime = mdr->get_op_stamp(); pi.inode.change_attr++; uint64_t old_size = std::max(pi.inode.size, mdr->client_request->head.args.open.old_size); @@ -4358,7 +4362,9 @@ void Server::handle_client_setlayout(MDRequestRef& mdr) // add the old pool to the inode pi.inode.add_old_pool(old_layout.pool_id); pi.inode.version = cur->pre_dirty(); - pi.inode.ctime = pi.inode.rstat.rctime = mdr->get_op_stamp(); + pi.inode.ctime = mdr->get_op_stamp(); + if (mdr->get_op_stamp() > pi.inode.rstat.rctime) + pi.inode.rstat.rctime = mdr->get_op_stamp(); pi.inode.change_attr++; // log + wait @@ -4769,7 +4775,9 @@ void Server::handle_set_vxattr(MDRequestRef& mdr, CInode *cur, } pip->change_attr++; - pip->ctime = pip->rstat.rctime = mdr->get_op_stamp(); + pip->ctime = mdr->get_op_stamp(); + if (mdr->get_op_stamp() > pip->rstat.rctime) + pip->rstat.rctime = mdr->get_op_stamp(); pip->version = cur->pre_dirty(); if (cur->is_file()) pip->update_backtrace(); @@ -4937,7 +4945,9 @@ void Server::handle_client_setxattr(MDRequestRef& mdr) // project update auto &pi = cur->project_inode(true); pi.inode.version = cur->pre_dirty(); - pi.inode.ctime = pi.inode.rstat.rctime = mdr->get_op_stamp(); + pi.inode.ctime = mdr->get_op_stamp(); + if (mdr->get_op_stamp() > pi.inode.rstat.rctime) + pi.inode.rstat.rctime = mdr->get_op_stamp(); pi.inode.change_attr++; pi.inode.xattr_version++; auto &px = *pi.xattrs; @@ -5004,7 +5014,9 @@ void Server::handle_client_removexattr(MDRequestRef& mdr) auto &pi = cur->project_inode(true); auto &px = *pi.xattrs; pi.inode.version = cur->pre_dirty(); - pi.inode.ctime = pi.inode.rstat.rctime = mdr->get_op_stamp(); + pi.inode.ctime = mdr->get_op_stamp(); + if (mdr->get_op_stamp() > pi.inode.rstat.rctime) + pi.inode.rstat.rctime = mdr->get_op_stamp(); pi.inode.change_attr++; pi.inode.xattr_version++; px.erase(mempool::mds_co::string(boost::string_view(name))); @@ -5399,7 +5411,9 @@ void Server::_link_local(MDRequestRef& mdr, CDentry *dn, CInode *targeti) // project inode update auto &pi = targeti->project_inode(); pi.inode.nlink++; - pi.inode.ctime = pi.inode.rstat.rctime = mdr->get_op_stamp(); + pi.inode.ctime = mdr->get_op_stamp(); + if (mdr->get_op_stamp() > pi.inode.rstat.rctime) + pi.inode.rstat.rctime = mdr->get_op_stamp(); pi.inode.change_attr++; pi.inode.version = tipv; @@ -5794,7 +5808,7 @@ void Server::do_link_rollback(bufferlist &rbl, mds_rank_t master, MDRequestRef& } // inode - pi.inode.ctime = pi.inode.rstat.rctime = rollback.old_ctime; + pi.inode.ctime = rollback.old_ctime; if (rollback.was_inc) pi.inode.nlink--; else @@ -6065,7 +6079,9 @@ void Server::_unlink_local(MDRequestRef& mdr, CDentry *dn, CDentry *straydn) } mdr->add_projected_inode(in); // do this _after_ my dn->pre_dirty().. we apply that one manually. pi.inode.version = in->pre_dirty(); - pi.inode.ctime = pi.inode.rstat.rctime = mdr->get_op_stamp(); + pi.inode.ctime = mdr->get_op_stamp(); + if (mdr->get_op_stamp() > pi.inode.rstat.rctime) + pi.inode.rstat.rctime = mdr->get_op_stamp(); pi.inode.change_attr++; pi.inode.nlink--; if (pi.inode.nlink == 0) @@ -7257,13 +7273,17 @@ void Server::_rename_prepare(MDRequestRef& mdr, if (!silent) { if (spi) { - spi->ctime = spi->rstat.rctime = mdr->get_op_stamp(); + spi->ctime = mdr->get_op_stamp(); + if (mdr->get_op_stamp() > spi->rstat.rctime) + spi->rstat.rctime = mdr->get_op_stamp(); spi->change_attr++; if (linkmerge) spi->nlink--; } if (tpi) { - tpi->ctime = tpi->rstat.rctime = mdr->get_op_stamp(); + tpi->ctime = mdr->get_op_stamp(); + if (mdr->get_op_stamp() > tpi->rstat.rctime) + tpi->rstat.rctime = mdr->get_op_stamp(); tpi->change_attr++; { std::string t; @@ -8156,7 +8176,7 @@ void Server::do_rename_rollback(bufferlist &rbl, mds_rank_t master, MDRequestRef } else pip = in->get_projected_inode(); if (pip->ctime == rollback.ctime) - pip->ctime = pip->rstat.rctime = rollback.orig_src.old_ctime; + pip->ctime = rollback.orig_src.old_ctime; } if (srcdn && srcdn->authority().first == whoami) { @@ -8193,7 +8213,7 @@ void Server::do_rename_rollback(bufferlist &rbl, mds_rank_t master, MDRequestRef } else ti = target->get_projected_inode(); if (ti->ctime == rollback.ctime) - ti->ctime = ti->rstat.rctime = rollback.orig_dest.old_ctime; + ti->ctime = rollback.orig_dest.old_ctime; if (MDS_INO_IS_STRAY(rollback.orig_src.dirfrag.ino)) { if (MDS_INO_IS_STRAY(rollback.orig_dest.dirfrag.ino)) assert(!rollback.orig_dest.ino && !rollback.orig_dest.remote_ino); @@ -8647,7 +8667,9 @@ void Server::handle_client_mksnap(MDRequestRef& mdr) info.stamp = mdr->get_op_stamp(); auto &pi = diri->project_inode(false, true); - pi.inode.ctime = pi.inode.rstat.rctime = info.stamp; + pi.inode.ctime = info.stamp; + if (info.stamp > pi.inode.rstat.rctime) + pi.inode.rstat.rctime = info.stamp; pi.inode.version = diri->pre_dirty(); // project the snaprealm @@ -8779,7 +8801,9 @@ void Server::handle_client_rmsnap(MDRequestRef& mdr) // journal auto &pi = diri->project_inode(false, true); pi.inode.version = diri->pre_dirty(); - pi.inode.ctime = pi.inode.rstat.rctime = mdr->get_op_stamp(); + pi.inode.ctime = mdr->get_op_stamp(); + if (mdr->get_op_stamp() > pi.inode.rstat.rctime) + pi.inode.rstat.rctime = mdr->get_op_stamp(); mdr->ls = mdlog->get_current_segment(); EUpdate *le = new EUpdate(mdlog, "rmsnap"); @@ -8921,7 +8945,9 @@ void Server::handle_client_renamesnap(MDRequestRef& mdr) // journal auto &pi = diri->project_inode(false, true); - pi.inode.ctime = pi.inode.rstat.rctime = mdr->get_op_stamp(); + pi.inode.ctime = mdr->get_op_stamp(); + if (mdr->get_op_stamp() > pi.inode.rstat.rctime) + pi.inode.rstat.rctime = mdr->get_op_stamp(); pi.inode.version = diri->pre_dirty(); // project the snaprealm