summaryrefslogtreecommitdiff
path: root/src/mongo/db/dbcommands.cpp
diff options
context:
space:
mode:
authorEric Milkie <milkie@10gen.com>2014-03-21 10:17:20 -0400
committerEric Milkie <milkie@10gen.com>2014-03-21 10:17:33 -0400
commit70c062eb0646506df8979b49c052a54e6e4f9f8e (patch)
treea73a3994cbbab8856d191ed044e8a783b12ede84 /src/mongo/db/dbcommands.cpp
parentf6713955af2bfe8a2c5f5ac7d0dfcabebbc821c5 (diff)
downloadmongo-70c062eb0646506df8979b49c052a54e6e4f9f8e.tar.gz
SERVER-13053 track index builds explicitly instead of using CurOp
Diffstat (limited to 'src/mongo/db/dbcommands.cpp')
-rw-r--r--src/mongo/db/dbcommands.cpp68
1 files changed, 48 insertions, 20 deletions
diff --git a/src/mongo/db/dbcommands.cpp b/src/mongo/db/dbcommands.cpp
index 89e0bc84572..e9c08fe3ef3 100644
--- a/src/mongo/db/dbcommands.cpp
+++ b/src/mongo/db/dbcommands.cpp
@@ -170,14 +170,27 @@ namespace mongo {
virtual LockType locktype() const { return WRITE; }
- virtual std::vector<BSONObj> stopIndexBuilds(const std::string& dbname,
+ virtual std::vector<BSONObj> stopIndexBuilds(Database* db,
const BSONObj& cmdObj) {
- std::string systemIndexes = dbname+".system.indexes";
- std::string toDeleteRegex = "^"+dbname+"\\.";
- BSONObj criteria = BSON("ns" << systemIndexes <<
- "op" << "insert" <<
- "insert.ns" << BSON("$regex" << toDeleteRegex));
- return IndexBuilder::killMatchingIndexBuilds(criteria);
+ invariant(db);
+ std::list<std::string> collections;
+ db->namespaceIndex().getNamespaces(collections, true /* onlyCollections */);
+
+ std::vector<BSONObj> allKilledIndexes;
+ for (std::list<std::string>::iterator it = collections.begin();
+ it != collections.end();
+ ++it) {
+ std::string ns = *it;
+
+ IndexCatalog::IndexKillCriteria criteria;
+ criteria.ns = ns;
+ std::vector<BSONObj> killedIndexes =
+ IndexBuilder::killMatchingIndexBuilds(db->getCollection(ns), criteria);
+ allKilledIndexes.insert(allKilledIndexes.end(),
+ killedIndexes.begin(),
+ killedIndexes.end());
+ }
+ return allKilledIndexes;
}
CmdDropDatabase() : Command("dropDatabase") {}
@@ -192,7 +205,7 @@ namespace mongo {
int p = (int) e.number();
if ( p != 1 )
return false;
- stopIndexBuilds(dbname, cmdObj);
+ stopIndexBuilds(cc().database(), cmdObj);
dropDatabase(dbname);
result.append( "dropped" , dbname );
log() << "dropDatabase " << dbname << " finished" << endl;
@@ -224,11 +237,27 @@ namespace mongo {
}
CmdRepairDatabase() : Command("repairDatabase") {}
- virtual std::vector<BSONObj> stopIndexBuilds(const std::string& dbname,
+ virtual std::vector<BSONObj> stopIndexBuilds(Database* db,
const BSONObj& cmdObj) {
- std::string systemIndexes = dbname + ".system.indexes";
- BSONObj criteria = BSON("ns" << systemIndexes << "op" << "insert");
- return IndexBuilder::killMatchingIndexBuilds(criteria);
+ invariant(db);
+ std::list<std::string> collections;
+ db->namespaceIndex().getNamespaces(collections, true /* onlyCollections */);
+
+ std::vector<BSONObj> allKilledIndexes;
+ for (std::list<std::string>::iterator it = collections.begin();
+ it != collections.end();
+ ++it) {
+ std::string ns = *it;
+
+ IndexCatalog::IndexKillCriteria criteria;
+ criteria.ns = ns;
+ std::vector<BSONObj> killedIndexes =
+ IndexBuilder::killMatchingIndexBuilds(db->getCollection(ns), criteria);
+ allKilledIndexes.insert(allKilledIndexes.end(),
+ killedIndexes.begin(),
+ killedIndexes.end());
+ }
+ return allKilledIndexes;
}
bool run(const string& dbname , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
@@ -241,7 +270,7 @@ namespace mongo {
return false;
}
- std::vector<BSONObj> indexesInProg = stopIndexBuilds(dbname, cmdObj);
+ std::vector<BSONObj> indexesInProg = stopIndexBuilds(cc().database(), cmdObj);
e = cmdObj.getField( "preserveClonedFilesOnFailure" );
bool preserveClonedFilesOnFailure = e.isBoolean() && e.boolean();
@@ -390,14 +419,13 @@ namespace mongo {
virtual void help( stringstream& help ) const { help << "drop a collection\n{drop : <collectionName>}"; }
virtual LockType locktype() const { return WRITE; }
- virtual std::vector<BSONObj> stopIndexBuilds(const std::string& dbname,
+ virtual std::vector<BSONObj> stopIndexBuilds(Database* db,
const BSONObj& cmdObj) {
- std::string nsToDrop = dbname + '.' + cmdObj.firstElement().valuestr();
- std::string systemIndexes = dbname+".system.indexes";
- BSONObj criteria = BSON("ns" << systemIndexes << "op" << "insert" <<
- "insert.ns" << nsToDrop);
+ std::string nsToDrop = db->name() + '.' + cmdObj.firstElement().valuestr();
- return IndexBuilder::killMatchingIndexBuilds(criteria);
+ IndexCatalog::IndexKillCriteria criteria;
+ criteria.ns = nsToDrop;
+ return IndexBuilder::killMatchingIndexBuilds(db->getCollection(nsToDrop), criteria);
}
virtual bool run(const string& dbname , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool) {
@@ -420,7 +448,7 @@ namespace mongo {
int numIndexes = coll->getIndexCatalog()->numIndexesTotal();
- stopIndexBuilds(dbname, cmdObj);
+ stopIndexBuilds(cc().database(), cmdObj);
result.append( "ns", nsToDrop );
result.append( "nIndexesWas", numIndexes );