From: Yan, Zheng Date: Wed, 8 Feb 2017 08:18:51 +0000 (+0800) Subject: mds: handle race of freezing auth pin X-Git-Tag: v12.0.1~266^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=246cead0f25ea78fb93d14bb6c32d6bd119536bb;p=ceph.git mds: handle race of freezing auth pin Linkage of rename source dentry may change during freezing auth pin for the rename source inode. So we may freeze auth pin for the wrong inode. Signed-off-by: "Yan, Zheng" --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 1da958316d0..8fc5c61e4f1 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -330,8 +330,16 @@ bool Locker::acquire_locks(MDRequestRef& mdr, dout(10) << " must authpin " << *object << dendl; - if (mdr->is_auth_pinned(object)) - continue; + if (mdr->is_auth_pinned(object)) { + if (object != (MDSCacheObject*)auth_pin_freeze) + continue; + if (mdr->more()->is_remote_frozen_authpin) { + if (mdr->more()->rename_inode == auth_pin_freeze) + continue; + // unfreeze auth pin for the wrong inode + mustpin_remote[mdr->more()->rename_inode->authority().first].size(); + } + } if (!object->is_auth()) { if (!mdr->locks.empty()) diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 2d3584933b8..a8e1ec63e78 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -2076,11 +2076,10 @@ void Server::handle_slave_auth_pin(MDRequestRef& mdr) MDSCacheObjectInfo info; (*p)->set_object_info(info); reply->get_authpins().push_back(info); + if (*p == (MDSCacheObject*)auth_pin_freeze) + auth_pin_freeze->set_object_info(reply->get_authpin_freeze()); } - if (auth_pin_freeze) - auth_pin_freeze->set_object_info(reply->get_authpin_freeze()); - if (wouldblock) reply->mark_error_wouldblock(); if (readonly) @@ -2115,6 +2114,16 @@ void Server::handle_slave_auth_pin_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack) pinned.insert(object); } + // removed frozen auth pin ? + if (mdr->more()->is_remote_frozen_authpin && + ack->get_authpin_freeze() == MDSCacheObjectInfo()) { + auto p = mdr->remote_auth_pins.find(mdr->more()->rename_inode); + assert(p != mdr->remote_auth_pins.end()); + if (p->second == from) { + mdr->more()->is_remote_frozen_authpin = false; + } + } + // removed auth pins? map::iterator p = mdr->remote_auth_pins.begin(); while (p != mdr->remote_auth_pins.end()) {