Skip to content

Commit

Permalink
mds/quiesce: only take the quiesce lock on the replica
Browse files Browse the repository at this point in the history
Replica will follow the auth moving into the LOCK_LOCK state,
which has the file caps we want for quiesce: CACHE and BUFFER.

It should be sufficient to only hold the quiesce local lock
on the replica side.

Signed-off-by: Leonid Usov <leonid.usov@ibm.com>
  • Loading branch information
leonid-s-usov committed Apr 13, 2024
1 parent a6584ff commit a9e20a2
Showing 1 changed file with 28 additions and 22 deletions.
50 changes: 28 additions & 22 deletions src/mds/MDCache.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13623,28 +13623,34 @@ void MDCache::dispatch_quiesce_inode(const MDRequestRef& mdr)

lov.add_xlock(&in->quiescelock); /* !! */

if (splitauth) {
// xlock the file to let the Fb clients stay with buffered writes.
// While this will unnecesarily revoke rd caps, it's not as
// big of an overhead compared to having the Fb clients flush
// their buffers, which evidently can lead to the quiesce timeout
// We'll drop the lock after all clients conform to this request
// so the file will be still readable during the quiesce after
// the interested clients receive their Fr back
lov.add_xlock(&in->filelock);
if (in->is_auth()) {
if (splitauth) {
// xlock the file to let the Fb clients stay with buffered writes.
// While this will unnecesarily revoke rd caps, it's not as
// big of an overhead compared to having the Fb clients flush
// their buffers, which evidently can lead to the quiesce timeout
// We'll drop the lock after all clients conform to this request
// so the file will be still readable during the quiesce after
// the interested clients receive their Fr back
lov.add_xlock(&in->filelock);
} else {
// if splitauth == false then we won't drop the lock after acquisition (see below)
// we can't afford keeping it as xlock for a long time, so we'll have to deal
// with the potential quiesce timeout on high-load systems.
// The reason we're OK with this is that splitauth is enabled by default,
// and really should not be ever disabled outside of the test setups
// TODO: consider removing the `splitauth` config option completely.
lov.add_rdlock(&in->filelock);
}
// The rest of caps-related locks - rdlock to revoke write caps
lov.add_rdlock(&in->authlock);
lov.add_rdlock(&in->linklock);
lov.add_rdlock(&in->xattrlock);
} else {
// if splitauth == false then we won't drop the lock after acquisition (see below)
// we can't afford keeping it as xlock for a long time, so we'll have to deal
// with the potential quiesce timeout on high-load systems.
// The reason we're OK with this is that splitauth is enabled by default,
// and really should not be ever disabled outside of the test setups
// TODO: consider removing the `splitauth` config option completely.
lov.add_rdlock(&in->filelock);
}
// The rest of caps-related locks - rdlock to revoke write caps
lov.add_rdlock(&in->authlock);
lov.add_rdlock(&in->linklock);
lov.add_rdlock(&in->xattrlock);
// replica will follow suite and move to LOCK_LOCK state
// as a result of the auth taking the above locks.
}

if (!mds->locker->acquire_locks(mdr, lov, nullptr, {in}, false, true)) {
return;
}
Expand All @@ -13662,7 +13668,7 @@ void MDCache::dispatch_quiesce_inode(const MDRequestRef& mdr)
return;
}

if (splitauth) {
if (splitauth && in->is_auth()) {
/* Once we have the queiscelock, we no longer need these locks. However,
* if splitauth==false, the replicas do not try quiescing so we must keep
* them locked.
Expand Down

0 comments on commit a9e20a2

Please sign in to comment.