diff options
Diffstat (limited to 'src/mongo/db/commands/fail_point_cmd.cpp')
-rw-r--r-- | src/mongo/db/commands/fail_point_cmd.cpp | 57 |
1 files changed, 55 insertions, 2 deletions
diff --git a/src/mongo/db/commands/fail_point_cmd.cpp b/src/mongo/db/commands/fail_point_cmd.cpp index 4eb0d3e3a02..ffc7783b52d 100644 --- a/src/mongo/db/commands/fail_point_cmd.cpp +++ b/src/mongo/db/commands/fail_point_cmd.cpp @@ -37,6 +37,7 @@ #include "mongo/db/auth/privilege.h" #include "mongo/db/commands.h" #include "mongo/db/commands/test_commands_enabled.h" +#include "mongo/s/request_types/wait_for_fail_point_gen.h" #include "mongo/util/fail_point.h" #include "mongo/util/log.h" @@ -102,10 +103,62 @@ public: const BSONObj& cmdObj, BSONObjBuilder& result) override { const std::string failPointName(cmdObj.firstElement().str()); - setGlobalFailPoint(failPointName, cmdObj); - + const auto timesEntered = setGlobalFailPoint(failPointName, cmdObj); + result.appendIntOrLL("count", timesEntered); return true; } }; + +/** + * Command for waiting for installed fail points. + */ +class WaitForFailPointCommand : public TypedCommand<WaitForFailPointCommand> { +public: + using Request = WaitForFailPoint; + class Invocation final : public InvocationBase { + public: + using InvocationBase::InvocationBase; + + void typedRun(OperationContext* opCtx) { + const std::string failPointName = request().getCommandParameter().toString(); + FailPoint* failPoint = globalFailPointRegistry().find(failPointName); + if (failPoint == nullptr) + uasserted(ErrorCodes::FailPointSetFailed, failPointName + " not found"); + failPoint->waitForTimesEntered(opCtx, request().getTimesEntered()); + } + + private: + bool supportsWriteConcern() const override { + return false; + } + + // The command parameter happens to be string so it's historically been interpreted + // by parseNs as a collection. Continuing to do so here for unexamined compatibility. + NamespaceString ns() const override { + return NamespaceString(request().getDbName(), ""); + } + + // No auth needed because it only works when enabled via command line. + void doCheckAuthorization(OperationContext* opCtx) const override {} + }; + + std::string help() const override { + return "wait for a fail point to be entered a certain number of times"; + } + + AllowedOnSecondary secondaryAllowed(ServiceContext*) const override { + return AllowedOnSecondary::kAlways; + } + + bool adminOnly() const override { + return true; + } + + bool requiresAuth() const override { + return false; + } + +} WaitForFailPointCmd; + MONGO_REGISTER_TEST_COMMAND(FaultInjectCmd); } // namespace mongo |