From ec2e483944eeacaff87149da28ba765c7cabe536 Mon Sep 17 00:00:00 2001 From: Clarisse Cheah Date: Wed, 15 Feb 2023 02:06:49 +0000 Subject: Add parameter and validator --- src/mongo/db/ftdc/ftdc_mongod.cpp | 20 ++++++++++++++++++++ src/mongo/db/ftdc/ftdc_mongod.h | 5 +++++ .../db/storage/wiredtiger/wiredtiger_kv_engine.cpp | 4 ++++ .../db/storage/wiredtiger/wiredtiger_parameters.idl | 13 ++++++++++++- .../db/storage/wiredtiger/wiredtiger_util_test.cpp | 7 +++++++ 5 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/mongo/db/ftdc/ftdc_mongod.cpp b/src/mongo/db/ftdc/ftdc_mongod.cpp index 7b4b4468d25..54aff9028bf 100644 --- a/src/mongo/db/ftdc/ftdc_mongod.cpp +++ b/src/mongo/db/ftdc/ftdc_mongod.cpp @@ -64,6 +64,26 @@ Status validateCollectionStatsNamespaces(const std::vector value, return Status::OK(); } +Status validateExtraDiagnostics(const std::vector value) { + try { + std::string flagArr[] = { "all", "concurrent_access", "data_validation", "invalid_op", "out_of_order", + "panic", "slow_operation", "visibility" }; + + for (const auto& diagFlag : value) { + bool exists = std::find(std::begin(flagArr), std::end(flagArr), diagFlag) != std::end(flagArr); + + if (!exists) { + return Status(ErrorCodes::BadValue, + fmt::format("'{}' is not a valid flag option", diagFlag)); + } + } + } catch (...) { + return exceptionToStatus(); + } + + return Status::OK(); +} + namespace { class FTDCCollectionStatsCollector final : public FTDCCollectorInterface { diff --git a/src/mongo/db/ftdc/ftdc_mongod.h b/src/mongo/db/ftdc/ftdc_mongod.h index 9108c39ee57..ca064f757be 100644 --- a/src/mongo/db/ftdc/ftdc_mongod.h +++ b/src/mongo/db/ftdc/ftdc_mongod.h @@ -55,4 +55,9 @@ void stopMongoDFTDC(); Status validateCollectionStatsNamespaces(std::vector value, const boost::optional& tenantId); +/** + * Validation callback for extra diagnostics setParameter + */ +Status validateExtraDiagnostics(std::vector value); + } // namespace mongo diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp index 257e755c928..ac5f4362967 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp @@ -47,6 +47,7 @@ #include "mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h" +#include #include #include #include @@ -363,6 +364,9 @@ WiredTigerKVEngine::WiredTigerKVEngine(OperationContext* opCtx, if (gWiredTigerEvictionDirtyTargetGB) ss << "eviction_dirty_target=" << static_cast(gWiredTigerEvictionDirtyTargetGB * 1024) << "MB,"; + if (!gWiredTigerExtraDiagnostics.empty()) + ss << "extra_diagnostics=[" + << boost::algorithm::join(gWiredTigerExtraDiagnostics, ",") << "],"; if (gWiredTigerEvictionDirtyMaxGB) ss << "eviction_dirty_trigger=" << static_cast(gWiredTigerEvictionDirtyMaxGB * 1024) << "MB,"; diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.idl b/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.idl index 7a26b0190e5..c02771e1b5c 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.idl +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.idl @@ -110,7 +110,7 @@ server_parameters: cpp_vartype: 'double' cpp_varname: gWiredTigerEvictionDirtyTargetGB default: 0 - validator: + : gte: 0.01 lte: 10000 @@ -150,6 +150,17 @@ server_parameters: validator: gte: 1 + wiredTigerExtraDiagnostics: + description: >- + Extra diagnostics that can be enabled in release mode including diagnostic assertions that can cause WiredTiger to abort upon + detected invalid state. Valid options include: ["all", "concurrent_access", "data_validation", "invalid_op", "out_of_order", + "panic", "slow_operation", "visibility"] + set_at: [startup, runtime] + cpp_vartype: 'synchronized_value>' + cpp_varname: "gwiredTigerExtraDiagnostics" + validator: + callback: validateExtraDiagnostics + wiredTigerFileHandleCloseMinimum: description: >- The number of handles open before the WiredTiger file manager will look for handles to close. diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_util_test.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_util_test.cpp index 83851b4ba9b..515ca8bfe0e 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_util_test.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_util_test.cpp @@ -146,6 +146,13 @@ private: std::unique_ptr _opCtx; }; +TEST_F(WiredTigerUtilMetadataTest, GetMetadataCreateExtraDiagnostics) { + StatusWith result = + WiredTigerUtil::getMetadataCreate(getOperationContext(), getURI()); + ASSERT_NOT_OK(result.getStatus()); + ASSERT_EQUALS(ErrorCodes::NoSuchKey, result.getStatus().code()); +} + TEST_F(WiredTigerUtilMetadataTest, GetMetadataCreateInvalid) { StatusWith result = WiredTigerUtil::getMetadataCreate(getOperationContext(), getURI()); -- cgit v1.2.1