diff options
author | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2016-04-28 07:56:56 -0400 |
---|---|---|
committer | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2016-04-29 08:31:38 -0400 |
commit | dff63f2afc63ee0b4e3288f50d435af83995e370 (patch) | |
tree | a6edf0027c7545ffd66a5f1240b74964e4dfea6e /src/mongo/s/commands/commands_public.cpp | |
parent | dd3f158aef4bd82f43fe4de8a46fb76f28ddeef7 (diff) | |
download | mongo-dff63f2afc63ee0b4e3288f50d435af83995e370.tar.gz |
SERVER-23609 Introduce RAII class for retrieving sharding cache objects
Around the sharding code there are a lot of repeated code sequences, where
we first check for existence of the database, then get the chunk manager.
In an effort to reduce this code duplication and to eventually be able to
get rid of the shared pointer references, this change introduces RAII
objects similar to the ones we have in mongod.
Diffstat (limited to 'src/mongo/s/commands/commands_public.cpp')
-rw-r--r-- | src/mongo/s/commands/commands_public.cpp | 61 |
1 files changed, 30 insertions, 31 deletions
diff --git a/src/mongo/s/commands/commands_public.cpp b/src/mongo/s/commands/commands_public.cpp index f15d63d65b4..2d1e89d4293 100644 --- a/src/mongo/s/commands/commands_public.cpp +++ b/src/mongo/s/commands/commands_public.cpp @@ -55,9 +55,9 @@ #include "mongo/s/commands/run_on_all_shards_cmd.h" #include "mongo/s/commands/sharded_command_processing.h" #include "mongo/s/config.h" -#include "mongo/s/db_util.h" #include "mongo/s/grid.h" #include "mongo/s/query/store_possible_cursor.h" +#include "mongo/s/sharding_raii.h" #include "mongo/s/stale_exception.h" #include "mongo/scripting/engine.h" #include "mongo/util/log.h" @@ -150,21 +150,21 @@ public: protected: bool passthrough(OperationContext* txn, - shared_ptr<DBConfig> conf, + DBConfig* conf, const BSONObj& cmdObj, BSONObjBuilder& result) { return _passthrough(txn, conf->name(), conf, cmdObj, 0, result); } bool adminPassthrough(OperationContext* txn, - shared_ptr<DBConfig> conf, + DBConfig* conf, const BSONObj& cmdObj, BSONObjBuilder& result) { return _passthrough(txn, "admin", conf, cmdObj, 0, result); } bool passthrough(OperationContext* txn, - shared_ptr<DBConfig> conf, + DBConfig* conf, const BSONObj& cmdObj, int options, BSONObjBuilder& result) { @@ -174,7 +174,7 @@ protected: private: bool _passthrough(OperationContext* txn, const string& db, - shared_ptr<DBConfig> conf, + DBConfig* conf, const BSONObj& cmdObj, int options, BSONObjBuilder& result) { @@ -236,7 +236,7 @@ public: auto conf = uassertStatusOK(grid.catalogCache()->getDatabase(txn, dbName)); if (!conf->isSharded(fullns)) { - return passthrough(txn, conf, cmdObj, options, result); + return passthrough(txn, conf.get(), cmdObj, options, result); } return appendCommandStatus( @@ -434,10 +434,10 @@ public: auto conf = uassertStatusOK(grid.catalogCache()->getDatabase(txn, dbName)); if (!conf->isShardingEnabled() || !conf->isSharded(nss.ns())) { - return passthrough(txn, conf, cmdObj, output); + return passthrough(txn, conf.get(), cmdObj, output); } - ChunkManagerPtr cm = conf->getChunkManager(txn, nss.ns()); + shared_ptr<ChunkManager> cm = conf->getChunkManager(txn, nss.ns()); massert(40051, "chunk manager should not be null", cm); vector<Strategy::CommandResult> results; @@ -510,14 +510,13 @@ public: int, string& errmsg, BSONObjBuilder& result) { - auto status = dbutil::implicitCreateDb(txn, dbName); - if (!status.isOK()) { - return appendCommandStatus(result, status.getStatus()); + auto dbStatus = ScopedShardDatabase::getOrCreate(txn, dbName); + if (!dbStatus.isOK()) { + return appendCommandStatus(result, dbStatus.getStatus()); } - shared_ptr<DBConfig> conf = status.getValue(); - - return passthrough(txn, conf, cmdObj, result); + auto scopedDb = std::move(dbStatus.getValue()); + return passthrough(txn, scopedDb.db(), cmdObj, result); } } createCmd; @@ -559,7 +558,7 @@ public: const auto& db = status.getValue(); if (!db->isShardingEnabled() || !db->isSharded(fullns.ns())) { log() << "\tdrop going to do passthrough"; - return passthrough(txn, db, cmdObj, result); + return passthrough(txn, db.get(), cmdObj, result); } uassertStatusOK(grid.catalogManager(txn)->dropCollection(txn, fullns)); @@ -609,7 +608,7 @@ public: "Source and destination collections must be on same shard", shardFrom == shardTo); - return adminPassthrough(txn, confFrom, cmdObj, result); + return adminPassthrough(txn, confFrom.get(), cmdObj, result); } } renameCollectionCmd; @@ -640,14 +639,14 @@ public: "invalid todb argument", NamespaceString::validDBName(todb, NamespaceString::DollarInDbNameBehavior::Allow)); - auto confTo = uassertStatusOK(dbutil::implicitCreateDb(txn, todb)); + auto scopedToDb = uassertStatusOK(ScopedShardDatabase::getOrCreate(txn, todb)); uassert(ErrorCodes::IllegalOperation, "cannot copy to a sharded database", - !confTo->isShardingEnabled()); + !scopedToDb.db()->isShardingEnabled()); const string fromhost = cmdObj.getStringField("fromhost"); if (!fromhost.empty()) { - return adminPassthrough(txn, confTo, cmdObj, result); + return adminPassthrough(txn, scopedToDb.db(), cmdObj, result); } else { const string fromdb = cmdObj.getStringField("fromdb"); uassert(13399, "need a fromdb argument", !fromdb.empty()); @@ -671,7 +670,7 @@ public: } BSONObj fixed = b.obj(); - return adminPassthrough(txn, confTo, fixed, result); + return adminPassthrough(txn, scopedToDb.db(), fixed, result); } } } clusterCopyDBCmd; @@ -704,12 +703,12 @@ public: result.appendBool("sharded", false); result.append("primary", conf->getPrimaryId()); - return passthrough(txn, conf, cmdObj, result); + return passthrough(txn, conf.get(), cmdObj, result); } result.appendBool("sharded", true); - ChunkManagerPtr cm = conf->getChunkManager(txn, fullns); + shared_ptr<ChunkManager> cm = conf->getChunkManager(txn, fullns); massert(12594, "how could chunk manager be null!", cm); BSONObjBuilder shardStats; @@ -869,10 +868,10 @@ public: auto conf = uassertStatusOK(grid.catalogCache()->getDatabase(txn, nsDBName)); if (!conf->isShardingEnabled() || !conf->isSharded(fullns)) { - return passthrough(txn, conf, cmdObj, result); + return passthrough(txn, conf.get(), cmdObj, result); } - ChunkManagerPtr cm = conf->getChunkManager(txn, fullns); + shared_ptr<ChunkManager> cm = conf->getChunkManager(txn, fullns); massert(13407, "how could chunk manager be null!", cm); BSONObj min = cmdObj.getObjectField("min"); @@ -1111,10 +1110,10 @@ public: shared_ptr<DBConfig> conf = status.getValue(); if (!conf->isShardingEnabled() || !conf->isSharded(fullns)) { - return passthrough(txn, conf, cmdObj, options, result); + return passthrough(txn, conf.get(), cmdObj, options, result); } - ChunkManagerPtr cm = conf->getChunkManager(txn, fullns); + shared_ptr<ChunkManager> cm = conf->getChunkManager(txn, fullns); massert(10420, "how could chunk manager be null!", cm); BSONObj query = getQuery(cmdObj); @@ -1237,10 +1236,10 @@ public: auto conf = uassertStatusOK(grid.catalogCache()->getDatabase(txn, dbName)); if (!conf->isShardingEnabled() || !conf->isSharded(fullns)) { - return passthrough(txn, conf, cmdObj, result); + return passthrough(txn, conf.get(), cmdObj, result); } - ChunkManagerPtr cm = conf->getChunkManager(txn, fullns); + shared_ptr<ChunkManager> cm = conf->getChunkManager(txn, fullns); massert(13091, "how could chunk manager be null!", cm); if (cm->getShardKeyPattern().toBSON() == BSON("files_id" << 1)) { BSONObj finder = BSON("files_id" << cmdObj.firstElement()); @@ -1368,10 +1367,10 @@ public: auto conf = uassertStatusOK(grid.catalogCache()->getDatabase(txn, dbName)); if (!conf->isShardingEnabled() || !conf->isSharded(fullns)) { - return passthrough(txn, conf, cmdObj, options, result); + return passthrough(txn, conf.get(), cmdObj, options, result); } - ChunkManagerPtr cm = conf->getChunkManager(txn, fullns); + shared_ptr<ChunkManager> cm = conf->getChunkManager(txn, fullns); massert(13500, "how could chunk manager be null!", cm); BSONObj query = getQuery(cmdObj); @@ -1546,7 +1545,7 @@ public: } shared_ptr<DBConfig> conf = status.getValue(); - return passthrough(txn, conf, cmdObj, result); + return passthrough(txn, conf.get(), cmdObj, result); } } evalCmd; |