void IndexBuilder::run() { Client::initThread(name().c_str()); LOG(2) << "IndexBuilder building index " << _index; OperationContextImpl txn; txn.lockState()->setIsBatchWriter(true); txn.getClient()->getAuthorizationSession()->grantInternalAuthorization(); txn.getCurOp()->reset(HostAndPort(), dbInsert); NamespaceString ns(_index["ns"].String()); ScopedTransaction transaction(&txn, MODE_IX); Lock::DBLock dlk(txn.lockState(), ns.db(), MODE_X); Client::Context ctx(&txn, ns.getSystemIndexesCollection()); Database* db = dbHolder().get(&txn, ns.db().toString()); Status status = _build(&txn, db, true, &dlk); if ( !status.isOK() ) { error() << "IndexBuilder could not build index: " << status.toString(); fassert(28555, ErrorCodes::isInterruption(status.code())); } txn.getClient()->shutdown(); }
static void replMasterThread() { sleepsecs(4); Client::initThread("replmaster"); int toSleep = 10; while (1) { sleepsecs(toSleep); // Write a keep-alive like entry to the log. This will make things like // printReplicationStatus() and printSlaveReplicationStatus() stay up-to-date even // when things are idle. OperationContextImpl txn; txn.getClient()->getAuthorizationSession()->grantInternalAuthorization(); Lock::GlobalWrite globalWrite(txn.lockState(), 1); if (globalWrite.isLocked()) { toSleep = 10; try { WriteUnitOfWork wuow(&txn); logKeepalive(&txn); wuow.commit(); } catch (...) { log() << "caught exception in replMasterThread()" << endl; } } else { LOG(5) << "couldn't logKeepalive" << endl; toSleep = 1; } } }
static void replSlaveThread() { sleepsecs(1); Client::initThread("replslave"); OperationContextImpl txn; txn.getClient()->getAuthorizationSession()->grantInternalAuthorization(); while (1) { try { replMain(&txn); sleepsecs(5); } catch (AssertionException&) { ReplInfo r("Assertion in replSlaveThread(): sleeping 5 minutes before retry"); log() << "Assertion in replSlaveThread(): sleeping 5 minutes before retry" << endl; sleepsecs(300); } catch (DBException& e) { log() << "exception in replSlaveThread(): " << e.what() << ", sleeping 5 minutes before retry" << endl; sleepsecs(300); } catch (...) { log() << "error in replSlaveThread(): sleeping 5 minutes before retry" << endl; sleepsecs(300); } } }
void restartInProgressIndexesFromLastShutdown() { OperationContextImpl txn; txn.getClient()->getAuthorizationSession()->grantInternalAuthorization(); std::vector<std::string> dbNames; StorageEngine* storageEngine = getGlobalEnvironment()->getGlobalStorageEngine(); storageEngine->listDatabases( &dbNames ); try { std::list<std::string> collNames; for (std::vector<std::string>::const_iterator dbName = dbNames.begin(); dbName < dbNames.end(); ++dbName) { Client::ReadContext ctx(&txn, *dbName); Database* db = ctx.ctx().db(); db->getDatabaseCatalogEntry()->getCollectionNamespaces(&collNames); } checkNS(&txn, collNames); } catch (const DBException& e) { error() << "Index rebuilding did not complete: " << e.toString(); log() << "note: restart the server with --noIndexBuildRetry to skip index rebuilds"; fassertFailedNoTrace(18643); } LOG(1) << "checking complete" << endl; }
void IndexBuilder::run() { LOG(2) << "IndexBuilder building index " << _index; OperationContextImpl txn; Client::initThread(name().c_str()); Lock::ParallelBatchWriterMode::iAmABatchParticipant(txn.lockState()); cc().getAuthorizationSession()->grantInternalAuthorization(); txn.getCurOp()->reset(HostAndPort(), dbInsert); NamespaceString ns(_index["ns"].String()); Client::WriteContext ctx(&txn, ns.getSystemIndexesCollection()); Database* db = dbHolder().get(&txn, ns.db().toString()); Status status = build(&txn, db, true); if ( !status.isOK() ) { log() << "IndexBuilder could not build index: " << status.toString(); } ctx.commit(); txn.getClient()->shutdown(); }