示例#1
0
        ~Base() {
            client()->dropCollection(ns());

            // Undo fail point set in ctor.
            FailPointRegistry* registry = getGlobalFailPointRegistry();
            FailPoint* failPoint = registry->getFailPoint(kCollscanFetchFpName);
            failPoint->setMode(FailPoint::off);
        }
示例#2
0
        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);
        }
示例#3
0
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();
}
示例#4
0
 void turnOffAlwaysFetch() {
     FailPointRegistry* registry = getGlobalFailPointRegistry();
     FailPoint* failPoint = registry->getFailPoint(kFetchFpName);
     ASSERT(NULL != failPoint);
     failPoint->setMode(FailPoint::off);
 }
示例#5
0
FailPointEnableBlock::FailPointEnableBlock(const std::string& failPointName) {
    _failPoint = getGlobalFailPointRegistry()->getFailPoint(failPointName);
    invariant(_failPoint != nullptr);
    _failPoint->setMode(FailPoint::alwaysOn);
}
示例#6
0
        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;
        }