From: Yan, Zheng Date: Fri, 27 Oct 2017 01:30:23 +0000 (+0800) Subject: mds: ensure xlocker has uptodate lock state X-Git-Tag: v13.1.0~413^2~23 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bdcbc8a5ade5e0cff3bdc1205e1ee7a44a5c54d1;p=ceph.git mds: ensure xlocker has uptodate lock state This simplifies trans-authority rename. Master can prepare new snaplream for source inode even it's not auth mds. Signed-off-by: "Yan, Zheng" --- diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index 9542a887ea3b..627bbbead4e0 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -278,8 +278,8 @@ extern const char *ceph_mds_state_name(int s); */ #define CEPH_LOCK_DVERSION 1 #define CEPH_LOCK_DN 2 -#define CEPH_LOCK_ISNAP 16 -#define CEPH_LOCK_IVERSION 32 /* mds internal */ +#define CEPH_LOCK_IVERSION 16 /* mds internal */ +#define CEPH_LOCK_ISNAP 32 #define CEPH_LOCK_IFILE 64 #define CEPH_LOCK_IAUTH 128 #define CEPH_LOCK_ILINK 256 diff --git a/src/mds/Mutation.cc b/src/mds/Mutation.cc index 52c0ca2339da..ba0790ed42d6 100644 --- a/src/mds/Mutation.cc +++ b/src/mds/Mutation.cc @@ -362,8 +362,6 @@ void MDRequestImpl::_dump(Formatter *f) const f->dump_bool("has_inode_export", slave_request->inode_export.length() != 0); f->dump_int("inode_export_v", slave_request->inode_export_v); - f->dump_bool("has_srci_replica", - slave_request->srci_replica.length() != 0); f->dump_stream("op_stamp") << slave_request->op_stamp; f->close_section(); // request_info } diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 22ca28178726..1f0552d0cf9b 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -2051,6 +2051,7 @@ void Server::handle_slave_request_reply(MMDSSlaveRequest *m) SimpleLock *lock = mds->locker->get_lock(m->get_lock_type(), m->get_object_info()); mdr->more()->slaves.insert(from); + lock->decode_locked_state(m->get_lock_data()); dout(10) << "got remote xlock on " << *lock << " on " << *lock->get_parent() << dendl; mdr->xlocks.insert(lock); mdr->locks.insert(lock); @@ -2164,6 +2165,8 @@ void Server::dispatch_slave_request(MDRequestRef& mdr) MMDSSlaveRequest *r = new MMDSSlaveRequest(mdr->reqid, mdr->attempt, replycode); r->set_lock_type(lock->get_type()); lock->get_parent()->set_object_info(r->get_object_info()); + if (replycode == MMDSSlaveRequest::OP_XLOCKACK) + lock->encode_locked_state(r->get_lock_data()); mds->send_message(r, mdr->slave_request->get_connection()); } @@ -6892,7 +6895,7 @@ void Server::handle_client_rename(MDRequestRef& mdr) // we need to update srci's ctime. xlock its least contended lock to do that... xlocks.insert(&srci->linklock); - if (srcdnl->is_primary() && srci->is_dir()) + if (srcdnl->is_primary()) xlocks.insert(&srci->snaplock); else rdlocks.insert(&srci->snaplock); @@ -6900,9 +6903,10 @@ void Server::handle_client_rename(MDRequestRef& mdr) if (oldin) { // xlock oldin (for nlink--) xlocks.insert(&oldin->linklock); - if (destdnl->is_primary() && oldin->is_dir()) { - rdlocks.insert(&oldin->filelock); // to verify it's empty + if (destdnl->is_primary()) { xlocks.insert(&oldin->snaplock); + if (oldin->is_dir()) + rdlocks.insert(&oldin->filelock); // to verify it's empty } else rdlocks.insert(&oldin->snaplock); } @@ -6986,7 +6990,7 @@ void Server::handle_client_rename(MDRequestRef& mdr) mdr->more()->desti_srnode = new_srnode; } } - if (srcdn->is_auth() && srcdnl->is_primary() && !mdr->more()->srci_srnode) { + if (srcdnl->is_primary() && !mdr->more()->srci_srnode) { SnapRealm *dest_realm = destdir->inode->find_snaprealm(); SnapRealm *src_realm = srci->find_snaprealm(); snapid_t follows = src_realm->get_newest_seq(); @@ -7836,8 +7840,7 @@ void Server::handle_slave_rename_prep(MDRequestRef& mdr) // - avoid conflicting lock state changes // - avoid concurrent updates to the inode // (this could also be accomplished with the versionlock) - int allowance = 2; // 1 for the mdr auth_pin, 1 for the link lock - allowance += srcdnl->get_inode()->is_dir(); // for the snap lock + int allowance = 3; // 1 for the mdr auth_pin, 1 for the link lock, 1 for the snap lock dout(10) << " freezing srci " << *srcdnl->get_inode() << " with allowance " << allowance << dendl; bool frozen_inode = srcdnl->get_inode()->freeze_inode(allowance); @@ -7899,25 +7902,11 @@ void Server::handle_slave_rename_prep(MDRequestRef& mdr) break; } - if (srcdnl->is_primary() && !mdr->slave_request->srci_snapbl.length()) { - SnapRealm *dest_realm = destdn->get_dir()->inode->find_snaprealm(); - SnapRealm *src_realm = srci->find_snaprealm(); - snapid_t follows = src_realm->get_newest_seq(); - if (src_realm != dest_realm && - (srci->snaprealm || follows + 1 > srci->get_oldest_snap())) { - sr_t *new_srnode = srci->prepare_new_srnode(follows); - srci->record_snaprealm_past_parent(new_srnode, dest_realm); - encode(*new_srnode, mdr->slave_request->srci_snapbl); - delete new_srnode; - } - } - if (reply_witness) { assert(!srcdnrep.empty()); MMDSSlaveRequest *reply = new MMDSSlaveRequest(mdr->reqid, mdr->attempt, MMDSSlaveRequest::OP_RENAMEPREPACK); reply->witnesses.swap(srcdnrep); - reply->srci_snapbl.swap(mdr->slave_request->srci_snapbl); mds->send_message_mds(reply, mdr->slave_to_mds); mdr->slave_request->put(); mdr->slave_request = 0; @@ -8069,9 +8058,6 @@ void Server::_logged_slave_rename(MDRequestRef& mdr, CDentry::linkage_t *destdnl = destdn->get_linkage(); - if (mdr->more()->is_inode_exporter) - reply->srci_snapbl.swap(mdr->slave_request->srci_snapbl); - // bump popularity mds->balancer->hit_dir(mdr->get_mds_stamp(), srcdn->get_dir(), META_POP_IWR); if (destdnl->get_inode() && destdnl->get_inode()->is_auth()) @@ -8668,13 +8654,6 @@ void Server::handle_slave_rename_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *a mdr->more()->inode_import_v = ack->inode_export_v; } - if (ack->srci_snapbl.length() && !mdr->more()->srci_srnode) { - dout(10) << " got srci snapbl" << dendl; - mdr->more()->srci_srnode = new sr_t(); - bufferlist::iterator p = ack->srci_snapbl.begin(); - decode(*mdr->more()->srci_srnode, p); - } - // remove from waiting list assert(mdr->more()->waiting_on_slave.count(from)); mdr->more()->waiting_on_slave.erase(from); diff --git a/src/messages/MMDSSlaveRequest.h b/src/messages/MMDSSlaveRequest.h index 8fe873fb5acb..1f7d656d8e30 100644 --- a/src/messages/MMDSSlaveRequest.h +++ b/src/messages/MMDSSlaveRequest.h @@ -117,7 +117,6 @@ class MMDSSlaveRequest : public Message { set witnesses; bufferlist inode_export; version_t inode_export_v; - bufferlist srci_replica; mds_rank_t srcdn_auth; utime_t op_stamp; @@ -150,6 +149,7 @@ public: void mark_interrupted() { flags |= FLAG_INTERRUPTED; } void set_lock_type(int t) { lock_type = t; } + bufferlist& get_lock_data() { return inode_export; } // ---- @@ -178,7 +178,6 @@ public: encode(inode_export, payload); encode(inode_export_v, payload); encode(srcdn_auth, payload); - encode(srci_replica, payload); encode(straybl, payload); encode(srci_snapbl, payload); encode(desti_snapbl, payload); @@ -199,7 +198,6 @@ public: decode(inode_export, p); decode(inode_export_v, p); decode(srcdn_auth, p); - decode(srci_replica, p); decode(straybl, p); decode(srci_snapbl, p); decode(desti_snapbl, p);