diff options
author | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2014-11-25 17:28:02 -0500 |
---|---|---|
committer | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2014-12-03 09:36:10 -0500 |
commit | f423ad99311088658c7aabb1d94ee29137896b90 (patch) | |
tree | 2ae31e374055ecacd4d908ed404e2647710f8e4a /src/mongo/db/commands/collection_to_capped.cpp | |
parent | 6c93bae163d0cbd4acf8e127c902844353b72c6b (diff) | |
download | mongo-f423ad99311088658c7aabb1d94ee29137896b90.tar.gz |
SERVER-15826 convertToCapped doesn't need to take a global lock
Diffstat (limited to 'src/mongo/db/commands/collection_to_capped.cpp')
-rw-r--r-- | src/mongo/db/commands/collection_to_capped.cpp | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/src/mongo/db/commands/collection_to_capped.cpp b/src/mongo/db/commands/collection_to_capped.cpp index 52769976cfd..39fd193abb8 100644 --- a/src/mongo/db/commands/collection_to_capped.cpp +++ b/src/mongo/db/commands/collection_to_capped.cpp @@ -40,6 +40,7 @@ #include "mongo/db/operation_context_impl.h" namespace mongo { +namespace { Status cloneCollectionAsCapped( OperationContext* txn, Database* db, @@ -123,6 +124,8 @@ namespace mongo { invariant( false ); // unreachable } +} // namespace + /* convertToCapped seems to use this */ class CmdCloneCollectionAsCapped : public Command { public: @@ -162,10 +165,11 @@ namespace mongo { } ScopedTransaction transaction(txn, MODE_IX); - Lock::DBLock dbXLock(txn->lockState(), dbname, MODE_X); - Client::Context ctx(txn, dbname); + AutoGetDb autoDb(txn, dbname, MODE_X); + + Database* const db = autoDb.getDb(); - Status status = cloneCollectionAsCapped( txn, ctx.db(), from, to, size, temp, true ); + Status status = cloneCollectionAsCapped(txn, db, from, to, size, temp, true); return appendCommandStatus( result, status ); } } cmdCloneCollectionAsCapped; @@ -213,13 +217,18 @@ namespace mongo { string& errmsg, BSONObjBuilder& result, bool fromRepl ) { - // calls renamecollection which does a global lock, so we must too: - // - ScopedTransaction transaction(txn, MODE_X); - Lock::GlobalWrite globalWriteLock(txn->lockState()); - Client::Context ctx(txn, dbname); - Database* db = ctx.db(); + ScopedTransaction transaction(txn, MODE_IX); + AutoGetDb autoDb(txn, dbname, MODE_X); + + Database* const db = autoDb.getDb(); + if (!db) { + return appendCommandStatus( + result, + Status(ErrorCodes::NamespaceNotFound, + str::stream() << "source database " + << dbname << " does not exist")); + } stopIndexBuilds(txn, db, jsobj); BackgroundOperation::assertNoBgOpInProgForDb(dbname.c_str()); |