bool run(OperationContext* opCtx, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result) { const string failPointName(cmdObj.firstElement().str()); FailPointRegistry* registry = getGlobalFailPointRegistry(); FailPoint* failPoint = registry->getFailPoint(failPointName); if (failPoint == NULL) { errmsg = failPointName + " not found"; return false; } FailPoint::Mode mode; FailPoint::ValType val; BSONObj data; std::tie(mode, val, data) = uassertStatusOK(FailPoint::parseBSON(cmdObj)); failPoint->setMode(mode, val, data); warning() << "failpoint: " << failPointName << " set to: " << failPoint->toBSON(); return true; }
TEST(FailPoint, AlwaysOn) { FailPoint failPoint; failPoint.setMode(FailPoint::alwaysOn); ASSERT(failPoint.shouldFail()); MONGO_FAIL_POINT_BLOCK(failPoint, scopedFp) { ASSERT(scopedFp.getData().isEmpty()); }
~Base() { client()->dropCollection(ns()); // Undo fail point set in ctor. FailPointRegistry* registry = getGlobalFailPointRegistry(); FailPoint* failPoint = registry->getFailPoint(kCollscanFetchFpName); failPoint->setMode(FailPoint::off); }
Base() : _context(ns()) { Collection* c = _context.db()->getCollection(ns()); if (!c) { c = _context.db()->createCollection(ns()); } c->getIndexCatalog()->ensureHaveIdIndex(); // We want everything in the collscan to be in memory to avoid spurious fetch // requests. FailPointRegistry* registry = getGlobalFailPointRegistry(); FailPoint* failPoint = registry->getFailPoint(kCollscanFetchFpName); failPoint->setMode(FailPoint::alwaysOn); }
void setGlobalFailPoint(const std::string& failPointName, const BSONObj& cmdObj) { FailPointRegistry* registry = getGlobalFailPointRegistry(); FailPoint* failPoint = registry->getFailPoint(failPointName); if (failPoint == nullptr) uasserted(ErrorCodes::FailPointSetFailed, failPointName + " not found"); FailPoint::Mode mode; FailPoint::ValType val; BSONObj data; std::tie(mode, val, data) = uassertStatusOK(FailPoint::parseBSON(cmdObj)); failPoint->setMode(mode, val, data); warning() << "failpoint: " << failPointName << " set to: " << failPoint->toBSON(); }
void turnOffAlwaysFetch() { FailPointRegistry* registry = getGlobalFailPointRegistry(); FailPoint* failPoint = registry->getFailPoint(kFetchFpName); ASSERT(NULL != failPoint); failPoint->setMode(FailPoint::off); }
bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) { const string failPointName(cmdObj.firstElement().str()); FailPointRegistry* registry = getGlobalFailPointRegistry(); FailPoint* failPoint = registry->getFailPoint(failPointName); if (failPoint == NULL) { errmsg = failPointName + " not found"; return false; } FailPoint::Mode mode = FailPoint::alwaysOn; FailPoint::ValType val = 0; const BSONElement modeElem(cmdObj["mode"]); if (modeElem.eoo()) { result.appendElements(failPoint->toBSON()); return true; } else if (modeElem.type() == String) { const string modeStr(modeElem.valuestr()); if (modeStr == "off") { mode = FailPoint::off; } else if (modeStr == "alwaysOn") { mode = FailPoint::alwaysOn; } else { errmsg = "unknown mode: " + modeStr; return false; } } else if (modeElem.type() == Object) { const BSONObj modeObj(modeElem.Obj()); if (modeObj.hasField("times")) { mode = FailPoint::nTimes; const int intVal = modeObj["times"].numberInt(); if (intVal < 0) { errmsg = "times should be positive"; return false; } val = intVal; } else if (modeObj.hasField("period")) { mode = FailPoint::random; // TODO: implement errmsg = "random is not yet supported"; return false; } else { errmsg = "invalid mode object"; return false; } } else { errmsg = "invalid mode format"; return false; } BSONObj dataObj; if (cmdObj.hasField("data")) { dataObj = cmdObj["data"].Obj(); } failPoint->setMode(mode, val, dataObj); return true; }
bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result) { const string failPointName(cmdObj.firstElement().str()); FailPointRegistry* registry = getGlobalFailPointRegistry(); FailPoint* failPoint = registry->getFailPoint(failPointName); if (failPoint == NULL) { errmsg = failPointName + " not found"; return false; } FailPoint::Mode mode = FailPoint::alwaysOn; FailPoint::ValType val = 0; const BSONElement modeElem(cmdObj["mode"]); if (modeElem.eoo()) { result.appendElements(failPoint->toBSON()); return true; } else if (modeElem.type() == String) { const string modeStr(modeElem.valuestr()); if (modeStr == "off") { mode = FailPoint::off; } else if (modeStr == "alwaysOn") { mode = FailPoint::alwaysOn; } else { errmsg = "unknown mode: " + modeStr; return false; } } else if (modeElem.type() == Object) { const BSONObj modeObj(modeElem.Obj()); if (modeObj.hasField("times")) { mode = FailPoint::nTimes; const int intVal = modeObj["times"].numberInt(); if (intVal < 0) { errmsg = "times should be positive"; return false; } val = intVal; } else if (modeObj.hasField("activationProbability")) { mode = FailPoint::random; const double activationProbability = modeObj["activationProbability"].numberDouble(); if (activationProbability < 0 || activationProbability > 1) { errmsg = str::stream() << "activationProbability must be between 0.0 and 1.0; found " << activationProbability; return false; } val = static_cast<int32_t>(std::numeric_limits<int32_t>::max() * activationProbability); } else { errmsg = "invalid mode object"; return false; } } else { errmsg = "invalid mode format"; return false; } BSONObj dataObj; if (cmdObj.hasField("data")) { dataObj = cmdObj["data"].Obj(); } failPoint->setMode(mode, val, dataObj); return true; }