summaryrefslogtreecommitdiff
path: root/src/mongo/s/commands/commands_public.cpp
diff options
context:
space:
mode:
authorKaloian Manassiev <kaloian.manassiev@mongodb.com>2016-04-28 07:56:56 -0400
committerKaloian Manassiev <kaloian.manassiev@mongodb.com>2016-04-29 08:31:38 -0400
commitdff63f2afc63ee0b4e3288f50d435af83995e370 (patch)
treea6edf0027c7545ffd66a5f1240b74964e4dfea6e /src/mongo/s/commands/commands_public.cpp
parentdd3f158aef4bd82f43fe4de8a46fb76f28ddeef7 (diff)
downloadmongo-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.cpp61
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;