diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mongo/db/ftdc/ftdc_mongod.cpp | 20 | ||||
-rw-r--r-- | src/mongo/db/ftdc/ftdc_mongod.h | 5 | ||||
-rw-r--r-- | src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/storage/wiredtiger/wiredtiger_parameters.idl | 13 | ||||
-rw-r--r-- | src/mongo/db/storage/wiredtiger/wiredtiger_util_test.cpp | 7 |
5 files changed, 48 insertions, 1 deletions
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<std::string> value, return Status::OK(); } +Status validateExtraDiagnostics(const std::vector<std::string> 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<std::string> value, const boost::optional<TenantId>& tenantId); +/** + * Validation callback for extra diagnostics setParameter + */ +Status validateExtraDiagnostics(std::vector<std::string> 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 <boost/algorithm/string/join.hpp> #include <boost/filesystem.hpp> #include <boost/filesystem/fstream.hpp> #include <boost/filesystem/operations.hpp> @@ -363,6 +364,9 @@ WiredTigerKVEngine::WiredTigerKVEngine(OperationContext* opCtx, if (gWiredTigerEvictionDirtyTargetGB) ss << "eviction_dirty_target=" << static_cast<size_t>(gWiredTigerEvictionDirtyTargetGB * 1024) << "MB,"; + if (!gWiredTigerExtraDiagnostics.empty()) + ss << "extra_diagnostics=[" + << boost::algorithm::join(gWiredTigerExtraDiagnostics, ",") << "],"; if (gWiredTigerEvictionDirtyMaxGB) ss << "eviction_dirty_trigger=" << static_cast<size_t>(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<std::vector<std::string>>' + 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<OperationContext> _opCtx; }; +TEST_F(WiredTigerUtilMetadataTest, GetMetadataCreateExtraDiagnostics) { + StatusWith<std::string> result = + WiredTigerUtil::getMetadataCreate(getOperationContext(), getURI()); + ASSERT_NOT_OK(result.getStatus()); + ASSERT_EQUALS(ErrorCodes::NoSuchKey, result.getStatus().code()); +} + TEST_F(WiredTigerUtilMetadataTest, GetMetadataCreateInvalid) { StatusWith<std::string> result = WiredTigerUtil::getMetadataCreate(getOperationContext(), getURI()); |