Beispiel #1
0
    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;
    }
Beispiel #2
0
    TEST(FailPoint, AlwaysOn) {
        FailPoint failPoint;
        failPoint.setMode(FailPoint::alwaysOn);
        ASSERT(failPoint.shouldFail());

        MONGO_FAIL_POINT_BLOCK(failPoint, scopedFp) {
            ASSERT(scopedFp.getData().isEmpty());
        }
Beispiel #3
0
        ~Base() {
            client()->dropCollection(ns());

            // Undo fail point set in ctor.
            FailPointRegistry* registry = getGlobalFailPointRegistry();
            FailPoint* failPoint = registry->getFailPoint(kCollscanFetchFpName);
            failPoint->setMode(FailPoint::off);
        }
Beispiel #4
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);
        }
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();
}
Beispiel #6
0
 void turnOffAlwaysFetch() {
     FailPointRegistry* registry = getGlobalFailPointRegistry();
     FailPoint* failPoint = registry->getFailPoint(kFetchFpName);
     ASSERT(NULL != failPoint);
     failPoint->setMode(FailPoint::off);
 }
Beispiel #7
0
 TEST(FailPoint, InitialState) {
     FailPoint failPoint;
     ASSERT_FALSE(failPoint.shouldFail());
 }
Beispiel #8
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;
        }
    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;
    }