summaryrefslogtreecommitdiff
path: root/src/mongo/db/index_rebuilder.cpp
diff options
context:
space:
mode:
authorKristina <kristina@10gen.com>2012-11-12 11:50:12 -0500
committerKristina <kristina@10gen.com>2012-11-12 11:50:12 -0500
commit3abcc53d43145bcda52016c753e10ff139d41e4d (patch)
tree8ed28904a6e433949420ccd9229e6d9721eaa4d9 /src/mongo/db/index_rebuilder.cpp
parent074431815cdfc44ad757675a159e3e51739d1d95 (diff)
downloadmongo-3abcc53d43145bcda52016c753e10ff139d41e4d.tar.gz
Revert "SERVER-2771 Retry index builds on startup"
This reverts commit ab9ff1d3ecc7163fc93188efd997bbacd8fe7406.
Diffstat (limited to 'src/mongo/db/index_rebuilder.cpp')
-rw-r--r--src/mongo/db/index_rebuilder.cpp112
1 files changed, 0 insertions, 112 deletions
diff --git a/src/mongo/db/index_rebuilder.cpp b/src/mongo/db/index_rebuilder.cpp
deleted file mode 100644
index 5ae2b389510..00000000000
--- a/src/mongo/db/index_rebuilder.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * Copyright (C) 2012 10gen Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "mongo/db/index_rebuilder.h"
-
-#include "mongo/db/instance.h"
-#include "mongo/db/pdfile.h"
-
-namespace mongo {
-
- IndexRebuilder indexRebuilder;
-
- IndexRebuilder::IndexRebuilder() {}
-
- std::string IndexRebuilder::name() const {
- return "IndexRebuilder";
- }
-
- void IndexRebuilder::run() {
- Client::initThread(name().c_str());
- Lock::GlobalWrite lk;
- Client::GodScope gs;
- std::vector<std::string> dbNames;
- getDatabaseNames(dbNames);
-
- for (std::vector<std::string>::const_iterator it = dbNames.begin();
- it < dbNames.end();
- it++) {
- checkDB(*it);
- }
-
- cc().shutdown();
- }
-
- void IndexRebuilder::checkDB(const std::string& dbName) {
- const std::string systemNS = dbName + ".system.namespaces";
- DBDirectClient cli;
- scoped_ptr<DBClientCursor> cursor(cli.query(systemNS, Query()));
-
- while (cursor->more()) {
- BSONObj nsDoc = cursor->next();
- const char* ns = nsDoc["name"].valuestrsafe();
-
- Client::Context ctx(ns, dbpath, false, false);
- NamespaceDetails* nsd = nsdetails(ns);
-
- if (!nsd || !nsd->indexBuildInProgress) {
- continue;
- }
-
- log() << "Found interrupted index build on " << ns << endl;
-
- // If the indexBuildRetry flag isn't set, just clear the inProg flag
- if (!cmdLine.indexBuildRetry) {
- // If we crash between unsetting the inProg flag and cleaning up the index, the
- // index space will be lost.
- getDur().writingInt(nsd->indexBuildInProgress) = 0;
- nsd->idx(nsd->nIndexes).kill_idx();
- continue;
- }
-
- retryIndexBuild(dbName, nsd);
- }
- }
-
- void IndexRebuilder::retryIndexBuild(const std::string& dbName, NamespaceDetails* nsd) {
- // details.info is always a valid system.indexes entry because DataFileMgr::insert journals
- // creating the index doc and then insert_makeIndex durably assigns its DiskLoc to info.
- // indexBuildInProgress is set after that, so if it is set, info must be set.
- IndexDetails& details = nsd->idx(nsd->nIndexes);
-
- // First, clean up the in progress index build. Save the system.indexes entry so that we
- // can add it again afterwards.
- BSONObj indexObj = details.info.obj().getOwned();
-
- // Clean up the in-progress index build
- getDur().writingInt(nsd->indexBuildInProgress) = 0;
- details.kill_idx();
- // The index has now been removed from system.indexes, so the only record of it is in-
- // memory. If there is a journal commit between now and when insert() rewrites the entry and
- // the db crashes before the new system.indexes entry is journalled, the index will be lost
- // forever. Thus, we're assuming no journaling will happen between now and the entry being
- // re-written.
-
- // We need to force a foreground index build to prevent replication from replaying an
- // incompatible op (like a drop) during a yield.
- // TODO: once commands can interrupt/wait for index builds, this can be removed.
- indexObj = indexObj.removeField("background");
-
- try {
- const std::string ns = dbName + ".system.indexes";
- theDataFileMgr.insert(ns.c_str(), indexObj.objdata(), indexObj.objsize(), false, true);
- }
- catch (const DBException& e) {
- log() << "Rebuilding index failed: " << e.what() << " (" << e.getCode() << ")"
- << endl;
- }
- }
-}