From 5f15e515c617fca69a4a6dc4be741c19e2d07aa8 Mon Sep 17 00:00:00 2001 From: Gregory Noma Date: Mon, 9 May 2022 16:16:13 +0000 Subject: SERVER-65821 Allow prepared transactions to write commit decision across FCV barrier --- src/mongo/db/stats/fill_locker_info.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'src/mongo/db/stats') diff --git a/src/mongo/db/stats/fill_locker_info.cpp b/src/mongo/db/stats/fill_locker_info.cpp index f78b3a991e4..1f73d4dcc72 100644 --- a/src/mongo/db/stats/fill_locker_info.cpp +++ b/src/mongo/db/stats/fill_locker_info.cpp @@ -41,12 +41,17 @@ void fillLockerInfo(const Locker::LockerInfo& lockerInfo, BSONObjBuilder& infoBu BSONObjBuilder locks(infoBuilder.subobjStart("locks")); const size_t locksSize = lockerInfo.locks.size(); - // Only add the last lock of each type, and use the largest mode encountered - LockMode modeForType[ResourceTypesCount] = {}; // default initialize to zero (min value) + // Only add the last lock of each type, and use the largest mode encountered. Each type of + // global resource is reported as its own type. + LockMode modeForType[static_cast(ResourceGlobalId::kNumIds) + ResourceTypesCount - 1] = + {}; // default initialize to zero (min value) for (size_t i = 0; i < locksSize; i++) { const Locker::OneLock& lock = lockerInfo.locks[i]; const ResourceType lockType = lock.resourceId.getType(); - const LockMode lockMode = std::max(lock.mode, modeForType[lockType]); + auto index = lockType == RESOURCE_GLOBAL + ? lock.resourceId.getHashId() + : static_cast(ResourceGlobalId::kNumIds) + lockType - 1; + const LockMode lockMode = std::max(lock.mode, modeForType[index]); // Check that lockerInfo is sorted on resource type invariant(i == 0 || lockType >= lockerInfo.locks[i - 1].resourceId.getType()); @@ -56,10 +61,16 @@ void fillLockerInfo(const Locker::LockerInfo& lockerInfo, BSONObjBuilder& infoBu continue; } - modeForType[lockType] = lockMode; + modeForType[index] = lockMode; - if (i + 1 < locksSize && lockerInfo.locks[i + 1].resourceId.getType() == lockType) { + if (i + 1 < locksSize && lockerInfo.locks[i + 1].resourceId.getType() == lockType && + (lockType != RESOURCE_GLOBAL || + lock.resourceId.getHashId() == lockerInfo.locks[i + 1].resourceId.getHashId())) { continue; // skip this lock as it is not the last one of its type + } else if (lockType == RESOURCE_GLOBAL) { + locks.append( + resourceGlobalIdName(static_cast(lock.resourceId.getHashId())), + legacyModeName(lockMode)); } else { locks.append(resourceTypeName(lockType), legacyModeName(lockMode)); } -- cgit v1.2.1