diff options
author | Andrew Chen <andrew.chen@10gen.com> | 2020-02-18 11:37:04 -0500 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-02-18 22:52:43 +0000 |
commit | 1df4904eb4b094c78935f46a5c6a1ee4ee085d46 (patch) | |
tree | de07eaafa0aa0d5605dbf7c23f47de2f2d94702d /src/mongo/db | |
parent | 910101068ecd38781b32dbc71fb0bde5a1df1970 (diff) | |
download | mongo-1df4904eb4b094c78935f46a5c6a1ee4ee085d46.tar.gz |
SERVER-45975: Added --oplogMinRetention cli option
create mode 100644 jstests/noPassthrough/oplog_retention_hours.js
Diffstat (limited to 'src/mongo/db')
-rw-r--r-- | src/mongo/db/mongod_options.cpp | 10 | ||||
-rw-r--r-- | src/mongo/db/mongod_options_storage.idl | 8 | ||||
-rw-r--r-- | src/mongo/db/storage/storage_options.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/storage/storage_options.h | 6 | ||||
-rw-r--r-- | src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp | 30 | ||||
-rw-r--r-- | src/mongo/db/storage/wiredtiger/wiredtiger_record_store_oplog_stones.h | 10 |
6 files changed, 56 insertions, 9 deletions
diff --git a/src/mongo/db/mongod_options.cpp b/src/mongo/db/mongod_options.cpp index d6b4b733e51..9d0030df49e 100644 --- a/src/mongo/db/mongod_options.cpp +++ b/src/mongo/db/mongod_options.cpp @@ -528,6 +528,16 @@ Status storeMongodOptions(const moe::Environment& params) { invariant(replSettings.getOplogSizeBytes() > 0); } + if (params.count("storage.oplogMinRetentionHours")) { + storageGlobalParams.oplogMinRetentionHours.store( + params["storage.oplogMinRetentionHours"].as<double>()); + if (storageGlobalParams.oplogMinRetentionHours.load() < 0) { + return Status(ErrorCodes::BadValue, + "bad --oplogMinRetentionHours, argument must be greater or equal to 0"); + } + invariant(storageGlobalParams.oplogMinRetentionHours.load() >= 0); + } + if (params.count("cacheSize")) { long x = params["cacheSize"].as<long>(); if (x <= 0) { diff --git a/src/mongo/db/mongod_options_storage.idl b/src/mongo/db/mongod_options_storage.idl index 8c51c9e7295..116ad5ecacf 100644 --- a/src/mongo/db/mongod_options_storage.idl +++ b/src/mongo/db/mongod_options_storage.idl @@ -122,3 +122,11 @@ configs: deprecated_short_name: nodur arg_vartype: Switch source: [ cli, ini ] + + 'storage.oplogMinRetentionHours': + description: 'Minimum number of hours to preserve in the oplog. Default is 0 (turned off). Fractions are allowed (e.g. 1.5 hours)' + short_name: oplogMinRetentionHours + arg_vartype: Double + default: 0.0 + validator: + gte: 0.0 diff --git a/src/mongo/db/storage/storage_options.cpp b/src/mongo/db/storage/storage_options.cpp index 5cc702e1302..f9eda312535 100644 --- a/src/mongo/db/storage/storage_options.cpp +++ b/src/mongo/db/storage/storage_options.cpp @@ -55,6 +55,7 @@ void StorageGlobalParams::reset() { syncdelay = 60.0; readOnly = false; groupCollections = false; + oplogMinRetentionHours.store(0.0); } StorageGlobalParams storageGlobalParams; diff --git a/src/mongo/db/storage/storage_options.h b/src/mongo/db/storage/storage_options.h index ceec92d42fb..4202cbc10ef 100644 --- a/src/mongo/db/storage/storage_options.h +++ b/src/mongo/db/storage/storage_options.h @@ -110,6 +110,12 @@ struct StorageGlobalParams { // workloads that rely heavily on creating many collections within a database. bool groupCollections; + // --oplogMinRetentionHours + // Controls what size the oplog should be in addition to oplogSize. If set, the oplog will only + // be truncated if it is over the capped size, and if the bucket of oldest oplog entries fall + // outside of the retention window which is set by this option. + AtomicWord<double> oplogMinRetentionHours; + // Controls whether we allow the OplogStones mechanism to delete oplog history on WT. bool allowOplogTruncation = true; }; diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp index 235cb8f057e..b0719996402 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp @@ -49,6 +49,7 @@ #include "mongo/db/namespace_string.h" #include "mongo/db/operation_context.h" #include "mongo/db/repl/repl_settings.h" +#include "mongo/db/repl/replication_coordinator.h" #include "mongo/db/server_recovery.h" #include "mongo/db/service_context.h" #include "mongo/db/storage/oplog_hack.h" @@ -85,6 +86,8 @@ static const int kMaximumRecordStoreVersion = 1; MONGO_STATIC_ASSERT(kCurrentRecordStoreVersion >= kMinimumRecordStoreVersion); MONGO_STATIC_ASSERT(kCurrentRecordStoreVersion <= kMaximumRecordStoreVersion); +const double kNumSecsInHour = 3600.0; + void checkOplogFormatVersion(OperationContext* opCtx, const std::string& uri) { StatusWith<BSONObj> appMetadata = WiredTigerUtil::getApplicationMetadata(opCtx, uri); fassert(39999, appMetadata); @@ -226,6 +229,33 @@ void WiredTigerRecordStore::OplogStones::awaitHasExcessStonesOrDead() { } } +bool WiredTigerRecordStore::OplogStones::hasExcessStones_inlock() const { + int64_t totalBytes = 0; + for (auto&& stone : _stones) { + totalBytes += stone.bytes; + } + + // check that oplog stones is at capacity + if (totalBytes <= _rs->cappedMaxSize()) { + return false; + } + + double minRetentionHours = storageGlobalParams.oplogMinRetentionHours.load(); + + // if we are not checking for time, then yes, there is a stone to be reaped + // because oplog is at capacity + if (minRetentionHours == 0.0) { + return true; + } + + auto rc = repl::ReplicationCoordinator::get(getGlobalServiceContext()); + double lastAppliedTs = rc->getMyLastAppliedOpTime().getTimestamp().getSecs(); + double lastStoneTs = Timestamp(_stones.front().lastRecord.repr()).getSecs(); + + double currRetentionHours = (lastAppliedTs - lastStoneTs) / kNumSecsInHour; + return currRetentionHours >= minRetentionHours; +} + boost::optional<WiredTigerRecordStore::OplogStones::Stone> WiredTigerRecordStore::OplogStones::peekOldestStoneIfNeeded() const { stdx::lock_guard<Latch> lk(_mutex); diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_record_store_oplog_stones.h b/src/mongo/db/storage/wiredtiger/wiredtiger_record_store_oplog_stones.h index 0dcb844f1d0..15950177e74 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_record_store_oplog_stones.h +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_record_store_oplog_stones.h @@ -57,15 +57,7 @@ public: void kill(); - bool hasExcessStones_inlock() const { - int64_t total_bytes = 0; - for (std::deque<OplogStones::Stone>::const_iterator it = _stones.begin(); - it != _stones.end(); - ++it) { - total_bytes += it->bytes; - } - return total_bytes > _rs->cappedMaxSize(); - } + bool hasExcessStones_inlock() const; void awaitHasExcessStonesOrDead(); |