diff options
author | Misha Tyulenev <misha@mongodb.com> | 2015-10-06 14:40:03 -0400 |
---|---|---|
committer | Misha Tyulenev <misha@mongodb.com> | 2015-10-06 18:14:17 -0400 |
commit | e40f1a1ba723184f276b28e01a240d8e5a6d3ecf (patch) | |
tree | 34e6de1e83604cfbd40b13ad491743df3a0d4434 /src | |
parent | 30428829b509082b92f0267d2ff9aecf57d30936 (diff) | |
download | mongo-e40f1a1ba723184f276b28e01a240d8e5a6d3ecf.tar.gz |
SERVER-20082 Add OperationContext parameter to config methods in ShardRegistry
Diffstat (limited to 'src')
22 files changed, 402 insertions, 287 deletions
diff --git a/src/mongo/s/catalog/catalog_manager_common.cpp b/src/mongo/s/catalog/catalog_manager_common.cpp index 92f9f6def61..14f2c3e5c8c 100644 --- a/src/mongo/s/catalog/catalog_manager_common.cpp +++ b/src/mongo/s/catalog/catalog_manager_common.cpp @@ -425,7 +425,7 @@ Status CatalogManagerCommon::createDatabase(OperationContext* txn, const std::st // Lock the database globally to prevent conflicts with simultaneous database creation. auto scopedDistLock = - getDistLockManager()->lock(dbName, "createDatabase", Seconds{5}, Milliseconds{500}); + getDistLockManager()->lock(txn, dbName, "createDatabase", Seconds{5}, Milliseconds{500}); if (!scopedDistLock.isOK()) { return scopedDistLock.getStatus(); } @@ -509,7 +509,7 @@ Status CatalogManagerCommon::enableSharding(OperationContext* txn, const std::st // Lock the database globally to prevent conflicts with simultaneous database // creation/modification. auto scopedDistLock = - getDistLockManager()->lock(dbName, "enableSharding", Seconds{5}, Milliseconds{500}); + getDistLockManager()->lock(txn, dbName, "enableSharding", Seconds{5}, Milliseconds{500}); if (!scopedDistLock.isOK()) { return scopedDistLock.getStatus(); } diff --git a/src/mongo/s/catalog/dist_lock_catalog.h b/src/mongo/s/catalog/dist_lock_catalog.h index 3c83e0433a7..516cff281d4 100644 --- a/src/mongo/s/catalog/dist_lock_catalog.h +++ b/src/mongo/s/catalog/dist_lock_catalog.h @@ -36,6 +36,7 @@ namespace mongo { class LockpingsType; class LocksType; +class OperationContext; class Status; template <typename T> class StatusWith; @@ -66,13 +67,13 @@ public: * Returns the ping document of the specified processID. * Common status errors include socket errors. */ - virtual StatusWith<LockpingsType> getPing(StringData processID) = 0; + virtual StatusWith<LockpingsType> getPing(OperationContext* txn, StringData processID) = 0; /** * Updates the ping document. Creates a new entry if it does not exists. * Common status errors include socket errors. */ - virtual Status ping(StringData processID, Date_t ping) = 0; + virtual Status ping(OperationContext* txn, StringData processID, Date_t ping) = 0; /** * Attempts to update the owner of a lock identified by lockID to lockSessionID. @@ -90,7 +91,8 @@ public: * * Common status errors include socket and duplicate key errors. */ - virtual StatusWith<LocksType> grabLock(StringData lockID, + virtual StatusWith<LocksType> grabLock(OperationContext* txn, + StringData lockID, const OID& lockSessionID, StringData who, StringData processId, @@ -112,7 +114,8 @@ public: * * Common status errors include socket errors. */ - virtual StatusWith<LocksType> overtakeLock(StringData lockID, + virtual StatusWith<LocksType> overtakeLock(OperationContext* txn, + StringData lockID, const OID& lockSessionID, const OID& currentHolderTS, StringData who, @@ -124,31 +127,31 @@ public: * Attempts to set the state of the lock document with lockSessionID to unlocked. * Common status errors include socket errors. */ - virtual Status unlock(const OID& lockSessionID) = 0; + virtual Status unlock(OperationContext* txn, const OID& lockSessionID) = 0; /** * Get some information from the config server primary. * Common status errors include socket errors. */ - virtual StatusWith<ServerInfo> getServerInfo() = 0; + virtual StatusWith<ServerInfo> getServerInfo(OperationContext* txn) = 0; /** * Returns the lock document. * Returns LockNotFound if lock document doesn't exist. * Common status errors include socket errors. */ - virtual StatusWith<LocksType> getLockByTS(const OID& lockSessionID) = 0; + virtual StatusWith<LocksType> getLockByTS(OperationContext* txn, const OID& lockSessionID) = 0; /** * Returns the lock document. * Common status errors include socket errors. */ - virtual StatusWith<LocksType> getLockByName(StringData name) = 0; + virtual StatusWith<LocksType> getLockByName(OperationContext* txn, StringData name) = 0; /** * Attempts to delete the ping document corresponding to the given processId. * Common status errors include socket errors. */ - virtual Status stopPing(StringData processId) = 0; + virtual Status stopPing(OperationContext* txn, StringData processId) = 0; }; } diff --git a/src/mongo/s/catalog/dist_lock_catalog_impl.cpp b/src/mongo/s/catalog/dist_lock_catalog_impl.cpp index 87c41729056..46108e3cf13 100644 --- a/src/mongo/s/catalog/dist_lock_catalog_impl.cpp +++ b/src/mongo/s/catalog/dist_lock_catalog_impl.cpp @@ -153,9 +153,10 @@ DistLockCatalogImpl::DistLockCatalogImpl(ShardRegistry* shardRegistry, DistLockCatalogImpl::~DistLockCatalogImpl() = default; -StatusWith<LockpingsType> DistLockCatalogImpl::getPing(StringData processID) { +StatusWith<LockpingsType> DistLockCatalogImpl::getPing(OperationContext* txn, + StringData processID) { auto findResult = _findOnConfig( - kReadPref, _lockPingNS, BSON(LockpingsType::process() << processID), BSONObj(), 1); + txn, kReadPref, _lockPingNS, BSON(LockpingsType::process() << processID), BSONObj(), 1); if (!findResult.isOK()) { return findResult.getStatus(); @@ -179,7 +180,7 @@ StatusWith<LockpingsType> DistLockCatalogImpl::getPing(StringData processID) { return pingDocResult.getValue(); } -Status DistLockCatalogImpl::ping(StringData processID, Date_t ping) { +Status DistLockCatalogImpl::ping(OperationContext* txn, StringData processID, Date_t ping) { auto request = FindAndModifyRequest::makeUpdate(_lockPingNS, BSON(LockpingsType::process() << processID), @@ -187,8 +188,8 @@ Status DistLockCatalogImpl::ping(StringData processID, Date_t ping) { request.setUpsert(true); request.setWriteConcern(_writeConcern); - auto resultStatus = - _client->runCommandOnConfigWithNotMasterRetries(_locksNS.db().toString(), request.toBSON()); + auto resultStatus = _client->runCommandOnConfigWithNotMasterRetries( + txn, _locksNS.db().toString(), request.toBSON()); if (!resultStatus.isOK()) { return resultStatus.getStatus(); @@ -199,7 +200,8 @@ Status DistLockCatalogImpl::ping(StringData processID, Date_t ping) { return findAndModifyStatus.getStatus(); } -StatusWith<LocksType> DistLockCatalogImpl::grabLock(StringData lockID, +StatusWith<LocksType> DistLockCatalogImpl::grabLock(OperationContext* txn, + StringData lockID, const OID& lockSessionID, StringData who, StringData processId, @@ -218,8 +220,8 @@ StatusWith<LocksType> DistLockCatalogImpl::grabLock(StringData lockID, request.setShouldReturnNew(true); request.setWriteConcern(_writeConcern); - auto resultStatus = - _client->runCommandOnConfigWithNotMasterRetries(_locksNS.db().toString(), request.toBSON()); + auto resultStatus = _client->runCommandOnConfigWithNotMasterRetries( + txn, _locksNS.db().toString(), request.toBSON()); if (!resultStatus.isOK()) { return resultStatus.getStatus(); @@ -249,7 +251,8 @@ StatusWith<LocksType> DistLockCatalogImpl::grabLock(StringData lockID, return locksTypeResult.getValue(); } -StatusWith<LocksType> DistLockCatalogImpl::overtakeLock(StringData lockID, +StatusWith<LocksType> DistLockCatalogImpl::overtakeLock(OperationContext* txn, + StringData lockID, const OID& lockSessionID, const OID& currentHolderTS, StringData who, @@ -271,8 +274,8 @@ StatusWith<LocksType> DistLockCatalogImpl::overtakeLock(StringData lockID, request.setShouldReturnNew(true); request.setWriteConcern(_writeConcern); - auto resultStatus = - _client->runCommandOnConfigWithNotMasterRetries(_locksNS.db().toString(), request.toBSON()); + auto resultStatus = _client->runCommandOnConfigWithNotMasterRetries( + txn, _locksNS.db().toString(), request.toBSON()); if (!resultStatus.isOK()) { return resultStatus.getStatus(); @@ -296,15 +299,15 @@ StatusWith<LocksType> DistLockCatalogImpl::overtakeLock(StringData lockID, return locksTypeResult.getValue(); } -Status DistLockCatalogImpl::unlock(const OID& lockSessionID) { +Status DistLockCatalogImpl::unlock(OperationContext* txn, const OID& lockSessionID) { auto request = FindAndModifyRequest::makeUpdate( _locksNS, BSON(LocksType::lockID(lockSessionID)), BSON("$set" << BSON(LocksType::state(LocksType::UNLOCKED)))); request.setWriteConcern(_writeConcern); - auto resultStatus = - _client->runCommandOnConfigWithNotMasterRetries(_locksNS.db().toString(), request.toBSON()); + auto resultStatus = _client->runCommandOnConfigWithNotMasterRetries( + txn, _locksNS.db().toString(), request.toBSON()); if (!resultStatus.isOK()) { return resultStatus.getStatus(); @@ -324,8 +327,9 @@ Status DistLockCatalogImpl::unlock(const OID& lockSessionID) { return findAndModifyStatus; } -StatusWith<DistLockCatalog::ServerInfo> DistLockCatalogImpl::getServerInfo() { - auto resultStatus = _client->runCommandOnConfig(kReadPref, "admin", BSON("serverStatus" << 1)); +StatusWith<DistLockCatalog::ServerInfo> DistLockCatalogImpl::getServerInfo(OperationContext* txn) { + auto resultStatus = + _client->runCommandOnConfig(txn, kReadPref, "admin", BSON("serverStatus" << 1)); if (!resultStatus.isOK()) { return resultStatus.getStatus(); @@ -356,9 +360,10 @@ StatusWith<DistLockCatalog::ServerInfo> DistLockCatalogImpl::getServerInfo() { return DistLockCatalog::ServerInfo(localTimeElem.date(), electionIdStatus.getValue()); } -StatusWith<LocksType> DistLockCatalogImpl::getLockByTS(const OID& lockSessionID) { - auto findResult = - _findOnConfig(kReadPref, _locksNS, BSON(LocksType::lockID(lockSessionID)), BSONObj(), 1); +StatusWith<LocksType> DistLockCatalogImpl::getLockByTS(OperationContext* txn, + const OID& lockSessionID) { + auto findResult = _findOnConfig( + txn, kReadPref, _locksNS, BSON(LocksType::lockID(lockSessionID)), BSONObj(), 1); if (!findResult.isOK()) { return findResult.getStatus(); @@ -382,9 +387,9 @@ StatusWith<LocksType> DistLockCatalogImpl::getLockByTS(const OID& lockSessionID) return locksTypeResult.getValue(); } -StatusWith<LocksType> DistLockCatalogImpl::getLockByName(StringData name) { +StatusWith<LocksType> DistLockCatalogImpl::getLockByName(OperationContext* txn, StringData name) { auto findResult = - _findOnConfig(kReadPref, _locksNS, BSON(LocksType::name() << name), BSONObj(), 1); + _findOnConfig(txn, kReadPref, _locksNS, BSON(LocksType::name() << name), BSONObj(), 1); if (!findResult.isOK()) { return findResult.getStatus(); @@ -408,13 +413,13 @@ StatusWith<LocksType> DistLockCatalogImpl::getLockByName(StringData name) { return locksTypeResult.getValue(); } -Status DistLockCatalogImpl::stopPing(StringData processId) { +Status DistLockCatalogImpl::stopPing(OperationContext* txn, StringData processId) { auto request = FindAndModifyRequest::makeRemove(_lockPingNS, BSON(LockpingsType::process() << processId)); request.setWriteConcern(_writeConcern); - auto resultStatus = - _client->runCommandOnConfigWithNotMasterRetries(_locksNS.db().toString(), request.toBSON()); + auto resultStatus = _client->runCommandOnConfigWithNotMasterRetries( + txn, _locksNS.db().toString(), request.toBSON()); if (!resultStatus.isOK()) { return resultStatus.getStatus(); @@ -427,13 +432,15 @@ Status DistLockCatalogImpl::stopPing(StringData processId) { } StatusWith<vector<BSONObj>> DistLockCatalogImpl::_findOnConfig( + OperationContext* txn, const ReadPreferenceSetting& readPref, const NamespaceString& nss, const BSONObj& query, const BSONObj& sort, boost::optional<long long> limit) { repl::ReadConcernArgs readConcern(boost::none, repl::ReadConcernLevel::kMajorityReadConcern); - auto result = _client->exhaustiveFindOnConfig(readPref, nss, query, sort, limit, readConcern); + auto result = + _client->exhaustiveFindOnConfig(txn, readPref, nss, query, sort, limit, readConcern); if (!result.isOK()) { return result.getStatus(); diff --git a/src/mongo/s/catalog/dist_lock_catalog_impl.h b/src/mongo/s/catalog/dist_lock_catalog_impl.h index a38aaf088f7..61047943dd6 100644 --- a/src/mongo/s/catalog/dist_lock_catalog_impl.h +++ b/src/mongo/s/catalog/dist_lock_catalog_impl.h @@ -51,18 +51,20 @@ public: virtual ~DistLockCatalogImpl(); - virtual StatusWith<LockpingsType> getPing(StringData processID) override; + virtual StatusWith<LockpingsType> getPing(OperationContext* txn, StringData processID) override; - virtual Status ping(StringData processID, Date_t ping) override; + virtual Status ping(OperationContext* txn, StringData processID, Date_t ping) override; - virtual StatusWith<LocksType> grabLock(StringData lockID, + virtual StatusWith<LocksType> grabLock(OperationContext* txn, + StringData lockID, const OID& lockSessionID, StringData who, StringData processId, Date_t time, StringData why) override; - virtual StatusWith<LocksType> overtakeLock(StringData lockID, + virtual StatusWith<LocksType> overtakeLock(OperationContext* txn, + StringData lockID, const OID& lockSessionID, const OID& currentHolderTS, StringData who, @@ -70,18 +72,20 @@ public: Date_t time, StringData why) override; - virtual Status unlock(const OID& lockSessionID) override; + virtual Status unlock(OperationContext* txn, const OID& lockSessionID) override; - virtual StatusWith<ServerInfo> getServerInfo() override; + virtual StatusWith<ServerInfo> getServerInfo(OperationContext* txn) override; - virtual StatusWith<LocksType> getLockByTS(const OID& lockSessionID) override; + virtual StatusWith<LocksType> getLockByTS(OperationContext* txn, + const OID& lockSessionID) override; - virtual StatusWith<LocksType> getLockByName(StringData name) override; + virtual StatusWith<LocksType> getLockByName(OperationContext* txn, StringData name) override; - virtual Status stopPing(StringData processId) override; + virtual Status stopPing(OperationContext* txn, StringData processId) override; private: - StatusWith<std::vector<BSONObj>> _findOnConfig(const ReadPreferenceSetting& readPref, + StatusWith<std::vector<BSONObj>> _findOnConfig(OperationContext* txn, + const ReadPreferenceSetting& readPref, const NamespaceString& nss, const BSONObj& query, const BSONObj& sort, diff --git a/src/mongo/s/catalog/dist_lock_catalog_impl_test.cpp b/src/mongo/s/catalog/dist_lock_catalog_impl_test.cpp index 88e6c7db50a..fafd0f81bb4 100644 --- a/src/mongo/s/catalog/dist_lock_catalog_impl_test.cpp +++ b/src/mongo/s/catalog/dist_lock_catalog_impl_test.cpp @@ -37,6 +37,7 @@ #include "mongo/client/remote_command_targeter_mock.h" #include "mongo/db/commands.h" #include "mongo/db/jsobj.h" +#include "mongo/db/operation_context_noop.h" #include "mongo/db/query/find_and_modify_request.h" #include "mongo/db/repl/read_concern_args.h" #include "mongo/executor/network_interface_mock.h" @@ -103,6 +104,10 @@ public: } } + OperationContext* txn() { + return &_txn; + } + private: void setUp() override { auto networkUniquePtr = stdx::make_unique<executor::NetworkInterfaceMock>(); @@ -139,6 +144,7 @@ private: std::unique_ptr<ShardRegistry> _shardRegistry; std::unique_ptr<DistLockCatalogImpl> _distLockCatalog; + OperationContextNoop _txn; }; void checkReadConcern(const BSONObj& findCmd) { @@ -150,7 +156,7 @@ void checkReadConcern(const BSONObj& findCmd) { TEST_F(DistLockCatalogFixture, BasicPing) { auto future = launchAsync([this] { Date_t ping(dateFromISOString("2014-03-11T09:17:18.098Z").getValue()); - auto status = catalog()->ping("abcd", ping); + auto status = catalog()->ping(txn(), "abcd", ping); ASSERT_OK(status); }); @@ -186,21 +192,21 @@ TEST_F(DistLockCatalogFixture, BasicPing) { TEST_F(DistLockCatalogFixture, PingTargetError) { targeter()->setFindHostReturnValue({ErrorCodes::InternalError, "can't target"}); - auto status = catalog()->ping("abcd", Date_t::now()); + auto status = catalog()->ping(txn(), "abcd", Date_t::now()); ASSERT_NOT_OK(status); } TEST_F(DistLockCatalogFixture, PingRunCmdError) { shutdownShardRegistry(); - auto status = catalog()->ping("abcd", Date_t::now()); + auto status = catalog()->ping(txn(), "abcd", Date_t::now()); ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, status.code()); ASSERT_FALSE(status.reason().empty()); } TEST_F(DistLockCatalogFixture, PingCommandError) { auto future = launchAsync([this] { - auto status = catalog()->ping("abcd", Date_t::now()); + auto status = catalog()->ping(txn(), "abcd", Date_t::now()); ASSERT_EQUALS(ErrorCodes::FailedToParse, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -218,7 +224,7 @@ TEST_F(DistLockCatalogFixture, PingCommandError) { TEST_F(DistLockCatalogFixture, PingWriteError) { auto future = launchAsync([this] { - auto status = catalog()->ping("abcd", Date_t::now()); + auto status = catalog()->ping(txn(), "abcd", Date_t::now()); ASSERT_EQUALS(ErrorCodes::Unauthorized, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -236,7 +242,7 @@ TEST_F(DistLockCatalogFixture, PingWriteError) { TEST_F(DistLockCatalogFixture, PingWriteConcernError) { auto future = launchAsync([this] { - auto status = catalog()->ping("abcd", Date_t::now()); + auto status = catalog()->ping(txn(), "abcd", Date_t::now()); ASSERT_EQUALS(ErrorCodes::WriteConcernFailed, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -257,7 +263,7 @@ TEST_F(DistLockCatalogFixture, PingWriteConcernError) { TEST_F(DistLockCatalogFixture, PingUnsupportedWriteConcernResponse) { auto future = launchAsync([this] { - auto status = catalog()->ping("abcd", Date_t::now()); + auto status = catalog()->ping(txn(), "abcd", Date_t::now()); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -279,7 +285,7 @@ TEST_F(DistLockCatalogFixture, PingUnsupportedWriteConcernResponse) { TEST_F(DistLockCatalogFixture, PingUnsupportedResponseFormat) { auto future = launchAsync([this] { - auto status = catalog()->ping("abcd", Date_t::now()); + auto status = catalog()->ping(txn(), "abcd", Date_t::now()); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); }); @@ -296,7 +302,7 @@ TEST_F(DistLockCatalogFixture, GrabLockNoOp) { OID myID("555f80be366c194b13fb0372"); Date_t now(dateFromISOString("2015-05-22T19:17:18.098Z").getValue()); auto resultStatus = - catalog()->grabLock("test", myID, "me", "mongos", now, "because").getStatus(); + catalog()->grabLock(txn(), "test", myID, "me", "mongos", now, "because").getStatus(); ASSERT_EQUALS(ErrorCodes::LockStateChangeFailed, resultStatus.code()); }); @@ -335,7 +341,8 @@ TEST_F(DistLockCatalogFixture, GrabLockWithNewDoc) { auto future = launchAsync([this] { OID myID("555f80be366c194b13fb0372"); Date_t now(dateFromISOString("2015-05-22T19:17:18.098Z").getValue()); - auto resultStatus = catalog()->grabLock("test", myID, "me", "mongos", now, "because"); + auto resultStatus = + catalog()->grabLock(txn(), "test", myID, "me", "mongos", now, "because"); ASSERT_OK(resultStatus.getStatus()); const auto& lockDoc = resultStatus.getValue(); @@ -396,7 +403,7 @@ TEST_F(DistLockCatalogFixture, GrabLockWithNewDoc) { TEST_F(DistLockCatalogFixture, GrabLockWithBadLockDoc) { auto future = launchAsync([this] { Date_t now(dateFromISOString("2015-05-22T19:17:18.098Z").getValue()); - auto resultStatus = catalog()->grabLock("test", OID(), "", "", now, "").getStatus(); + auto resultStatus = catalog()->grabLock(txn(), "test", OID(), "", "", now, "").getStatus(); ASSERT_EQUALS(ErrorCodes::FailedToParse, resultStatus.code()); }); @@ -427,21 +434,22 @@ TEST_F(DistLockCatalogFixture, GrabLockWithBadLockDoc) { TEST_F(DistLockCatalogFixture, GrabLockTargetError) { targeter()->setFindHostReturnValue({ErrorCodes::InternalError, "can't target"}); - auto status = catalog()->grabLock("", OID::gen(), "", "", Date_t::now(), "").getStatus(); + auto status = catalog()->grabLock(txn(), "", OID::gen(), "", "", Date_t::now(), "").getStatus(); ASSERT_NOT_OK(status); } TEST_F(DistLockCatalogFixture, GrabLockRunCmdError) { shutdownShardRegistry(); - auto status = catalog()->grabLock("", OID::gen(), "", "", Date_t::now(), "").getStatus(); + auto status = catalog()->grabLock(txn(), "", OID::gen(), "", "", Date_t::now(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, status.code()); ASSERT_FALSE(status.reason().empty()); } TEST_F(DistLockCatalogFixture, GrabLockCommandError) { auto future = launchAsync([this] { - auto status = catalog()->grabLock("", OID::gen(), "", "", Date_t::now(), "").getStatus(); + auto status = + catalog()->grabLock(txn(), "", OID::gen(), "", "", Date_t::now(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::FailedToParse, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -459,7 +467,8 @@ TEST_F(DistLockCatalogFixture, GrabLockCommandError) { TEST_F(DistLockCatalogFixture, GrabLockDupKeyError) { auto future = launchAsync([this] { - auto status = catalog()->grabLock("", OID::gen(), "", "", Date_t::now(), "").getStatus(); + auto status = + catalog()->grabLock(txn(), "", OID::gen(), "", "", Date_t::now(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::LockStateChangeFailed, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -477,7 +486,8 @@ TEST_F(DistLockCatalogFixture, GrabLockDupKeyError) { TEST_F(DistLockCatalogFixture, GrabLockWriteError) { auto future = launchAsync([this] { - auto status = catalog()->grabLock("", OID::gen(), "", "", Date_t::now(), "").getStatus(); + auto status = + catalog()->grabLock(txn(), "", OID::gen(), "", "", Date_t::now(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::Unauthorized, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -495,7 +505,8 @@ TEST_F(DistLockCatalogFixture, GrabLockWriteError) { TEST_F(DistLockCatalogFixture, GrabLockWriteConcernError) { auto future = launchAsync([this] { - auto status = catalog()->grabLock("", OID::gen(), "", "", Date_t::now(), "").getStatus(); + auto status = + catalog()->grabLock(txn(), "", OID::gen(), "", "", Date_t::now(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::WriteConcernFailed, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -516,7 +527,8 @@ TEST_F(DistLockCatalogFixture, GrabLockWriteConcernError) { TEST_F(DistLockCatalogFixture, GrabLockWriteConcernErrorBadType) { auto future = launchAsync([this] { - auto status = catalog()->grabLock("", OID::gen(), "", "", Date_t::now(), "").getStatus(); + auto status = + catalog()->grabLock(txn(), "", OID::gen(), "", "", Date_t::now(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::TypeMismatch, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -535,7 +547,8 @@ TEST_F(DistLockCatalogFixture, GrabLockWriteConcernErrorBadType) { TEST_F(DistLockCatalogFixture, GrabLockResponseMissingValueField) { auto future = launchAsync([this] { - auto status = catalog()->grabLock("", OID::gen(), "", "", Date_t::now(), "").getStatus(); + auto status = + catalog()->grabLock(txn(), "", OID::gen(), "", "", Date_t::now(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -551,7 +564,8 @@ TEST_F(DistLockCatalogFixture, GrabLockResponseMissingValueField) { TEST_F(DistLockCatalogFixture, GrabLockUnsupportedWriteConcernResponse) { auto future = launchAsync([this] { - auto status = catalog()->grabLock("", OID::gen(), "", "", Date_t::now(), "").getStatus(); + auto status = + catalog()->grabLock(txn(), "", OID::gen(), "", "", Date_t::now(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -573,7 +587,8 @@ TEST_F(DistLockCatalogFixture, GrabLockUnsupportedWriteConcernResponse) { TEST_F(DistLockCatalogFixture, GrabLockUnsupportedResponseFormat) { auto future = launchAsync([this] { - auto status = catalog()->grabLock("", OID::gen(), "", "", Date_t::now(), "").getStatus(); + auto status = + catalog()->grabLock(txn(), "", OID::gen(), "", "", Date_t::now(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); }); @@ -592,7 +607,7 @@ TEST_F(DistLockCatalogFixture, OvertakeLockNoOp) { Date_t now(dateFromISOString("2015-05-22T19:17:18.098Z").getValue()); auto resultStatus = catalog() - ->overtakeLock("test", myID, currentOwner, "me", "mongos", now, "because") + ->overtakeLock(txn(), "test", myID, currentOwner, "me", "mongos", now, "because") .getStatus(); ASSERT_EQUALS(ErrorCodes::LockStateChangeFailed, resultStatus.code()); @@ -637,8 +652,8 @@ TEST_F(DistLockCatalogFixture, OvertakeLockWithNewDoc) { OID myID("555f80be366c194b13fb0372"); OID currentOwner("555f99712c99a78c5b083358"); Date_t now(dateFromISOString("2015-05-22T19:17:18.098Z").getValue()); - auto resultStatus = - catalog()->overtakeLock("test", myID, currentOwner, "me", "mongos", now, "because"); + auto resultStatus = catalog()->overtakeLock( + txn(), "test", myID, currentOwner, "me", "mongos", now, "because"); ASSERT_OK(resultStatus.getStatus()); const auto& lockDoc = resultStatus.getValue(); @@ -704,7 +719,7 @@ TEST_F(DistLockCatalogFixture, OvertakeLockWithBadLockDoc) { auto future = launchAsync([this] { Date_t now(dateFromISOString("2015-05-22T19:17:18.098Z").getValue()); auto resultStatus = - catalog()->overtakeLock("test", OID(), OID(), "", "", now, "").getStatus(); + catalog()->overtakeLock(txn(), "test", OID(), OID(), "", "", now, "").getStatus(); ASSERT_EQUALS(ErrorCodes::FailedToParse, resultStatus.code()); }); @@ -735,14 +750,16 @@ TEST_F(DistLockCatalogFixture, OvertakeLockWithBadLockDoc) { TEST_F(DistLockCatalogFixture, OvertakeLockTargetError) { targeter()->setFindHostReturnValue({ErrorCodes::InternalError, "can't target"}); - auto status = catalog()->overtakeLock("", OID(), OID(), "", "", Date_t::now(), "").getStatus(); + auto status = + catalog()->overtakeLock(txn(), "", OID(), OID(), "", "", Date_t::now(), "").getStatus(); ASSERT_NOT_OK(status); } TEST_F(DistLockCatalogFixture, OvertakeLockRunCmdError) { shutdownShardRegistry(); - auto status = catalog()->overtakeLock("", OID(), OID(), "", "", Date_t::now(), "").getStatus(); + auto status = + catalog()->overtakeLock(txn(), "", OID(), OID(), "", "", Date_t::now(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, status.code()); ASSERT_FALSE(status.reason().empty()); } @@ -750,7 +767,7 @@ TEST_F(DistLockCatalogFixture, OvertakeLockRunCmdError) { TEST_F(DistLockCatalogFixture, OvertakeLockCommandError) { auto future = launchAsync([this] { auto status = - catalog()->overtakeLock("", OID(), OID(), "", "", Date_t::now(), "").getStatus(); + catalog()->overtakeLock(txn(), "", OID(), OID(), "", "", Date_t::now(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::FailedToParse, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -769,7 +786,7 @@ TEST_F(DistLockCatalogFixture, OvertakeLockCommandError) { TEST_F(DistLockCatalogFixture, OvertakeLockWriteError) { auto future = launchAsync([this] { auto status = - catalog()->overtakeLock("", OID(), OID(), "", "", Date_t::now(), "").getStatus(); + catalog()->overtakeLock(txn(), "", OID(), OID(), "", "", Date_t::now(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::Unauthorized, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -788,7 +805,7 @@ TEST_F(DistLockCatalogFixture, OvertakeLockWriteError) { TEST_F(DistLockCatalogFixture, OvertakeLockWriteConcernError) { auto future = launchAsync([this] { auto status = - catalog()->overtakeLock("", OID(), OID(), "", "", Date_t::now(), "").getStatus(); + catalog()->overtakeLock(txn(), "", OID(), OID(), "", "", Date_t::now(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::WriteConcernFailed, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -810,7 +827,7 @@ TEST_F(DistLockCatalogFixture, OvertakeLockWriteConcernError) { TEST_F(DistLockCatalogFixture, OvertakeLockUnsupportedWriteConcernResponse) { auto future = launchAsync([this] { auto status = - catalog()->overtakeLock("", OID(), OID(), "", "", Date_t::now(), "").getStatus(); + catalog()->overtakeLock(txn(), "", OID(), OID(), "", "", Date_t::now(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -833,7 +850,7 @@ TEST_F(DistLockCatalogFixture, OvertakeLockUnsupportedWriteConcernResponse) { TEST_F(DistLockCatalogFixture, OvertakeLockUnsupportedResponseFormat) { auto future = launchAsync([this] { auto status = - catalog()->overtakeLock("", OID(), OID(), "", "", Date_t::now(), "").getStatus(); + catalog()->overtakeLock(txn(), "", OID(), OID(), "", "", Date_t::now(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); }); @@ -847,7 +864,7 @@ TEST_F(DistLockCatalogFixture, OvertakeLockUnsupportedResponseFormat) { TEST_F(DistLockCatalogFixture, BasicUnlock) { auto future = launchAsync([this] { - auto status = catalog()->unlock(OID("555f99712c99a78c5b083358")); + auto status = catalog()->unlock(txn(), OID("555f99712c99a78c5b083358")); ASSERT_OK(status); }); @@ -879,7 +896,7 @@ TEST_F(DistLockCatalogFixture, BasicUnlock) { TEST_F(DistLockCatalogFixture, UnlockWithNoNewDoc) { auto future = launchAsync([this] { - auto status = catalog()->unlock(OID("555f99712c99a78c5b083358")); + auto status = catalog()->unlock(txn(), OID("555f99712c99a78c5b083358")); ASSERT_OK(status); }); @@ -907,21 +924,21 @@ TEST_F(DistLockCatalogFixture, UnlockWithNoNewDoc) { TEST_F(DistLockCatalogFixture, UnlockTargetError) { targeter()->setFindHostReturnValue({ErrorCodes::InternalError, "can't target"}); - auto status = catalog()->unlock(OID()); + auto status = catalog()->unlock(txn(), OID()); ASSERT_NOT_OK(status); } TEST_F(DistLockCatalogFixture, UnlockRunCmdError) { shutdownShardRegistry(); - auto status = catalog()->unlock(OID()); + auto status = catalog()->unlock(txn(), OID()); ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, status.code()); ASSERT_FALSE(status.reason().empty()); } TEST_F(DistLockCatalogFixture, UnlockCommandError) { auto future = launchAsync([this] { - auto status = catalog()->unlock(OID()); + auto status = catalog()->unlock(txn(), OID()); ASSERT_EQUALS(ErrorCodes::FailedToParse, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -939,7 +956,7 @@ TEST_F(DistLockCatalogFixture, UnlockCommandError) { TEST_F(DistLockCatalogFixture, UnlockWriteError) { auto future = launchAsync([this] { - auto status = catalog()->unlock(OID()); + auto status = catalog()->unlock(txn(), OID()); ASSERT_EQUALS(ErrorCodes::Unauthorized, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -957,7 +974,7 @@ TEST_F(DistLockCatalogFixture, UnlockWriteError) { TEST_F(DistLockCatalogFixture, UnlockWriteConcernError) { auto future = launchAsync([this] { - auto status = catalog()->unlock(OID()); + auto status = catalog()->unlock(txn(), OID()); ASSERT_EQUALS(ErrorCodes::WriteConcernFailed, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -978,7 +995,7 @@ TEST_F(DistLockCatalogFixture, UnlockWriteConcernError) { TEST_F(DistLockCatalogFixture, UnlockUnsupportedWriteConcernResponse) { auto future = launchAsync([this] { - auto status = catalog()->unlock(OID()); + auto status = catalog()->unlock(txn(), OID()); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -1000,7 +1017,7 @@ TEST_F(DistLockCatalogFixture, UnlockUnsupportedWriteConcernResponse) { TEST_F(DistLockCatalogFixture, UnlockUnsupportedResponseFormat) { auto future = launchAsync([this] { - auto status = catalog()->unlock(OID()); + auto status = catalog()->unlock(txn(), OID()); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); }); @@ -1016,7 +1033,7 @@ TEST_F(DistLockCatalogFixture, BasicGetServerInfo) { auto future = launchAsync([this] { Date_t localTime(dateFromISOString("2015-05-26T13:06:27.293Z").getValue()); OID electionID("555fa85d4d8640862a0fc79b"); - auto resultStatus = catalog()->getServerInfo(); + auto resultStatus = catalog()->getServerInfo(txn()); ASSERT_OK(resultStatus.getStatus()); const auto& serverInfo = resultStatus.getValue(); @@ -1043,21 +1060,21 @@ TEST_F(DistLockCatalogFixture, BasicGetServerInfo) { TEST_F(DistLockCatalogFixture, GetServerTargetError) { targeter()->setFindHostReturnValue({ErrorCodes::InternalError, "can't target"}); - auto status = catalog()->getServerInfo().getStatus(); + auto status = catalog()->getServerInfo(txn()).getStatus(); ASSERT_NOT_OK(status); } TEST_F(DistLockCatalogFixture, GetServerRunCmdError) { shutdownShardRegistry(); - auto status = catalog()->getServerInfo().getStatus(); + auto status = catalog()->getServerInfo(txn()).getStatus(); ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, status.code()); ASSERT_FALSE(status.reason().empty()); } TEST_F(DistLockCatalogFixture, GetServerCommandError) { auto future = launchAsync([this] { - auto status = catalog()->getServerInfo().getStatus(); + auto status = catalog()->getServerInfo(txn()).getStatus(); ASSERT_EQUALS(ErrorCodes::FailedToParse, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -1075,7 +1092,7 @@ TEST_F(DistLockCatalogFixture, GetServerCommandError) { TEST_F(DistLockCatalogFixture, GetServerBadElectionId) { auto future = launchAsync([this] { - auto status = catalog()->getServerInfo().getStatus(); + auto status = catalog()->getServerInfo(txn()).getStatus(); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -1097,7 +1114,7 @@ TEST_F(DistLockCatalogFixture, GetServerBadElectionId) { TEST_F(DistLockCatalogFixture, GetServerBadLocalTime) { auto future = launchAsync([this] { - auto status = catalog()->getServerInfo().getStatus(); + auto status = catalog()->getServerInfo(txn()).getStatus(); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -1119,7 +1136,7 @@ TEST_F(DistLockCatalogFixture, GetServerBadLocalTime) { TEST_F(DistLockCatalogFixture, GetServerNoGLEStats) { auto future = launchAsync([this] { - auto status = catalog()->getServerInfo().getStatus(); + auto status = catalog()->getServerInfo(txn()).getStatus(); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -1136,7 +1153,7 @@ TEST_F(DistLockCatalogFixture, GetServerNoGLEStats) { TEST_F(DistLockCatalogFixture, GetServerNoElectionId) { auto future = launchAsync([this] { - auto status = catalog()->getServerInfo().getStatus(); + auto status = catalog()->getServerInfo(txn()).getStatus(); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -1157,7 +1174,7 @@ TEST_F(DistLockCatalogFixture, GetServerNoElectionId) { TEST_F(DistLockCatalogFixture, BasicStopPing) { auto future = launchAsync([this] { - auto status = catalog()->stopPing("test"); + auto status = catalog()->stopPing(txn(), "test"); ASSERT_OK(status); }); @@ -1188,21 +1205,21 @@ TEST_F(DistLockCatalogFixture, BasicStopPing) { TEST_F(DistLockCatalogFixture, StopPingTargetError) { targeter()->setFindHostReturnValue({ErrorCodes::InternalError, "can't target"}); - auto status = catalog()->stopPing(""); + auto status = catalog()->stopPing(txn(), ""); ASSERT_NOT_OK(status); } TEST_F(DistLockCatalogFixture, StopPingRunCmdError) { shutdownShardRegistry(); - auto status = catalog()->stopPing(""); + auto status = catalog()->stopPing(txn(), ""); ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, status.code()); ASSERT_FALSE(status.reason().empty()); } TEST_F(DistLockCatalogFixture, StopPingCommandError) { auto future = launchAsync([this] { - auto status = catalog()->stopPing(""); + auto status = catalog()->stopPing(txn(), ""); ASSERT_EQUALS(ErrorCodes::FailedToParse, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -1220,7 +1237,7 @@ TEST_F(DistLockCatalogFixture, StopPingCommandError) { TEST_F(DistLockCatalogFixture, StopPingWriteError) { auto future = launchAsync([this] { - auto status = catalog()->stopPing(""); + auto status = catalog()->stopPing(txn(), ""); ASSERT_EQUALS(ErrorCodes::Unauthorized, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -1238,7 +1255,7 @@ TEST_F(DistLockCatalogFixture, StopPingWriteError) { TEST_F(DistLockCatalogFixture, StopPingWriteConcernError) { auto future = launchAsync([this] { - auto status = catalog()->stopPing(""); + auto status = catalog()->stopPing(txn(), ""); ASSERT_EQUALS(ErrorCodes::WriteConcernFailed, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -1259,7 +1276,7 @@ TEST_F(DistLockCatalogFixture, StopPingWriteConcernError) { TEST_F(DistLockCatalogFixture, StopPingUnsupportedWriteConcernResponse) { auto future = launchAsync([this] { - auto status = catalog()->stopPing(""); + auto status = catalog()->stopPing(txn(), ""); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -1281,7 +1298,7 @@ TEST_F(DistLockCatalogFixture, StopPingUnsupportedWriteConcernResponse) { TEST_F(DistLockCatalogFixture, StopPingUnsupportedResponseFormat) { auto future = launchAsync([this] { - auto status = catalog()->stopPing(""); + auto status = catalog()->stopPing(txn(), ""); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); }); @@ -1296,7 +1313,7 @@ TEST_F(DistLockCatalogFixture, StopPingUnsupportedResponseFormat) { TEST_F(DistLockCatalogFixture, BasicGetPing) { auto future = launchAsync([this] { Date_t ping(dateFromISOString("2015-05-26T13:06:27.293Z").getValue()); - auto resultStatus = catalog()->getPing("test"); + auto resultStatus = catalog()->getPing(txn(), "test"); ASSERT_OK(resultStatus.getStatus()); const auto& pingDoc = resultStatus.getValue(); @@ -1333,21 +1350,21 @@ TEST_F(DistLockCatalogFixture, BasicGetPing) { TEST_F(DistLockCatalogFixture, GetPingTargetError) { targeter()->setFindHostReturnValue({ErrorCodes::InternalError, "can't target"}); - auto status = catalog()->getPing("").getStatus(); + auto status = catalog()->getPing(txn(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::InternalError, status.code()); } TEST_F(DistLockCatalogFixture, GetPingRunCmdError) { shutdownShardRegistry(); - auto status = catalog()->getPing("").getStatus(); + auto status = catalog()->getPing(txn(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, status.code()); ASSERT_FALSE(status.reason().empty()); } TEST_F(DistLockCatalogFixture, GetPingNotFound) { auto future = launchAsync([this] { - auto status = catalog()->getPing("").getStatus(); + auto status = catalog()->getPing(txn(), "").getStatus(); ASSERT_EQUALS(ErrorCodes::NoMatchingDocument, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -1360,7 +1377,7 @@ TEST_F(DistLockCatalogFixture, GetPingNotFound) { TEST_F(DistLockCatalogFixture, GetPingUnsupportedFormat) { auto future = launchAsync([this] { - auto status = catalog()->getPing("test").getStatus(); + auto status = catalog()->getPing(txn(), "test").getStatus(); ASSERT_EQUALS(ErrorCodes::FailedToParse, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -1384,7 +1401,7 @@ TEST_F(DistLockCatalogFixture, GetPingUnsupportedFormat) { TEST_F(DistLockCatalogFixture, BasicGetLockByTS) { auto future = launchAsync([this] { OID ts("555f99712c99a78c5b083358"); - auto resultStatus = catalog()->getLockByTS(ts); + auto resultStatus = catalog()->getLockByTS(txn(), ts); ASSERT_OK(resultStatus.getStatus()); const auto& lockDoc = resultStatus.getValue(); @@ -1418,20 +1435,20 @@ TEST_F(DistLockCatalogFixture, BasicGetLockByTS) { TEST_F(DistLockCatalogFixture, GetLockByTSTargetError) { targeter()->setFindHostReturnValue({ErrorCodes::InternalError, "can't target"}); - auto status = catalog()->getLockByTS(OID()).getStatus(); + auto status = catalog()->getLockByTS(txn(), OID()).getStatus(); ASSERT_EQUALS(ErrorCodes::InternalError, status.code()); } TEST_F(DistLockCatalogFixture, GetLockByTSRunCmdError) { shutdownShardRegistry(); - auto status = catalog()->getLockByTS(OID()).getStatus(); + auto status = catalog()->getLockByTS(txn(), OID()).getStatus(); ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, status.code()); ASSERT_FALSE(status.reason().empty()); } TEST_F(DistLockCatalogFixture, GetLockByTSNotFound) { auto future = launchAsync([this] { - auto status = catalog()->getLockByTS(OID()).getStatus(); + auto status = catalog()->getLockByTS(txn(), OID()).getStatus(); ASSERT_EQUALS(ErrorCodes::LockNotFound, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -1444,7 +1461,7 @@ TEST_F(DistLockCatalogFixture, GetLockByTSNotFound) { TEST_F(DistLockCatalogFixture, GetLockByTSUnsupportedFormat) { auto future = launchAsync([this] { - auto status = catalog()->getLockByTS(OID()).getStatus(); + auto status = catalog()->getLockByTS(txn(), OID()).getStatus(); ASSERT_EQUALS(ErrorCodes::FailedToParse, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -1468,7 +1485,7 @@ TEST_F(DistLockCatalogFixture, GetLockByTSUnsupportedFormat) { TEST_F(DistLockCatalogFixture, BasicGetLockByName) { auto future = launchAsync([this] { OID ts("555f99712c99a78c5b083358"); - auto resultStatus = catalog()->getLockByName("abc"); + auto resultStatus = catalog()->getLockByName(txn(), "abc"); ASSERT_OK(resultStatus.getStatus()); const auto& lockDoc = resultStatus.getValue(); @@ -1505,21 +1522,21 @@ TEST_F(DistLockCatalogFixture, BasicGetLockByName) { TEST_F(DistLockCatalogFixture, GetLockByNameTargetError) { targeter()->setFindHostReturnValue({ErrorCodes::InternalError, "can't target"}); - auto status = catalog()->getLockByName("x").getStatus(); + auto status = catalog()->getLockByName(txn(), "x").getStatus(); ASSERT_EQUALS(ErrorCodes::InternalError, status.code()); } TEST_F(DistLockCatalogFixture, GetLockByNameRunCmdError) { shutdownShardRegistry(); - auto status = catalog()->getLockByName("x").getStatus(); + auto status = catalog()->getLockByName(txn(), "x").getStatus(); ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, status.code()); ASSERT_FALSE(status.reason().empty()); } TEST_F(DistLockCatalogFixture, GetLockByNameNotFound) { auto future = launchAsync([this] { - auto status = catalog()->getLockByName("x").getStatus(); + auto status = catalog()->getLockByName(txn(), "x").getStatus(); ASSERT_EQUALS(ErrorCodes::LockNotFound, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -1532,7 +1549,7 @@ TEST_F(DistLockCatalogFixture, GetLockByNameNotFound) { TEST_F(DistLockCatalogFixture, GetLockByNameUnsupportedFormat) { auto future = launchAsync([this] { - auto status = catalog()->getLockByName("x").getStatus(); + auto status = catalog()->getLockByName(txn(), "x").getStatus(); ASSERT_EQUALS(ErrorCodes::FailedToParse, status.code()); ASSERT_FALSE(status.reason().empty()); }); diff --git a/src/mongo/s/catalog/dist_lock_catalog_mock.cpp b/src/mongo/s/catalog/dist_lock_catalog_mock.cpp index f689a71fc36..03b5b0e85f6 100644 --- a/src/mongo/s/catalog/dist_lock_catalog_mock.cpp +++ b/src/mongo/s/catalog/dist_lock_catalog_mock.cpp @@ -125,7 +125,8 @@ DistLockCatalogMock::DistLockCatalogMock() DistLockCatalogMock::~DistLockCatalogMock() {} -StatusWith<LockpingsType> DistLockCatalogMock::getPing(StringData processID) { +StatusWith<LockpingsType> DistLockCatalogMock::getPing(OperationContext* txn, + StringData processID) { auto ret = kLockpingsTypeBadRetValue; GetPingFunc checkerFunc = noGetPingSet; @@ -139,7 +140,7 @@ StatusWith<LockpingsType> DistLockCatalogMock::getPing(StringData processID) { return ret; } -Status DistLockCatalogMock::ping(StringData processID, Date_t ping) { +Status DistLockCatalogMock::ping(OperationContext* txn, StringData processID, Date_t ping) { auto ret = kBadRetValue; PingFunc checkerFunc = noPingFuncSet; @@ -153,7 +154,8 @@ Status DistLockCatalogMock::ping(StringData processID, Date_t ping) { return ret; } -StatusWith<LocksType> DistLockCatalogMock::grabLock(StringData lockID, +StatusWith<LocksType> DistLockCatalogMock::grabLock(OperationContext* txn, + StringData lockID, const OID& lockSessionID, StringData who, StringData processId, @@ -172,7 +174,8 @@ StatusWith<LocksType> DistLockCatalogMock::grabLock(StringData lockID, return ret; } -StatusWith<LocksType> DistLockCatalogMock::overtakeLock(StringData lockID, +StatusWith<LocksType> DistLockCatalogMock::overtakeLock(OperationContext* txn, + StringData lockID, const OID& lockSessionID, const OID& currentHolderTS, StringData who, @@ -192,7 +195,7 @@ StatusWith<LocksType> DistLockCatalogMock::overtakeLock(StringData lockID, return ret; } -Status DistLockCatalogMock::unlock(const OID& lockSessionID) { +Status DistLockCatalogMock::unlock(OperationContext* txn, const OID& lockSessionID) { auto ret = kBadRetValue; UnlockFunc checkerFunc = noUnLockFuncSet; @@ -206,7 +209,7 @@ Status DistLockCatalogMock::unlock(const OID& lockSessionID) { return ret; } -StatusWith<DistLockCatalog::ServerInfo> DistLockCatalogMock::getServerInfo() { +StatusWith<DistLockCatalog::ServerInfo> DistLockCatalogMock::getServerInfo(OperationContext* txn) { auto ret = kServerInfoBadRetValue; GetServerInfoFunc checkerFunc = noGetServerInfoSet; @@ -220,7 +223,8 @@ StatusWith<DistLockCatalog::ServerInfo> DistLockCatalogMock::getServerInfo() { return ret; } -StatusWith<LocksType> DistLockCatalogMock::getLockByTS(const OID& lockSessionID) { +StatusWith<LocksType> DistLockCatalogMock::getLockByTS(OperationContext* txn, + const OID& lockSessionID) { auto ret = kLocksTypeBadRetValue; GetLockByTSFunc checkerFunc = noGetLockByTSSet; @@ -234,7 +238,7 @@ StatusWith<LocksType> DistLockCatalogMock::getLockByTS(const OID& lockSessionID) return ret; } -StatusWith<LocksType> DistLockCatalogMock::getLockByName(StringData name) { +StatusWith<LocksType> DistLockCatalogMock::getLockByName(OperationContext* txn, StringData name) { auto ret = kLocksTypeBadRetValue; GetLockByNameFunc checkerFunc = noGetLockByNameSet; @@ -248,7 +252,7 @@ StatusWith<LocksType> DistLockCatalogMock::getLockByName(StringData name) { return ret; } -Status DistLockCatalogMock::stopPing(StringData processId) { +Status DistLockCatalogMock::stopPing(OperationContext* txn, StringData processId) { auto ret = kBadRetValue; StopPingFunc checkerFunc = noStopPingFuncSet; diff --git a/src/mongo/s/catalog/dist_lock_catalog_mock.h b/src/mongo/s/catalog/dist_lock_catalog_mock.h index 2a1aa449a31..4a3e4af38d3 100644 --- a/src/mongo/s/catalog/dist_lock_catalog_mock.h +++ b/src/mongo/s/catalog/dist_lock_catalog_mock.h @@ -89,18 +89,20 @@ public: using GetLockByNameFunc = stdx::function<void(StringData name)>; using GetServerInfoFunc = stdx::function<void()>; - virtual StatusWith<LockpingsType> getPing(StringData processID) override; + virtual StatusWith<LockpingsType> getPing(OperationContext* txn, StringData processID) override; - virtual Status ping(StringData processID, Date_t ping) override; + virtual Status ping(OperationContext* txn, StringData processID, Date_t ping) override; - virtual StatusWith<LocksType> grabLock(StringData lockID, + virtual StatusWith<LocksType> grabLock(OperationContext* txn, + StringData lockID, const OID& lockSessionID, StringData who, StringData processId, Date_t time, StringData why) override; - virtual StatusWith<LocksType> overtakeLock(StringData lockID, + virtual StatusWith<LocksType> overtakeLock(OperationContext* txn, + StringData lockID, const OID& lockSessionID, const OID& currentHolderTS, StringData who, @@ -108,15 +110,16 @@ public: Date_t time, StringData why) override; - virtual Status unlock(const OID& lockSessionID) override; + virtual Status unlock(OperationContext* txn, const OID& lockSessionID) override; - virtual StatusWith<ServerInfo> getServerInfo() override; + virtual StatusWith<ServerInfo> getServerInfo(OperationContext* txn) override; - virtual StatusWith<LocksType> getLockByTS(const OID& lockSessionID) override; + virtual StatusWith<LocksType> getLockByTS(OperationContext* txn, + const OID& lockSessionID) override; - virtual StatusWith<LocksType> getLockByName(StringData name) override; + virtual StatusWith<LocksType> getLockByName(OperationContext* txn, StringData name) override; - virtual Status stopPing(StringData processId) override; + virtual Status stopPing(OperationContext* txn, StringData processId) override; /** * Sets the checker method to use and the return value for grabLock to return every diff --git a/src/mongo/s/catalog/dist_lock_manager.cpp b/src/mongo/s/catalog/dist_lock_manager.cpp index 9662bbff3af..d45765bd9aa 100644 --- a/src/mongo/s/catalog/dist_lock_manager.cpp +++ b/src/mongo/s/catalog/dist_lock_manager.cpp @@ -39,26 +39,29 @@ namespace mongo { const stdx::chrono::milliseconds DistLockManager::kDefaultSingleLockAttemptTimeout(0); const stdx::chrono::milliseconds DistLockManager::kDefaultLockRetryInterval(1000); -DistLockManager::ScopedDistLock::ScopedDistLock(DistLockHandle lockHandle, +DistLockManager::ScopedDistLock::ScopedDistLock(OperationContext* txn, + DistLockHandle lockHandle, DistLockManager* lockManager) - : _lockID(std::move(lockHandle)), _lockManager(lockManager) {} + : _txn(txn), _lockID(std::move(lockHandle)), _lockManager(lockManager) {} DistLockManager::ScopedDistLock::~ScopedDistLock() { if (_lockManager) { - _lockManager->unlock(_lockID); + _lockManager->unlock(_txn, _lockID); } } -DistLockManager::ScopedDistLock::ScopedDistLock(ScopedDistLock&& other) : _lockManager(nullptr) { +DistLockManager::ScopedDistLock::ScopedDistLock(ScopedDistLock&& other) + : _txn(nullptr), _lockManager(nullptr) { *this = std::move(other); } DistLockManager::ScopedDistLock& DistLockManager::ScopedDistLock::operator=( ScopedDistLock&& other) { if (this != &other) { - if (_lockManager) { - _lockManager->unlock(_lockID); - } + invariant(_lockManager == nullptr); + invariant(_txn == nullptr); + + _txn = other._txn; _lockID = std::move(other._lockID); _lockManager = other._lockManager; other._lockManager = nullptr; @@ -72,6 +75,6 @@ Status DistLockManager::ScopedDistLock::checkStatus() { return Status(ErrorCodes::IllegalOperation, "no lock manager, lock was not acquired"); } - return _lockManager->checkStatus(_lockID); + return _lockManager->checkStatus(_txn, _lockID); } } diff --git a/src/mongo/s/catalog/dist_lock_manager.h b/src/mongo/s/catalog/dist_lock_manager.h index 973c33aa782..15bdbdc2787 100644 --- a/src/mongo/s/catalog/dist_lock_manager.h +++ b/src/mongo/s/catalog/dist_lock_manager.h @@ -35,6 +35,7 @@ namespace mongo { using DistLockHandle = OID; +class OperationContext; class Status; template <typename T> class StatusWith; @@ -70,7 +71,9 @@ public: MONGO_DISALLOW_COPYING(ScopedDistLock); public: - ScopedDistLock(DistLockHandle lockHandle, DistLockManager* lockManager); + ScopedDistLock(OperationContext* txn, + DistLockHandle lockHandle, + DistLockManager* lockManager); ~ScopedDistLock(); ScopedDistLock(ScopedDistLock&& other); @@ -82,6 +85,7 @@ public: Status checkStatus(); private: + OperationContext* _txn; DistLockHandle _lockID; DistLockManager* _lockManager; // Not owned here. }; @@ -99,7 +103,7 @@ public: * involves sending network messages. Implementation do not need to guarantee thread safety * so callers should employ proper synchronization when calling this method. */ - virtual void shutDown(bool allowNetworking) = 0; + virtual void shutDown(OperationContext* txn, bool allowNetworking) = 0; /** * Tries multiple times to lock, using the specified lock try interval, until @@ -115,6 +119,7 @@ public: * Returns ErrorCodes::LockBusy if the lock is being held. */ virtual StatusWith<ScopedDistLock> lock( + OperationContext* txn, StringData name, StringData whyMessage, stdx::chrono::milliseconds waitFor = kDefaultSingleLockAttemptTimeout, @@ -125,11 +130,11 @@ protected: * Unlocks the given lockHandle. Will attempt to retry again later if the config * server is not reachable. */ - virtual void unlock(const DistLockHandle& lockHandle) = 0; + virtual void unlock(OperationContext* txn, const DistLockHandle& lockHandle) = 0; /** * Checks if the lockHandle still exists in the config server. */ - virtual Status checkStatus(const DistLockHandle& lockHandle) = 0; + virtual Status checkStatus(OperationContext* txn, const DistLockHandle& lockHandle) = 0; }; } diff --git a/src/mongo/s/catalog/dist_lock_manager_mock.cpp b/src/mongo/s/catalog/dist_lock_manager_mock.cpp index 28dcbd5fa67..5afcfface61 100644 --- a/src/mongo/s/catalog/dist_lock_manager_mock.cpp +++ b/src/mongo/s/catalog/dist_lock_manager_mock.cpp @@ -59,12 +59,16 @@ DistLockManagerMock::DistLockManagerMock() void DistLockManagerMock::startUp() {} -void DistLockManagerMock::shutDown(bool allowNetworking) { +void DistLockManagerMock::shutDown(OperationContext* txn, bool allowNetworking) { uassert(28659, "DistLockManagerMock shut down with outstanding locks present", _locks.empty()); } StatusWith<DistLockManager::ScopedDistLock> DistLockManagerMock::lock( - StringData name, StringData whyMessage, milliseconds waitFor, milliseconds lockTryInterval) { + OperationContext* txn, + StringData name, + StringData whyMessage, + milliseconds waitFor, + milliseconds lockTryInterval) { _lockChecker(name, whyMessage, waitFor, lockTryInterval); _lockChecker = NoLockFuncSet; @@ -84,10 +88,10 @@ StatusWith<DistLockManager::ScopedDistLock> DistLockManagerMock::lock( info.lockID = DistLockHandle::gen(); _locks.push_back(info); - return DistLockManager::ScopedDistLock(info.lockID, this); + return DistLockManager::ScopedDistLock(nullptr, info.lockID, this); } -void DistLockManagerMock::unlock(const DistLockHandle& lockHandle) { +void DistLockManagerMock::unlock(OperationContext* txn, const DistLockHandle& lockHandle) { std::vector<LockInfo>::iterator it = std::find_if(_locks.begin(), _locks.end(), @@ -98,7 +102,7 @@ void DistLockManagerMock::unlock(const DistLockHandle& lockHandle) { _locks.erase(it); } -Status DistLockManagerMock::checkStatus(const DistLockHandle& lockHandle) { +Status DistLockManagerMock::checkStatus(OperationContext* txn, const DistLockHandle& lockHandle) { return Status::OK(); } diff --git a/src/mongo/s/catalog/dist_lock_manager_mock.h b/src/mongo/s/catalog/dist_lock_manager_mock.h index fa3f05357c2..c7572738586 100644 --- a/src/mongo/s/catalog/dist_lock_manager_mock.h +++ b/src/mongo/s/catalog/dist_lock_manager_mock.h @@ -43,9 +43,10 @@ public: virtual ~DistLockManagerMock() = default; virtual void startUp() override; - virtual void shutDown(bool allowNetworking) override; + virtual void shutDown(OperationContext* txn, bool allowNetworking) override; virtual StatusWith<DistLockManager::ScopedDistLock> lock( + OperationContext* txn, StringData name, StringData whyMessage, stdx::chrono::milliseconds waitFor, @@ -59,9 +60,9 @@ public: void expectLock(LockFunc checkerFunc, Status lockStatus); protected: - virtual void unlock(const DistLockHandle& lockHandle) override; + virtual void unlock(OperationContext* txn, const DistLockHandle& lockHandle) override; - virtual Status checkStatus(const DistLockHandle& lockHandle) override; + virtual Status checkStatus(OperationContext* txn, const DistLockHandle& lockHandle) override; private: struct LockInfo { diff --git a/src/mongo/s/catalog/forwarding_catalog_manager.cpp b/src/mongo/s/catalog/forwarding_catalog_manager.cpp index b070b688743..eba31b8fa88 100644 --- a/src/mongo/s/catalog/forwarding_catalog_manager.cpp +++ b/src/mongo/s/catalog/forwarding_catalog_manager.cpp @@ -132,8 +132,8 @@ StatusWith<ForwardingCatalogManager::ScopedDistLock> ForwardingCatalogManager::d try { _operationLock.lock_shared(); auto guard = MakeGuard([this] { _operationLock.unlock_shared(); }); - auto dlmLock = - _actual->getDistLockManager()->lock(name, whyMessage, waitFor, lockTryInterval); + auto dlmLock = _actual->getDistLockManager()->lock( + txn, name, whyMessage, waitFor, lockTryInterval); if (dlmLock.isOK()) { guard.Dismiss(); // Don't unlock _operationLock; hold it until the returned // ScopedDistLock goes out of scope! diff --git a/src/mongo/s/catalog/legacy/catalog_manager_legacy.cpp b/src/mongo/s/catalog/legacy/catalog_manager_legacy.cpp index 74b72e22f95..7dc5d88cee7 100644 --- a/src/mongo/s/catalog/legacy/catalog_manager_legacy.cpp +++ b/src/mongo/s/catalog/legacy/catalog_manager_legacy.cpp @@ -262,7 +262,7 @@ void CatalogManagerLegacy::shutDown(OperationContext* txn, bool allowNetworking) _consistencyCheckerThread.join(); invariant(_distLockManager); - _distLockManager->shutDown(allowNetworking); + _distLockManager->shutDown(txn, allowNetworking); } Status CatalogManagerLegacy::shardCollection(OperationContext* txn, @@ -273,7 +273,7 @@ Status CatalogManagerLegacy::shardCollection(OperationContext* txn, const set<ShardId>& initShardIds) { // Lock the collection globally so that no other mongos can try to shard or drop the collection // at the same time. - auto scopedDistLock = getDistLockManager()->lock(ns, "shardCollection"); + auto scopedDistLock = getDistLockManager()->lock(txn, ns, "shardCollection"); if (!scopedDistLock.isOK()) { return scopedDistLock.getStatus(); } @@ -564,7 +564,8 @@ Status CatalogManagerLegacy::dropCollection(OperationContext* txn, const Namespa waitFor = stdx::chrono::seconds(data["waitForSecs"].numberInt()); } const stdx::chrono::milliseconds lockTryInterval(500); - auto scopedDistLock = getDistLockManager()->lock(ns.ns(), "drop", waitFor, lockTryInterval); + auto scopedDistLock = + getDistLockManager()->lock(txn, ns.ns(), "drop", waitFor, lockTryInterval); if (!scopedDistLock.isOK()) { return scopedDistLock.getStatus(); } @@ -968,7 +969,8 @@ bool CatalogManagerLegacy::runUserManagementWriteCommand(OperationContext* txn, dispatcher.addCommand(configServer, dbname, cmdObj); } - auto scopedDistLock = getDistLockManager()->lock("authorizationData", commandName, Seconds{5}); + auto scopedDistLock = + getDistLockManager()->lock(txn, "authorizationData", commandName, Seconds{5}); if (!scopedDistLock.isOK()) { return Command::appendCommandStatus(*result, scopedDistLock.getStatus()); } diff --git a/src/mongo/s/catalog/legacy/config_upgrade.cpp b/src/mongo/s/catalog/legacy/config_upgrade.cpp index f49043b6262..bddbdecb84b 100644 --- a/src/mongo/s/catalog/legacy/config_upgrade.cpp +++ b/src/mongo/s/catalog/legacy/config_upgrade.cpp @@ -297,7 +297,7 @@ Status checkAndInitConfigVersion(OperationContext* txn, string whyMessage(stream() << "initializing config database to new format v" << CURRENT_CONFIG_VERSION); auto lockTimeout = stdx::chrono::minutes(20); - auto scopedDistLock = distLockManager->lock("configUpgrade", whyMessage, lockTimeout); + auto scopedDistLock = distLockManager->lock(txn, "configUpgrade", whyMessage, lockTimeout); if (!scopedDistLock.isOK()) { return scopedDistLock.getStatus(); } diff --git a/src/mongo/s/catalog/legacy/legacy_dist_lock_manager.cpp b/src/mongo/s/catalog/legacy/legacy_dist_lock_manager.cpp index b7824d66d47..0651cdd4ca5 100644 --- a/src/mongo/s/catalog/legacy/legacy_dist_lock_manager.cpp +++ b/src/mongo/s/catalog/legacy/legacy_dist_lock_manager.cpp @@ -58,7 +58,7 @@ void LegacyDistLockManager::startUp() { _pinger = stdx::make_unique<LegacyDistLockPinger>(); } -void LegacyDistLockManager::shutDown(bool allowNetworking) { +void LegacyDistLockManager::shutDown(OperationContext* txn, bool allowNetworking) { stdx::unique_lock<stdx::mutex> sl(_mutex); _isStopped = true; @@ -72,7 +72,11 @@ void LegacyDistLockManager::shutDown(bool allowNetworking) { } StatusWith<DistLockManager::ScopedDistLock> LegacyDistLockManager::lock( - StringData name, StringData whyMessage, milliseconds waitFor, milliseconds lockTryInterval) { + OperationContext* txn, + StringData name, + StringData whyMessage, + milliseconds waitFor, + milliseconds lockTryInterval) { auto distLock = stdx::make_unique<DistributedLock>(_configServer, name.toString()); { @@ -135,7 +139,7 @@ StatusWith<DistLockManager::ScopedDistLock> LegacyDistLockManager::lock( _lockMap.insert(std::make_pair(lock.getLockID(), std::move(distLock))); } - return ScopedDistLock(lock.getLockID(), this); + return ScopedDistLock(txn, lock.getLockID(), this); } if (waitFor == milliseconds::zero()) @@ -161,7 +165,8 @@ StatusWith<DistLockManager::ScopedDistLock> LegacyDistLockManager::lock( return lastStatus; } -void LegacyDistLockManager::unlock(const DistLockHandle& lockHandle) BOOST_NOEXCEPT { +void LegacyDistLockManager::unlock(OperationContext* txn, + const DistLockHandle& lockHandle) BOOST_NOEXCEPT { unique_ptr<DistributedLock> distLock; { @@ -185,7 +190,7 @@ void LegacyDistLockManager::unlock(const DistLockHandle& lockHandle) BOOST_NOEXC } } -Status LegacyDistLockManager::checkStatus(const DistLockHandle& lockHandle) { +Status LegacyDistLockManager::checkStatus(OperationContext* txn, const DistLockHandle& lockHandle) { // Note: this should not happen when locks are managed through ScopedDistLock. if (_pinger->willUnlockOID(lockHandle)) { return Status(ErrorCodes::LockFailed, diff --git a/src/mongo/s/catalog/legacy/legacy_dist_lock_manager.h b/src/mongo/s/catalog/legacy/legacy_dist_lock_manager.h index 8267dd44602..85bc42bc042 100644 --- a/src/mongo/s/catalog/legacy/legacy_dist_lock_manager.h +++ b/src/mongo/s/catalog/legacy/legacy_dist_lock_manager.h @@ -50,9 +50,10 @@ public: virtual ~LegacyDistLockManager() = default; virtual void startUp() override; - virtual void shutDown(bool allowNetworking) override; + virtual void shutDown(OperationContext* txn, bool allowNetworking) override; virtual StatusWith<DistLockManager::ScopedDistLock> lock( + OperationContext* txn, StringData name, StringData whyMessage, stdx::chrono::milliseconds waitFor, @@ -62,9 +63,10 @@ public: void enablePinger(bool enable); protected: - virtual void unlock(const DistLockHandle& lockHandle) BOOST_NOEXCEPT override; + virtual void unlock(OperationContext* txn, + const DistLockHandle& lockHandle) BOOST_NOEXCEPT override; - virtual Status checkStatus(const DistLockHandle& lockHandle) override; + virtual Status checkStatus(OperationContext* txn, const DistLockHandle& lockHandle) override; private: const ConnectionString _configServer; diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp index e4e323316d7..5a7664476ee 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp @@ -128,7 +128,7 @@ void CatalogManagerReplicaSet::shutDown(OperationContext* txn, bool allowNetwork } invariant(_distLockManager); - _distLockManager->shutDown(allowNetworking); + _distLockManager->shutDown(txn, allowNetworking); } Status CatalogManagerReplicaSet::shardCollection(OperationContext* txn, @@ -139,7 +139,7 @@ Status CatalogManagerReplicaSet::shardCollection(OperationContext* txn, const set<ShardId>& initShardIds) { // Lock the collection globally so that no other mongos can try to shard or drop the collection // at the same time. - auto scopedDistLock = getDistLockManager()->lock(ns, "shardCollection"); + auto scopedDistLock = getDistLockManager()->lock(txn, ns, "shardCollection"); if (!scopedDistLock.isOK()) { return scopedDistLock.getStatus(); } @@ -458,7 +458,8 @@ Status CatalogManagerReplicaSet::dropCollection(OperationContext* txn, const Nam waitFor = stdx::chrono::seconds(data["waitForSecs"].numberInt()); } const stdx::chrono::milliseconds lockTryInterval(500); - auto scopedDistLock = getDistLockManager()->lock(ns.ns(), "drop", waitFor, lockTryInterval); + auto scopedDistLock = + getDistLockManager()->lock(txn, ns.ns(), "drop", waitFor, lockTryInterval); if (!scopedDistLock.isOK()) { return scopedDistLock.getStatus(); } @@ -571,7 +572,7 @@ void CatalogManagerReplicaSet::logAction(OperationContext* txn, const ActionLogT BSONObj createCmd = BSON("create" << ActionLogType::ConfigNS << "capped" << true << "size" << kActionLogCollectionSize); auto result = - grid.shardRegistry()->runCommandOnConfigWithNotMasterRetries("config", createCmd); + grid.shardRegistry()->runCommandOnConfigWithNotMasterRetries(txn, "config", createCmd); if (!result.isOK()) { LOG(1) << "couldn't create actionlog collection: " << causedBy(result.getStatus()); return; @@ -601,7 +602,7 @@ void CatalogManagerReplicaSet::logChange(OperationContext* txn, BSONObj createCmd = BSON("create" << ChangeLogType::ConfigNS << "capped" << true << "size" << kChangeLogCollectionSize); auto result = - grid.shardRegistry()->runCommandOnConfigWithNotMasterRetries("config", createCmd); + grid.shardRegistry()->runCommandOnConfigWithNotMasterRetries(txn, "config", createCmd); if (!result.isOK()) { LOG(1) << "couldn't create changelog collection: " << causedBy(result.getStatus()); return; @@ -822,12 +823,14 @@ bool CatalogManagerReplicaSet::runUserManagementWriteCommand(OperationContext* t const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) { - auto scopedDistLock = getDistLockManager()->lock("authorizationData", commandName, Seconds{5}); + auto scopedDistLock = + getDistLockManager()->lock(txn, "authorizationData", commandName, Seconds{5}); if (!scopedDistLock.isOK()) { return Command::appendCommandStatus(*result, scopedDistLock.getStatus()); } - auto response = grid.shardRegistry()->runCommandOnConfigWithNotMasterRetries(dbname, cmdObj); + auto response = + grid.shardRegistry()->runCommandOnConfigWithNotMasterRetries(txn, dbname, cmdObj); if (!response.isOK()) { return Command::appendCommandStatus(*result, response.getStatus()); } @@ -857,7 +860,8 @@ Status CatalogManagerReplicaSet::applyChunkOpsDeprecated(OperationContext* txn, const BSONArray& updateOps, const BSONArray& preCondition) { BSONObj cmd = BSON("applyOps" << updateOps << "preCondition" << preCondition); - auto response = grid.shardRegistry()->runCommandOnConfigWithNotMasterRetries("config", cmd); + auto response = + grid.shardRegistry()->runCommandOnConfigWithNotMasterRetries(txn, "config", cmd); if (!response.isOK()) { return response.getStatus(); @@ -885,7 +889,8 @@ void CatalogManagerReplicaSet::writeConfigServerDirect(OperationContext* txn, invariant(dbname == "config" || dbname == "admin"); const BSONObj cmdObj = batchRequest.toBSON(); - auto response = grid.shardRegistry()->runCommandOnConfigWithNotMasterRetries(dbname, cmdObj); + auto response = + grid.shardRegistry()->runCommandOnConfigWithNotMasterRetries(txn, dbname, cmdObj); if (!response.isOK()) { _toBatchError(response.getStatus(), batchResponse); return; @@ -1130,7 +1135,7 @@ StatusWith<OpTimePair<vector<BSONObj>>> CatalogManagerReplicaSet::_exhaustiveFin repl::ReadConcernLevel::kMajorityReadConcern}; auto result = grid.shardRegistry()->exhaustiveFindOnConfig( - kConfigReadSelector, nss, query, sort, limit, readConcern); + txn, kConfigReadSelector, nss, query, sort, limit, readConcern); if (ErrorCodes::isNetworkError(result.getStatus().code())) { lastStatus = result.getStatus(); @@ -1161,7 +1166,7 @@ bool CatalogManagerReplicaSet::_runReadCommand(OperationContext* txn, BSONObjBuilder* result) { Status lastStatus = Status::OK(); for (int retry = 0; retry < kMaxReadRetry; retry++) { - auto resultStatus = grid.shardRegistry()->runCommandOnConfig(settings, dbname, cmdObj); + auto resultStatus = grid.shardRegistry()->runCommandOnConfig(txn, settings, dbname, cmdObj); if (ErrorCodes::isNetworkError(resultStatus.getStatus().code())) { lastStatus = resultStatus.getStatus(); diff --git a/src/mongo/s/catalog/replset/replset_dist_lock_manager.cpp b/src/mongo/s/catalog/replset/replset_dist_lock_manager.cpp index 4085913ebd3..f7e8b59cddd 100644 --- a/src/mongo/s/catalog/replset/replset_dist_lock_manager.cpp +++ b/src/mongo/s/catalog/replset/replset_dist_lock_manager.cpp @@ -35,6 +35,7 @@ #include "mongo/base/status.h" #include "mongo/base/status_with.h" #include "mongo/db/service_context.h" +#include "mongo/db/operation_context_noop.h" #include "mongo/s/catalog/dist_lock_catalog.h" #include "mongo/s/catalog/type_lockpings.h" #include "mongo/s/catalog/type_locks.h" @@ -78,7 +79,7 @@ void ReplSetDistLockManager::startUp() { } } -void ReplSetDistLockManager::shutDown(bool allowNetworking) { +void ReplSetDistLockManager::shutDown(OperationContext* txn, bool allowNetworking) { invariant(allowNetworking); { stdx::lock_guard<stdx::mutex> lk(_mutex); @@ -93,7 +94,7 @@ void ReplSetDistLockManager::shutDown(bool allowNetworking) { _execThread.reset(); } - auto status = _catalog->stopPing(_processID); + auto status = _catalog->stopPing(txn, _processID); if (!status.isOK()) { warning() << "error encountered while cleaning up distributed ping entry for " << _processID << causedBy(status); @@ -110,40 +111,45 @@ void ReplSetDistLockManager::doTask() { << " (sleeping for " << _pingInterval << ")"; Timer elapsedSincelastPing(_serviceContext->getTickSource()); + Client::initThread("replSetDistLockPinger"); + while (!isShutDown()) { - auto pingStatus = _catalog->ping(_processID, Date_t::now()); + { + auto txn = cc().makeOperationContext(); + auto pingStatus = _catalog->ping(txn.get(), _processID, Date_t::now()); - if (!pingStatus.isOK()) { - warning() << "pinging failed for distributed lock pinger" << causedBy(pingStatus); - } + if (!pingStatus.isOK()) { + warning() << "pinging failed for distributed lock pinger" << causedBy(pingStatus); + } - const milliseconds elapsed(elapsedSincelastPing.millis()); - if (elapsed > 10 * _pingInterval) { - warning() << "Lock pinger for proc: " << _processID << " was inactive for " << elapsed - << " ms"; - } - elapsedSincelastPing.reset(); + const milliseconds elapsed(elapsedSincelastPing.millis()); + if (elapsed > 10 * _pingInterval) { + warning() << "Lock pinger for proc: " << _processID << " was inactive for " + << elapsed << " ms"; + } + elapsedSincelastPing.reset(); - std::deque<DistLockHandle> toUnlockBatch; - { - stdx::unique_lock<stdx::mutex> lk(_mutex); - toUnlockBatch.swap(_unlockList); - } + std::deque<DistLockHandle> toUnlockBatch; + { + stdx::unique_lock<stdx::mutex> lk(_mutex); + toUnlockBatch.swap(_unlockList); + } - for (const auto& toUnlock : toUnlockBatch) { - auto unlockStatus = _catalog->unlock(toUnlock); + for (const auto& toUnlock : toUnlockBatch) { + auto unlockStatus = _catalog->unlock(txn.get(), toUnlock); - if (!unlockStatus.isOK()) { - warning() << "Failed to unlock lock with " << LocksType::lockID() << ": " - << toUnlock << causedBy(unlockStatus); - queueUnlock(toUnlock); - } else { - LOG(0) << "distributed lock with " << LocksType::lockID() << ": " << toUnlock - << "' unlocked."; - } + if (!unlockStatus.isOK()) { + warning() << "Failed to unlock lock with " << LocksType::lockID() << ": " + << toUnlock << causedBy(unlockStatus); + queueUnlock(toUnlock); + } else { + LOG(0) << "distributed lock with " << LocksType::lockID() << ": " << toUnlock + << "' unlocked."; + } - if (isShutDown()) { - return; + if (isShutDown()) { + return; + } } } @@ -152,10 +158,11 @@ void ReplSetDistLockManager::doTask() { } } -StatusWith<bool> ReplSetDistLockManager::canOvertakeLock(LocksType lockDoc, +StatusWith<bool> ReplSetDistLockManager::canOvertakeLock(OperationContext* txn, + LocksType lockDoc, const milliseconds& lockExpiration) { const auto& processID = lockDoc.getProcess(); - auto pingStatus = _catalog->getPing(processID); + auto pingStatus = _catalog->getPing(txn, processID); Date_t pingValue; if (pingStatus.isOK()) { @@ -173,7 +180,7 @@ StatusWith<bool> ReplSetDistLockManager::canOvertakeLock(LocksType lockDoc, } // else use default pingValue if ping document does not exist. Timer timer(_serviceContext->getTickSource()); - auto serverInfoStatus = _catalog->getServerInfo(); + auto serverInfoStatus = _catalog->getServerInfo(txn); if (!serverInfoStatus.isOK()) { return serverInfoStatus.getStatus(); } @@ -245,7 +252,11 @@ StatusWith<bool> ReplSetDistLockManager::canOvertakeLock(LocksType lockDoc, } StatusWith<DistLockManager::ScopedDistLock> ReplSetDistLockManager::lock( - StringData name, StringData whyMessage, milliseconds waitFor, milliseconds lockTryInterval) { + OperationContext* txn, + StringData name, + StringData whyMessage, + milliseconds waitFor, + milliseconds lockTryInterval) { Timer timer(_serviceContext->getTickSource()); Timer msgTimer(_serviceContext->getTickSource()); @@ -264,8 +275,8 @@ StatusWith<DistLockManager::ScopedDistLock> ReplSetDistLockManager::lock( << " ms, process : " << _processID << " )" << " with lockSessionID: " << lockSessionID << ", why: " << whyMessage; - auto lockResult = - _catalog->grabLock(name, lockSessionID, who, _processID, Date_t::now(), whyMessage); + auto lockResult = _catalog->grabLock( + txn, name, lockSessionID, who, _processID, Date_t::now(), whyMessage); auto status = lockResult.getStatus(); @@ -273,7 +284,7 @@ StatusWith<DistLockManager::ScopedDistLock> ReplSetDistLockManager::lock( // Lock is acquired since findAndModify was able to successfully modify // the lock document. LOG(0) << "distributed lock '" << name << "' acquired, ts : " << lockSessionID; - return ScopedDistLock(lockSessionID, this); + return ScopedDistLock(txn, lockSessionID, this); } if (status != ErrorCodes::LockStateChangeFailed) { @@ -284,7 +295,7 @@ StatusWith<DistLockManager::ScopedDistLock> ReplSetDistLockManager::lock( } // Get info from current lock and check if we can overtake it. - auto getLockStatusResult = _catalog->getLockByName(name); + auto getLockStatusResult = _catalog->getLockByName(txn, name); const auto& getLockStatus = getLockStatusResult.getStatus(); if (!getLockStatusResult.isOK() && getLockStatus != ErrorCodes::LockNotFound) { @@ -295,14 +306,15 @@ StatusWith<DistLockManager::ScopedDistLock> ReplSetDistLockManager::lock( // found, use the normal grab lock path to acquire it. if (getLockStatusResult.isOK()) { auto currentLock = getLockStatusResult.getValue(); - auto canOvertakeResult = canOvertakeLock(currentLock, lockExpiration); + auto canOvertakeResult = canOvertakeLock(txn, currentLock, lockExpiration); if (!canOvertakeResult.isOK()) { return canOvertakeResult.getStatus(); } if (canOvertakeResult.getValue()) { - auto overtakeResult = _catalog->overtakeLock(name, + auto overtakeResult = _catalog->overtakeLock(txn, + name, lockSessionID, currentLock.getLockID(), who, @@ -318,7 +330,7 @@ StatusWith<DistLockManager::ScopedDistLock> ReplSetDistLockManager::lock( LOG(0) << "lock '" << name << "' successfully forced"; LOG(0) << "distributed lock '" << name << "' acquired, ts : " << lockSessionID; - return ScopedDistLock(lockSessionID, this); + return ScopedDistLock(txn, lockSessionID, this); } if (overtakeStatus != ErrorCodes::LockStateChangeFailed) { @@ -352,8 +364,8 @@ StatusWith<DistLockManager::ScopedDistLock> ReplSetDistLockManager::lock( return {ErrorCodes::LockBusy, str::stream() << "timed out waiting for " << name}; } -void ReplSetDistLockManager::unlock(const DistLockHandle& lockSessionID) { - auto unlockStatus = _catalog->unlock(lockSessionID); +void ReplSetDistLockManager::unlock(OperationContext* txn, const DistLockHandle& lockSessionID) { + auto unlockStatus = _catalog->unlock(txn, lockSessionID); if (!unlockStatus.isOK()) { queueUnlock(lockSessionID); @@ -363,8 +375,9 @@ void ReplSetDistLockManager::unlock(const DistLockHandle& lockSessionID) { } } -Status ReplSetDistLockManager::checkStatus(const DistLockHandle& lockHandle) { - return _catalog->getLockByTS(lockHandle).getStatus(); +Status ReplSetDistLockManager::checkStatus(OperationContext* txn, + const DistLockHandle& lockHandle) { + return _catalog->getLockByTS(txn, lockHandle).getStatus(); } void ReplSetDistLockManager::queueUnlock(const DistLockHandle& lockSessionID) { diff --git a/src/mongo/s/catalog/replset/replset_dist_lock_manager.h b/src/mongo/s/catalog/replset/replset_dist_lock_manager.h index 273eee5f278..5d3024d58dc 100644 --- a/src/mongo/s/catalog/replset/replset_dist_lock_manager.h +++ b/src/mongo/s/catalog/replset/replset_dist_lock_manager.h @@ -61,18 +61,19 @@ public: virtual ~ReplSetDistLockManager(); virtual void startUp() override; - virtual void shutDown(bool allowNetworking) override; + virtual void shutDown(OperationContext* txn, bool allowNetworking) override; virtual StatusWith<DistLockManager::ScopedDistLock> lock( + OperationContext* txn, StringData name, StringData whyMessage, stdx::chrono::milliseconds waitFor, stdx::chrono::milliseconds lockTryInterval) override; protected: - virtual void unlock(const DistLockHandle& lockSessionID) override; + virtual void unlock(OperationContext* txn, const DistLockHandle& lockSessionID) override; - virtual Status checkStatus(const DistLockHandle& lockSessionID) override; + virtual Status checkStatus(OperationContext* txn, const DistLockHandle& lockSessionID) override; private: /** @@ -94,7 +95,8 @@ private: * Returns true if the current process that owns the lock has no fresh pings since * the lock expiration threshold. */ - StatusWith<bool> canOvertakeLock(const LocksType lockDoc, + StatusWith<bool> canOvertakeLock(OperationContext* txn, + const LocksType lockDoc, const stdx::chrono::milliseconds& lockExpiration); // diff --git a/src/mongo/s/catalog/replset/replset_dist_lock_manager_test.cpp b/src/mongo/s/catalog/replset/replset_dist_lock_manager_test.cpp index 0b3a01c3ac3..9c940a06d07 100644 --- a/src/mongo/s/catalog/replset/replset_dist_lock_manager_test.cpp +++ b/src/mongo/s/catalog/replset/replset_dist_lock_manager_test.cpp @@ -40,6 +40,7 @@ #include "mongo/bson/json.h" #include "mongo/bson/util/builder.h" #include "mongo/db/jsobj.h" +#include "mongo/db/operation_context_noop.h" #include "mongo/db/service_context_noop.h" #include "mongo/s/catalog/dist_lock_catalog_mock.h" #include "mongo/s/catalog/type_lockpings.h" @@ -79,14 +80,20 @@ public: ReplSetDistLockManagerFixture() : _dummyDoNotUse(stdx::make_unique<DistLockCatalogMock>()), _mockCatalog(_dummyDoNotUse.get()), - _processID("test"), - _mgr(&_context, _processID, std::move(_dummyDoNotUse), kPingInterval, kLockExpiration) {} + _processID("test") { + setGlobalServiceContext(stdx::make_unique<ServiceContextNoop>()); + _mgr = stdx::make_unique<ReplSetDistLockManager>(getGlobalServiceContext(), + _processID, + std::move(_dummyDoNotUse), + kPingInterval, + kLockExpiration); + } /** * Returns the lock manager instance that is being tested. */ ReplSetDistLockManager* getMgr() { - return &_mgr; + return _mgr.get(); } /** @@ -103,23 +110,27 @@ public: return _processID; } + OperationContext* txn() { + return &_txn; + } + protected: void setUp() override { - _context.setTickSource(stdx::make_unique<SystemTickSource>()); - _mgr.startUp(); + getGlobalServiceContext()->setTickSource(stdx::make_unique<SystemTickSource>()); + _mgr->startUp(); } void tearDown() override { // Don't care about what shutDown passes to stopPing here. _mockCatalog->expectStopPing([](StringData) {}, Status::OK()); - _mgr.shutDown(true); + _mgr->shutDown(txn(), true); } std::unique_ptr<DistLockCatalogMock> _dummyDoNotUse; // dummy placeholder DistLockCatalogMock* _mockCatalog; string _processID; - ServiceContextNoop _context; - ReplSetDistLockManager _mgr; + std::unique_ptr<ReplSetDistLockManager> _mgr; + OperationContextNoop _txn; }; class RSDistLockMgrWithMockTickSource : public ReplSetDistLockManagerFixture { @@ -128,13 +139,13 @@ public: * Returns the mock tick source. */ TickSourceMock* getMockTickSource() { - return dynamic_cast<TickSourceMock*>(_context.getTickSource()); + return dynamic_cast<TickSourceMock*>(getGlobalServiceContext()->getTickSource()); } protected: void setUp() override { - _context.setTickSource(stdx::make_unique<TickSourceMock>()); - _mgr.startUp(); + getGlobalServiceContext()->setTickSource(stdx::make_unique<TickSourceMock>()); + _mgr->startUp(); } }; @@ -202,7 +213,8 @@ TEST_F(ReplSetDistLockManagerFixture, BasicLockLifeCycle) { OID unlockSessionIDPassed; { - auto lockStatus = getMgr()->lock(lockName, + auto lockStatus = getMgr()->lock(txn(), + lockName, whyMsg, DistLockManager::kDefaultSingleLockAttemptTimeout, DistLockManager::kDefaultLockRetryInterval); @@ -334,7 +346,8 @@ TEST_F(RSDistLockMgrWithMockTickSource, LockSuccessAfterRetry) { OID unlockSessionIDPassed; { - auto lockStatus = getMgr()->lock(lockName, whyMsg, Milliseconds(10), Milliseconds(1)); + auto lockStatus = + getMgr()->lock(txn(), lockName, whyMsg, Milliseconds(10), Milliseconds(1)); ASSERT_OK(lockStatus.getStatus()); getMockCatalog()->expectNoGrabLock(); @@ -431,7 +444,8 @@ TEST_F(RSDistLockMgrWithMockTickSource, LockFailsAfterRetry) { Status::OK()); { - auto lockStatus = getMgr()->lock(lockName, whyMsg, Milliseconds(10), Milliseconds(1)); + auto lockStatus = + getMgr()->lock(txn(), lockName, whyMsg, Milliseconds(10), Milliseconds(1)); ASSERT_NOT_OK(lockStatus.getStatus()); } @@ -446,7 +460,7 @@ TEST_F(RSDistLockMgrWithMockTickSource, LockFailsAfterRetry) { // Join the background thread before trying to call asserts. Shutdown calls // stopPing and we don't care in this test. getMockCatalog()->expectStopPing([](StringData) {}, Status::OK()); - getMgr()->shutDown(true); + getMgr()->shutDown(txn(), true); // No assert until shutDown has been called to make sure that the background thread // won't be trying to access the local variables that were captured by lamdas that @@ -469,7 +483,7 @@ TEST_F(ReplSetDistLockManagerFixture, LockBusyNoRetry) { getMockCatalog()->expectGetLockByName([](StringData) {}, {ErrorCodes::LockNotFound, "not found!"}); - auto status = getMgr()->lock("", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = getMgr()->lock(txn(), "", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::LockBusy, status.code()); } @@ -518,7 +532,7 @@ TEST_F(RSDistLockMgrWithMockTickSource, LockRetryTimeout) { {ErrorCodes::LockNotFound, "not found!"}); auto lockStatus = - getMgr()->lock(lockName, whyMsg, Milliseconds(5), Milliseconds(1)).getStatus(); + getMgr()->lock(txn(), lockName, whyMsg, Milliseconds(5), Milliseconds(1)).getStatus(); ASSERT_NOT_OK(lockStatus); ASSERT_EQUALS(ErrorCodes::LockBusy, lockStatus.code()); @@ -572,7 +586,7 @@ TEST_F(ReplSetDistLockManagerFixture, MustUnlockOnLockError) { Status::OK()); auto lockStatus = - getMgr()->lock(lockName, whyMsg, Milliseconds(10), Milliseconds(1)).getStatus(); + getMgr()->lock(txn(), lockName, whyMsg, Milliseconds(10), Milliseconds(1)).getStatus(); ASSERT_NOT_OK(lockStatus); ASSERT_EQUALS(ErrorCodes::NetworkTimeout, lockStatus.code()); @@ -587,7 +601,7 @@ TEST_F(ReplSetDistLockManagerFixture, MustUnlockOnLockError) { // Join the background thread before trying to call asserts. Shutdown calls // stopPing and we don't care in this test. getMockCatalog()->expectStopPing([](StringData) {}, Status::OK()); - getMgr()->shutDown(true); + getMgr()->shutDown(txn(), true); // No assert until shutDown has been called to make sure that the background thread // won't be trying to access the local variables that were captured by lamdas that @@ -637,7 +651,7 @@ TEST_F(ReplSetDistLockManagerFixture, LockPinging) { // Join the background thread before trying to call asserts. Shutdown calls // stopPing and we don't care in this test. getMockCatalog()->expectStopPing([](StringData) {}, Status::OK()); - getMgr()->shutDown(true); + getMgr()->shutDown(txn(), true); // No assert until shutDown has been called to make sure that the background thread // won't be trying to access the local variables that were captured by lamdas that @@ -707,7 +721,7 @@ TEST_F(ReplSetDistLockManagerFixture, UnlockUntilNoError) { StringData why) { lockSessionID = lockSessionIDArg; }, retLockDoc); - { auto lockStatus = getMgr()->lock("test", "why", Milliseconds(0), Milliseconds(0)); } + { auto lockStatus = getMgr()->lock(txn(), "test", "why", Milliseconds(0), Milliseconds(0)); } bool didTimeout = false; { @@ -720,7 +734,7 @@ TEST_F(ReplSetDistLockManagerFixture, UnlockUntilNoError) { // Join the background thread before trying to call asserts. Shutdown calls // stopPing and we don't care in this test. getMockCatalog()->expectStopPing([](StringData) {}, Status::OK()); - getMgr()->shutDown(true); + getMgr()->shutDown(txn(), true); // No assert until shutDown has been called to make sure that the background thread // won't be trying to access the local variables that were captured by lamdas that @@ -800,8 +814,8 @@ TEST_F(ReplSetDistLockManagerFixture, MultipleQueuedUnlock) { retLockDoc); { - auto lockStatus = getMgr()->lock("test", "why", Milliseconds(0), Milliseconds(0)); - auto otherStatus = getMgr()->lock("lock", "why", Milliseconds(0), Milliseconds(0)); + auto lockStatus = getMgr()->lock(txn(), "test", "why", Milliseconds(0), Milliseconds(0)); + auto otherStatus = getMgr()->lock(txn(), "lock", "why", Milliseconds(0), Milliseconds(0)); } bool didTimeout = false; @@ -816,7 +830,7 @@ TEST_F(ReplSetDistLockManagerFixture, MultipleQueuedUnlock) { // Join the background thread before trying to call asserts. Shutdown calls // stopPing and we don't care in this test. getMockCatalog()->expectStopPing([](StringData) {}, Status::OK()); - getMgr()->shutDown(true); + getMgr()->shutDown(txn(), true); // No assert until shutDown has been called to make sure that the background thread // won't be trying to access the local variables that were captured by lamdas that @@ -840,7 +854,7 @@ TEST_F(ReplSetDistLockManagerFixture, CleanupPingOnShutdown) { stopPingCalled = true; }, Status::OK()); - getMgr()->shutDown(true); + getMgr()->shutDown(txn(), true); ASSERT_TRUE(stopPingCalled); } @@ -863,7 +877,7 @@ TEST_F(ReplSetDistLockManagerFixture, CheckLockStatusOK) { retLockDoc); - auto lockStatus = getMgr()->lock("a", "", Milliseconds(0), Milliseconds(0)); + auto lockStatus = getMgr()->lock(txn(), "a", "", Milliseconds(0), Milliseconds(0)); ASSERT_OK(lockStatus.getStatus()); getMockCatalog()->expectNoGrabLock(); @@ -901,7 +915,7 @@ TEST_F(ReplSetDistLockManagerFixture, CheckLockStatusNoLongerOwn) { retLockDoc); - auto lockStatus = getMgr()->lock("a", "", Milliseconds(0), Milliseconds(0)); + auto lockStatus = getMgr()->lock(txn(), "a", "", Milliseconds(0), Milliseconds(0)); ASSERT_OK(lockStatus.getStatus()); getMockCatalog()->expectNoGrabLock(); @@ -940,7 +954,7 @@ TEST_F(ReplSetDistLockManagerFixture, CheckLockStatusError) { retLockDoc); - auto lockStatus = getMgr()->lock("a", "", Milliseconds(0), Milliseconds(0)); + auto lockStatus = getMgr()->lock(txn(), "a", "", Milliseconds(0), Milliseconds(0)); ASSERT_OK(lockStatus.getStatus()); getMockCatalog()->expectNoGrabLock(); @@ -1002,7 +1016,8 @@ TEST_F(ReplSetDistLockManagerFixture, BasicLockOvertaking) { // First attempt will record the ping data. { - auto status = getMgr()->lock("bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = + getMgr()->lock(txn(), "bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::LockBusy, status.code()); } @@ -1032,7 +1047,7 @@ TEST_F(ReplSetDistLockManagerFixture, BasicLockOvertaking) { // Second attempt should overtake lock. { - auto lockStatus = getMgr()->lock("bar", "foo", Milliseconds(0), Milliseconds(0)); + auto lockStatus = getMgr()->lock(txn(), "bar", "foo", Milliseconds(0), Milliseconds(0)); ASSERT_OK(lockStatus.getStatus()); @@ -1078,7 +1093,8 @@ TEST_F(ReplSetDistLockManagerFixture, CannotOvertakeIfExpirationHasNotElapsed) { // First attempt will record the ping data. { - auto status = getMgr()->lock("bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = + getMgr()->lock(txn(), "bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::LockBusy, status.code()); } @@ -1089,7 +1105,8 @@ TEST_F(ReplSetDistLockManagerFixture, CannotOvertakeIfExpirationHasNotElapsed) { // Second attempt should still not overtake lock. { - auto status = getMgr()->lock("bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = + getMgr()->lock(txn(), "bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::LockBusy, status.code()); } @@ -1117,7 +1134,7 @@ TEST_F(ReplSetDistLockManagerFixture, GetPingErrorWhileOvertaking) { ASSERT_EQUALS("otherProcess", process); }, {ErrorCodes::NetworkTimeout, "bad test network"}); - auto status = getMgr()->lock("bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = getMgr()->lock(txn(), "bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::NetworkTimeout, status.code()); } @@ -1144,7 +1161,7 @@ TEST_F(ReplSetDistLockManagerFixture, GetInvalidPingDocumentWhileOvertaking) { getMockCatalog()->expectGetPing( [](StringData process) { ASSERT_EQUALS("otherProcess", process); }, invalidPing); - auto status = getMgr()->lock("bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = getMgr()->lock(txn(), "bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::UnsupportedFormat, status.code()); } @@ -1177,7 +1194,7 @@ TEST_F(ReplSetDistLockManagerFixture, GetServerInfoErrorWhileOvertaking) { getMockCatalog()->expectGetServerInfo([]() {}, {ErrorCodes::NetworkTimeout, "bad test network"}); - auto status = getMgr()->lock("bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = getMgr()->lock(txn(), "bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::NetworkTimeout, status.code()); } @@ -1192,7 +1209,7 @@ TEST_F(ReplSetDistLockManagerFixture, GetLockErrorWhileOvertaking) { getMockCatalog()->expectGetLockByName([](StringData name) { ASSERT_EQUALS("bar", name); }, {ErrorCodes::NetworkTimeout, "bad test network"}); - auto status = getMgr()->lock("bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = getMgr()->lock(txn(), "bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::NetworkTimeout, status.code()); } @@ -1207,7 +1224,7 @@ TEST_F(ReplSetDistLockManagerFixture, GetLockDisappearedWhileOvertaking) { getMockCatalog()->expectGetLockByName([](StringData name) { ASSERT_EQUALS("bar", name); }, {ErrorCodes::LockNotFound, "disappeared!"}); - auto status = getMgr()->lock("bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = getMgr()->lock(txn(), "bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::LockBusy, status.code()); } @@ -1259,7 +1276,8 @@ TEST_F(ReplSetDistLockManagerFixture, CannotOvertakeIfPingIsActive) { getServerInfoCallCount++; }, DistLockCatalog::ServerInfo(configServerLocalTime, OID())); - auto status = getMgr()->lock("bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = + getMgr()->lock(txn(), "bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::LockBusy, status.code()); } @@ -1293,7 +1311,7 @@ TEST_F(ReplSetDistLockManagerFixture, CannotOvertakeIfPingIsActive) { OID unlockSessionIDPassed; { - auto lockStatus = getMgr()->lock("bar", "foo", Milliseconds(0), Milliseconds(0)); + auto lockStatus = getMgr()->lock(txn(), "bar", "foo", Milliseconds(0), Milliseconds(0)); ASSERT_OK(lockStatus.getStatus()); @@ -1357,7 +1375,8 @@ TEST_F(ReplSetDistLockManagerFixture, CannotOvertakeIfOwnerJustChanged) { getServerInfoCallCount++; }, DistLockCatalog::ServerInfo(configServerLocalTime, OID())); - auto status = getMgr()->lock("bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = + getMgr()->lock(txn(), "bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::LockBusy, status.code()); } @@ -1391,7 +1410,7 @@ TEST_F(ReplSetDistLockManagerFixture, CannotOvertakeIfOwnerJustChanged) { OID unlockSessionIDPassed; { - auto lockStatus = getMgr()->lock("bar", "foo", Milliseconds(0), Milliseconds(0)); + auto lockStatus = getMgr()->lock(txn(), "bar", "foo", Milliseconds(0), Milliseconds(0)); ASSERT_OK(lockStatus.getStatus()); @@ -1458,7 +1477,8 @@ TEST_F(ReplSetDistLockManagerFixture, CannotOvertakeIfElectionIdChanged) { getServerInfoCallCount++; }, DistLockCatalog::ServerInfo(configServerLocalTime, lastElectionId)); - auto status = getMgr()->lock("bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = + getMgr()->lock(txn(), "bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::LockBusy, status.code()); } @@ -1492,7 +1512,7 @@ TEST_F(ReplSetDistLockManagerFixture, CannotOvertakeIfElectionIdChanged) { OID unlockSessionIDPassed; { - auto lockStatus = getMgr()->lock("bar", "foo", Milliseconds(0), Milliseconds(0)); + auto lockStatus = getMgr()->lock(txn(), "bar", "foo", Milliseconds(0), Milliseconds(0)); ASSERT_OK(lockStatus.getStatus()); @@ -1550,7 +1570,8 @@ TEST_F(ReplSetDistLockManagerFixture, LockOvertakingResultsInError) { // First attempt will record the ping data. { - auto status = getMgr()->lock("bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = + getMgr()->lock(txn(), "bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::LockBusy, status.code()); } @@ -1589,7 +1610,7 @@ TEST_F(ReplSetDistLockManagerFixture, LockOvertakingResultsInError) { Status::OK()); // Second attempt should overtake lock. - auto lockStatus = getMgr()->lock("bar", "foo", Milliseconds(0), Milliseconds(0)); + auto lockStatus = getMgr()->lock(txn(), "bar", "foo", Milliseconds(0), Milliseconds(0)); ASSERT_NOT_OK(lockStatus.getStatus()); @@ -1604,7 +1625,7 @@ TEST_F(ReplSetDistLockManagerFixture, LockOvertakingResultsInError) { // Join the background thread before trying to call asserts. Shutdown calls // stopPing and we don't care in this test. getMockCatalog()->expectStopPing([](StringData) {}, Status::OK()); - getMgr()->shutDown(true); + getMgr()->shutDown(txn(), true); // No assert until shutDown has been called to make sure that the background thread // won't be trying to access the local variables that were captured by lamdas that @@ -1655,7 +1676,8 @@ TEST_F(ReplSetDistLockManagerFixture, LockOvertakingFailed) { // First attempt will record the ping data. { - auto status = getMgr()->lock("bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = + getMgr()->lock(txn(), "bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::LockBusy, status.code()); } @@ -1681,7 +1703,8 @@ TEST_F(ReplSetDistLockManagerFixture, LockOvertakingFailed) { {ErrorCodes::LockStateChangeFailed, "nmod 0"}); { - auto status = getMgr()->lock("bar", "foo", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = + getMgr()->lock(txn(), "bar", "foo", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::LockBusy, status.code()); } @@ -1728,7 +1751,8 @@ TEST_F(ReplSetDistLockManagerFixture, CannotOvertakeIfConfigServerClockGoesBackw // First attempt will record the ping data. { - auto status = getMgr()->lock("bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = + getMgr()->lock(txn(), "bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::LockBusy, status.code()); } @@ -1739,7 +1763,8 @@ TEST_F(ReplSetDistLockManagerFixture, CannotOvertakeIfConfigServerClockGoesBackw // Second attempt should not overtake lock. { - auto status = getMgr()->lock("bar", "foo", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = + getMgr()->lock(txn(), "bar", "foo", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::LockBusy, status.code()); } @@ -1781,7 +1806,8 @@ TEST_F(RSDistLockMgrWithMockTickSource, CanOvertakeIfNoPingDocument) { // First attempt will record the ping data. { - auto status = getMgr()->lock("bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); + auto status = + getMgr()->lock(txn(), "bar", "", Milliseconds(0), Milliseconds(0)).getStatus(); ASSERT_NOT_OK(status); ASSERT_EQUALS(ErrorCodes::LockBusy, status.code()); } @@ -1826,7 +1852,10 @@ TEST_F(RSDistLockMgrWithMockTickSource, CanOvertakeIfNoPingDocument) { Status::OK()); // Second attempt should overtake lock. - { ASSERT_OK(getMgr()->lock("bar", "foo", Milliseconds(0), Milliseconds(0)).getStatus()); } + { + ASSERT_OK( + getMgr()->lock(txn(), "bar", "foo", Milliseconds(0), Milliseconds(0)).getStatus()); + } } } // unnamed namespace diff --git a/src/mongo/s/client/shard_registry.cpp b/src/mongo/s/client/shard_registry.cpp index 83bf79d470e..fc7121e3a05 100644 --- a/src/mongo/s/client/shard_registry.cpp +++ b/src/mongo/s/client/shard_registry.cpp @@ -345,6 +345,7 @@ OpTime ShardRegistry::getConfigOpTime() { } StatusWith<ShardRegistry::QueryResponse> ShardRegistry::exhaustiveFindOnConfig( + OperationContext* txn, const ReadPreferenceSetting& readPref, const NamespaceString& nss, const BSONObj& query, @@ -491,7 +492,8 @@ StatusWith<BSONObj> ShardRegistry::runCommandForAddShard(OperationContext* txn, return status.getValue().response; } -StatusWith<BSONObj> ShardRegistry::runCommandOnConfig(const ReadPreferenceSetting& readPref, +StatusWith<BSONObj> ShardRegistry::runCommandOnConfig(OperationContext* txn, + const ReadPreferenceSetting& readPref, const std::string& dbName, const BSONObj& cmdObj) { auto response = _runCommandWithMetadata( @@ -510,7 +512,8 @@ StatusWith<BSONObj> ShardRegistry::runCommandOnConfig(const ReadPreferenceSettin return response.getValue().response; } -StatusWith<BSONObj> ShardRegistry::runCommandOnConfigWithNotMasterRetries(const std::string& dbname, +StatusWith<BSONObj> ShardRegistry::runCommandOnConfigWithNotMasterRetries(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj) { auto response = _runCommandWithNotMasterRetries( _executor.get(), getConfigShard(), dbname, cmdObj, kReplMetadata); diff --git a/src/mongo/s/client/shard_registry.h b/src/mongo/s/client/shard_registry.h index 2780d9fe8c3..7616852ef22 100644 --- a/src/mongo/s/client/shard_registry.h +++ b/src/mongo/s/client/shard_registry.h @@ -201,6 +201,7 @@ public: * Note: should never be used outside of CatalogManagerReplicaSet or DistLockCatalogImpl. */ StatusWith<QueryResponse> exhaustiveFindOnConfig( + OperationContext* txn, const ReadPreferenceSetting& readPref, const NamespaceString& nss, const BSONObj& query, @@ -240,7 +241,8 @@ public: * the result. It is the responsibility of the caller to check the returned BSON for * command-specific failures. */ - StatusWith<BSONObj> runCommandOnConfig(const ReadPreferenceSetting& readPref, + StatusWith<BSONObj> runCommandOnConfig(OperationContext* txn, + const ReadPreferenceSetting& readPref, const std::string& dbname, const BSONObj& cmdObj); @@ -260,7 +262,8 @@ public: const std::string& dbname, const BSONObj& cmdObj); - StatusWith<BSONObj> runCommandOnConfigWithNotMasterRetries(const std::string& dbname, + StatusWith<BSONObj> runCommandOnConfigWithNotMasterRetries(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj); private: |