summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands/fail_point_cmd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/commands/fail_point_cmd.cpp')
-rw-r--r--src/mongo/db/commands/fail_point_cmd.cpp57
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