diff options
author | Spencer T Brody <spencer@mongodb.com> | 2015-08-24 15:53:54 -0400 |
---|---|---|
committer | Spencer T Brody <spencer@mongodb.com> | 2015-08-25 14:58:12 -0400 |
commit | d64c98deed2440ae0f3700dc373bf8b97886030c (patch) | |
tree | c676a9a82a56a2191fb5cab3956e515484bc57d1 /src/mongo/db/db_raii.cpp | |
parent | 559be68757f52d0a5f6e2c2622febea8acf80c35 (diff) | |
download | mongo-d64c98deed2440ae0f3700dc373bf8b97886030c.tar.gz |
SERVER-19855 Do not perform shard version checking where not necessary
This reverts commit 045cd1070cae1e7827255850c2fe35194e48b24e.
Diffstat (limited to 'src/mongo/db/db_raii.cpp')
-rw-r--r-- | src/mongo/db/db_raii.cpp | 45 |
1 files changed, 18 insertions, 27 deletions
diff --git a/src/mongo/db/db_raii.cpp b/src/mongo/db/db_raii.cpp index c7634052710..a987062b11b 100644 --- a/src/mongo/db/db_raii.cpp +++ b/src/mongo/db/db_raii.cpp @@ -32,6 +32,7 @@ #include "mongo/db/catalog/database_holder.h" #include "mongo/db/catalog/collection.h" +#include "mongo/db/catalog/database.h" #include "mongo/db/client.h" #include "mongo/db/curop.h" #include "mongo/db/repl/replication_coordinator_global.h" @@ -43,6 +44,13 @@ namespace mongo { AutoGetDb::AutoGetDb(OperationContext* txn, StringData ns, LockMode mode) : _dbLock(txn->lockState(), ns, mode), _db(dbHolder().get(txn, ns)) {} +AutoGetCollection::AutoGetCollection(OperationContext* txn, + const NamespaceString& nss, + LockMode mode) + : _autoDb(txn, nss.db(), mode), + _collLock(txn->lockState(), nss.ns(), mode), + _coll(_autoDb.getDb() ? _autoDb.getDb()->getCollection(nss) : nullptr) {} + AutoGetOrCreateDb::AutoGetOrCreateDb(OperationContext* txn, StringData ns, LockMode mode) : _transaction(txn, MODE_IX), _dbLock(txn->lockState(), ns, mode), @@ -60,48 +68,31 @@ AutoGetOrCreateDb::AutoGetOrCreateDb(OperationContext* txn, StringData ns, LockM } AutoGetCollectionForRead::AutoGetCollectionForRead(OperationContext* txn, const std::string& ns) - : _txn(txn), - _transaction(txn, MODE_IS), - _db(_txn, nsToDatabaseSubstring(ns), MODE_IS), - _collLock(_txn->lockState(), ns, MODE_IS), - _coll(NULL) { - _init(ns, nsToCollectionSubstring(ns)); -} + : AutoGetCollectionForRead(txn, NamespaceString(ns)) {} AutoGetCollectionForRead::AutoGetCollectionForRead(OperationContext* txn, const NamespaceString& nss) - : _txn(txn), - _transaction(txn, MODE_IS), - _db(_txn, nss.db(), MODE_IS), - _collLock(_txn->lockState(), nss.toString(), MODE_IS), - _coll(NULL) { - _init(nss.toString(), nss.coll()); -} - -void AutoGetCollectionForRead::_init(const std::string& ns, StringData coll) { - massert(28535, "need a non-empty collection name", !coll.empty()); - + : _txn(txn), _transaction(txn, MODE_IS), _autoColl(txn, nss, MODE_IS) { // We have both the DB and collection locked, which the prerequisite to do a stable shard - // version check. - ensureShardVersionOKOrThrow(_txn, ns); + // version check + ensureShardVersionOKOrThrow(_txn, nss.ns()); auto curOp = CurOp::get(_txn); stdx::lock_guard<Client> lk(*_txn->getClient()); + // TODO: OldClientContext legacy, needs to be removed curOp->ensureStarted(); - curOp->setNS_inlock(ns); + curOp->setNS_inlock(nss.ns()); // At this point, we are locked in shared mode for the database by the DB lock in the // constructor, so it is safe to load the DB pointer. - if (_db.getDb()) { + if (_autoColl.getDb()) { // TODO: OldClientContext legacy, needs to be removed - curOp->enter_inlock(ns.c_str(), _db.getDb()->getProfilingLevel()); - - _coll = _db.getDb()->getCollection(ns); + curOp->enter_inlock(nss.ns().c_str(), _autoColl.getDb()->getProfilingLevel()); } - if (_coll) { - if (auto minSnapshot = _coll->getMinimumVisibleSnapshot()) { + if (getCollection()) { + if (auto minSnapshot = getCollection()->getMinimumVisibleSnapshot()) { if (auto mySnapshot = _txn->recoveryUnit()->getMajorityCommittedSnapshot()) { while (mySnapshot < minSnapshot) { // Wait until a snapshot is available. |