diff options
author | Cheahuychou Mao <cheahuychou.mao@mongodb.com> | 2020-03-13 13:04:55 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-03-25 05:57:37 +0000 |
commit | f2ec5e85fdcdb5b34901cc23cec95f9b534841ec (patch) | |
tree | de675a32c0594da367a191bf58522148e7f77159 /src/mongo/db/commands/killoperations_common.h | |
parent | 8124a8d047ce142f6d6defc089e5e71192721a5c (diff) | |
download | mongo-f2ec5e85fdcdb5b34901cc23cec95f9b534841ec.tar.gz |
SERVER-46648 Make _killOperations command kill cursors
(cherry picked from commit 29798df747882fcb02fe98178d42ade0b9a0da52)
Diffstat (limited to 'src/mongo/db/commands/killoperations_common.h')
-rw-r--r-- | src/mongo/db/commands/killoperations_common.h | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/src/mongo/db/commands/killoperations_common.h b/src/mongo/db/commands/killoperations_common.h new file mode 100644 index 00000000000..faf0f7bea5c --- /dev/null +++ b/src/mongo/db/commands/killoperations_common.h @@ -0,0 +1,116 @@ +/** + * Copyright (C) 2020-present MongoDB, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * <http://www.mongodb.com/licensing/server-side-public-license>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the Server Side Public License in all respects for + * all of the code used other than as permitted herein. If you modify file(s) + * with this exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do so, + * delete this exception statement from your version. If you delete this + * exception statement from all source files in the program, then also delete + * it in the license file. + */ + +#define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kCommand + +#include "mongo/platform/basic.h" + +#include "mongo/db/commands/kill_operations_gen.h" + +#include <fmt/format.h> + +#include "mongo/base/init.h" +#include "mongo/base/status.h" +#include "mongo/bson/util/bson_extract.h" +#include "mongo/db/auth/authorization_session.h" +#include "mongo/db/client.h" +#include "mongo/db/commands.h" +#include "mongo/db/commands/test_commands_enabled.h" +#include "mongo/db/operation_context.h" +#include "mongo/db/operation_killer.h" +#include "mongo/db/service_context.h" +#include "mongo/logv2/log.h" + +namespace mongo { + +template <typename Derived> +class KillOperationsCmdBase : public TypedCommand<Derived> { +public: + using Request = KillOperationsRequest; + + class Invocation final : public TypedCommand<Derived>::InvocationBase { + public: + using Base = typename TypedCommand<Derived>::InvocationBase; + using Base::Base; + + void typedRun(OperationContext* opCtx) { + auto opKiller = OperationKiller(opCtx->getClient()); + auto opKeys = Base::request().getOperationKeys(); + + for (auto& opKey : opKeys) { + LOGV2(46156011, "Attempting to kill operation", "operationKey"_attr = opKey); + opKiller.killOperation(OperationKey(opKey)); + } + Derived::killCursors(opCtx, opKeys); + } + + private: + NamespaceString ns() const override { + return NamespaceString(Base::request().getDbName(), ""); + } + + bool supportsWriteConcern() const override { + return false; + } + + void doCheckAuthorization(OperationContext* opCtx) const override { + auto client = opCtx->getClient(); + auto isInternal = AuthorizationSession::get(client)->isAuthorizedForActionsOnResource( + ResourcePattern::forClusterResource(), ActionType::internal); + if (!getTestCommandsEnabled() && !isInternal) { + // Either the mongod/mongos must be in testing mode or this command must come from + // an internal user + uasserted(ErrorCodes::IllegalOperation, + "_killOperations is only to be used by internal users"); + } + + auto opKiller = OperationKiller(client); + if (!opKiller.isGenerallyAuthorizedToKill()) { + // While it's feasible to have coauthorized killers, for now this is intended for + // internal use, so general kill auth is implied. + uasserted(ErrorCodes::Unauthorized, "Unauthorized"); + } + } + }; + +private: + Command::AllowedOnSecondary secondaryAllowed(ServiceContext*) const override { + return Command::AllowedOnSecondary::kAlways; + } + + bool adminOnly() const override { + return true; + } + + std::string help() const override { + return "Internal command -- Kill operations on the target server by OperationKey."; + } +}; + +} // namespace mongo |