diff options
author | Kristina <kristina@10gen.com> | 2012-11-12 11:50:12 -0500 |
---|---|---|
committer | Kristina <kristina@10gen.com> | 2012-11-12 11:50:12 -0500 |
commit | 3abcc53d43145bcda52016c753e10ff139d41e4d (patch) | |
tree | 8ed28904a6e433949420ccd9229e6d9721eaa4d9 /src/mongo/db/index_rebuilder.cpp | |
parent | 074431815cdfc44ad757675a159e3e51739d1d95 (diff) | |
download | mongo-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.cpp | 112 |
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; - } - } -} |