From 246cead0f25ea78fb93d14bb6c32d6bd119536bb Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Wed, 8 Feb 2017 16:18:51 +0800 Subject: [PATCH] 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" --- src/mds/Locker.cc | 12 ++++++++++-- src/mds/Server.cc | 15 ++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 1da958316d03..8fc5c61e4f10 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 2d3584933b89..a8e1ec63e783 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()) { -- 2.47.3