summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Cameron <alex.cameron@mongodb.com>2019-09-24 01:09:29 +0000
committerevergreen <evergreen@mongodb.com>2019-09-24 01:09:29 +0000
commit1833f38080379a231f2bc4ec8fe4e9a6ae2cb0dc (patch)
tree7348f9f52315435695d05f9df1648c377a739cfc
parentf1d805f6ee74fd3399bcd9a170281c93a7a44405 (diff)
downloadmongo-1833f38080379a231f2bc4ec8fe4e9a6ae2cb0dc.tar.gz
SERVER-39004 Introduce a quota mechanism for the overflow file
(cherry picked from commit b29c22ad4b89dccca63bd2a279c48f47f76093d1) (cherry picked from commit b6f1010451de1a10e12c4b6d865476cce284afce) (cherry picked from commit b571e1a50d9990690f86539127cc2d119ec0edae) SERVER-42814 Remove informational message on overflow file size quota (cherry picked from commit 8f8fb6f1b84134e8a6ab33e13e840916af0a6280)
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_global_options.cpp26
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_global_options.h4
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_init.cpp5
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp2
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h3
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_parameters.cpp67
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_parameters.h13
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_prefixed_record_store_test.cpp1
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_standard_record_store_test.cpp1
9 files changed, 121 insertions, 1 deletions
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_global_options.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_global_options.cpp
index 342220766dc..eb1ea5b60d1 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_global_options.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_global_options.cpp
@@ -79,6 +79,13 @@ Status WiredTigerGlobalOptions::add(moe::OptionSection* options) {
"WiredTiger storage engine custom "
"configuration settings")
.hidden();
+ wiredTigerOptions
+ .addOptionChaining("storage.wiredTiger.engineConfig.maxCacheOverflowFileSizeGB",
+ "wiredTigerMaxCacheOverflowFileSizeGB",
+ moe::Double,
+ "Maximum amount of disk space to use for cache overflow; "
+ "Defaults to 0 (unbounded)")
+ .setDefault(moe::Value(0.0));
// WiredTiger collection options
wiredTigerOptions
@@ -142,6 +149,16 @@ Status WiredTigerGlobalOptions::store(const moe::Environment& params,
params["storage.wiredTiger.engineConfig.configString"].as<std::string>();
log() << "Engine custom option: " << wiredTigerGlobalOptions.engineConfig;
}
+ if (params.count("storage.wiredTiger.engineConfig.maxCacheOverflowFileSizeGB")) {
+ const auto val =
+ params["storage.wiredTiger.engineConfig.maxCacheOverflowFileSizeGB"].as<double>();
+ const auto result = validateMaxCacheOverflowFileSizeGB(val);
+ if (result.isOK()) {
+ wiredTigerGlobalOptions.maxCacheOverflowFileSizeGB = val;
+ } else {
+ return result;
+ }
+ }
// WiredTiger collection options
if (params.count("storage.wiredTiger.collectionConfig.blockCompressor")) {
@@ -168,4 +185,13 @@ Status WiredTigerGlobalOptions::store(const moe::Environment& params,
return Status::OK();
}
+Status WiredTigerGlobalOptions::validateMaxCacheOverflowFileSizeGB(double value) {
+ if (value != 0.0 && value < 0.1) {
+ return {ErrorCodes::BadValue,
+ "MaxCacheOverflowFileSizeGB must be either 0 (unbounded) or greater than 0.1."};
+ }
+
+ return Status::OK();
+}
+
} // namespace mongo
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_global_options.h b/src/mongo/db/storage/wiredtiger/wiredtiger_global_options.h
index 2dda59efc14..a591b30e97e 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_global_options.h
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_global_options.h
@@ -46,6 +46,7 @@ public:
checkpointDelaySecs(0),
statisticsLogDelaySecs(0),
directoryForIndexes(false),
+ maxCacheOverflowFileSizeGB(0),
useCollectionPrefixCompression(false),
useIndexPrefixCompression(false){};
@@ -57,6 +58,7 @@ public:
size_t statisticsLogDelaySecs;
std::string journalCompressor;
bool directoryForIndexes;
+ double maxCacheOverflowFileSizeGB;
std::string engineConfig;
std::string collectionBlockCompressor;
@@ -65,6 +67,8 @@ public:
bool useIndexPrefixCompression;
std::string collectionConfig;
std::string indexConfig;
+
+ static Status validateMaxCacheOverflowFileSizeGB(double);
};
extern WiredTigerGlobalOptions wiredTigerGlobalOptions;
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_init.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_init.cpp
index 4cdd0a42670..d3ff71e7284 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_init.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_init.cpp
@@ -102,12 +102,15 @@ public:
}
}
const bool ephemeral = false;
+ const auto maxCacheOverflowMB =
+ static_cast<size_t>(1024 * wiredTigerGlobalOptions.maxCacheOverflowFileSizeGB);
WiredTigerKVEngine* kv =
new WiredTigerKVEngine(getCanonicalName().toString(),
params.dbpath,
getGlobalServiceContext()->getFastClockSource(),
wiredTigerGlobalOptions.engineConfig,
cacheMB,
+ maxCacheOverflowMB,
params.dur,
ephemeral,
params.repair,
@@ -117,6 +120,8 @@ public:
// Intentionally leaked.
new WiredTigerServerStatusSection(kv);
new WiredTigerEngineRuntimeConfigParameter(kv);
+ new WiredTigerMaxCacheOverflowSizeGBParameter(
+ kv, wiredTigerGlobalOptions.maxCacheOverflowFileSizeGB);
KVStorageEngineOptions options;
options.directoryPerDB = params.directoryperdb;
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp
index 7679ee747a4..bee770385b5 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp
@@ -381,6 +381,7 @@ WiredTigerKVEngine::WiredTigerKVEngine(const std::string& canonicalName,
ClockSource* cs,
const std::string& extraOpenOptions,
size_t cacheSizeMB,
+ size_t maxCacheOverflowFileSizeMB,
bool durable,
bool ephemeral,
bool repair,
@@ -412,6 +413,7 @@ WiredTigerKVEngine::WiredTigerKVEngine(const std::string& canonicalName,
std::stringstream ss;
ss << "create,";
ss << "cache_size=" << cacheSizeMB << "M,";
+ ss << "cache_overflow=(file_max=" << maxCacheOverflowFileSizeMB << "M),";
ss << "session_max=20000,";
ss << "eviction=(threads_min=4,threads_max=4),";
ss << "config_base=false,";
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h
index aaab436821b..c84921f45dd 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h
@@ -63,7 +63,8 @@ public:
const std::string& path,
ClockSource* cs,
const std::string& extraOpenOptions,
- size_t cacheSizeGB,
+ size_t cacheSizeMB,
+ size_t maxCacheOverflowFileSizeMB,
bool durable,
bool ephemeral,
bool repair,
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.cpp
index f34bbb16026..b929317f22d 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.cpp
@@ -41,6 +41,37 @@ namespace mongo {
using std::string;
+namespace {
+
+Status applyMaxCacheOverflowSizeGBParameter(WiredTigerMaxCacheOverflowSizeGBParameter& param,
+ double value) {
+ if (value != 0.0 && value < 0.1) {
+ return {ErrorCodes::BadValue,
+ "MaxCacheOverflowFileSizeGB must be either 0 (unbounded) or greater than 0.1."};
+ }
+
+ const auto valueMB = static_cast<size_t>(1024 * value);
+
+ log() << "Reconfiguring WiredTiger max cache overflow size with value: \"" << valueMB << "MB\'";
+
+ invariant(param._data.second);
+ int ret = param._data.second->reconfigure(
+ std::string(str::stream() << "cache_overflow=(file_max=" << valueMB << "M)").c_str());
+ if (ret != 0) {
+ string result =
+ (str::stream() << "WiredTiger reconfiguration failed with error code (" << ret << "): "
+ << wiredtiger_strerror(ret));
+ error() << result;
+
+ return Status(ErrorCodes::BadValue, result);
+ }
+
+ param._data.first = value;
+ return Status::OK();
+}
+
+} // namespace
+
WiredTigerEngineRuntimeConfigParameter::WiredTigerEngineRuntimeConfigParameter(
WiredTigerKVEngine* engine)
: ServerParameter(
@@ -95,4 +126,40 @@ Status WiredTigerEngineRuntimeConfigParameter::setFromString(const std::string&
_currentValue = str;
return Status::OK();
}
+
+WiredTigerMaxCacheOverflowSizeGBParameter::WiredTigerMaxCacheOverflowSizeGBParameter(
+ WiredTigerKVEngine* engine, double value)
+ : ServerParameter(
+ ServerParameterSet::getGlobal(), "wiredTigerMaxCacheOverflowSizeGB", false, true),
+ _data(value, engine) {}
+
+void WiredTigerMaxCacheOverflowSizeGBParameter::append(OperationContext* opCtx,
+ BSONObjBuilder& b,
+ const std::string& name) {
+ b << name << _data.first;
}
+
+Status WiredTigerMaxCacheOverflowSizeGBParameter::set(const BSONElement& element) {
+ if (element.type() == String) {
+ return setFromString(element.valuestrsafe());
+ }
+
+ double value;
+ if (!element.coerce(&value)) {
+ return {ErrorCodes::BadValue, "MaxCacheOverflowFileSizeGB must be a numeric value."};
+ }
+
+ return applyMaxCacheOverflowSizeGBParameter(*this, value);
+}
+
+Status WiredTigerMaxCacheOverflowSizeGBParameter::setFromString(const std::string& str) {
+ double value;
+ const auto status = parseNumberFromString(str, &value);
+ if (!status.isOK()) {
+ return status;
+ }
+
+ return applyMaxCacheOverflowSizeGBParameter(*this, value);
+}
+
+} // namespace mongo
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.h b/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.h
index 1c622c6ab0a..f506710354c 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.h
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.h
@@ -59,4 +59,17 @@ private:
// starts out as the empty string.
std::string _currentValue;
};
+
+class WiredTigerMaxCacheOverflowSizeGBParameter : public ServerParameter {
+ MONGO_DISALLOW_COPYING(WiredTigerMaxCacheOverflowSizeGBParameter);
+
+public:
+ WiredTigerMaxCacheOverflowSizeGBParameter(WiredTigerKVEngine* engine, double value);
+
+ virtual void append(OperationContext* opCtx, BSONObjBuilder& b, const std::string& name);
+ virtual Status set(const BSONElement& newValueElement);
+ virtual Status setFromString(const std::string& str);
+
+ std::pair<double, WiredTigerKVEngine*> _data;
+};
}
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_prefixed_record_store_test.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_prefixed_record_store_test.cpp
index 807dbab852a..48ef200aed5 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_prefixed_record_store_test.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_prefixed_record_store_test.cpp
@@ -76,6 +76,7 @@ public:
_cs.get(),
"",
1,
+ 0,
false,
false,
false,
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_standard_record_store_test.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_standard_record_store_test.cpp
index ff510ccdb25..f32615f2a76 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_standard_record_store_test.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_standard_record_store_test.cpp
@@ -79,6 +79,7 @@ public:
&_cs,
extraStrings.toString(),
1,
+ 0,
false,
false,
false,