]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: ensure xlocker has uptodate lock state
authorYan, Zheng <zyan@redhat.com>
Fri, 27 Oct 2017 01:30:23 +0000 (09:30 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 9 Feb 2018 10:42:27 +0000 (18:42 +0800)
This simplifies trans-authority rename. Master can prepare new snaplream
for source inode even it's not auth mds.

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
src/include/ceph_fs.h
src/mds/Mutation.cc
src/mds/Server.cc
src/messages/MMDSSlaveRequest.h

index 9542a887ea3b9e8130be05a56e98194f2c5259b4..627bbbead4e067e21ab3bbc559acbe1dd7349de9 100644 (file)
@@ -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
index 52c0ca2339da815238c24733546a233232db96c0..ba0790ed42d657d6e43429ec43c3ebcfce0d22ec 100644 (file)
@@ -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
     }
index 22ca2817872675c1ae95507509b0cd7b1f99a34b..1f0552d0cf9b2f56a4b5f74f78cc9564145342cc 100644 (file)
@@ -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);
index 8fe873fb5acb0906946c59a0e16a04806c08d43b..1f7d656d8e3052cae445df7afb3df8105dd84d28 100644 (file)
@@ -117,7 +117,6 @@ class MMDSSlaveRequest : public Message {
   set<mds_rank_t> 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);