summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands/collection_to_capped.cpp
diff options
context:
space:
mode:
authorKaloian Manassiev <kaloian.manassiev@mongodb.com>2014-11-25 17:28:02 -0500
committerKaloian Manassiev <kaloian.manassiev@mongodb.com>2014-12-03 09:36:10 -0500
commitf423ad99311088658c7aabb1d94ee29137896b90 (patch)
tree2ae31e374055ecacd4d908ed404e2647710f8e4a /src/mongo/db/commands/collection_to_capped.cpp
parent6c93bae163d0cbd4acf8e127c902844353b72c6b (diff)
downloadmongo-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.cpp27
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());