summaryrefslogtreecommitdiff
path: root/src/mongo/db
diff options
context:
space:
mode:
authorAndrew Chen <andrew.chen@10gen.com>2020-02-18 11:37:04 -0500
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-02-18 22:52:43 +0000
commit1df4904eb4b094c78935f46a5c6a1ee4ee085d46 (patch)
treede07eaafa0aa0d5605dbf7c23f47de2f2d94702d /src/mongo/db
parent910101068ecd38781b32dbc71fb0bde5a1df1970 (diff)
downloadmongo-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.cpp10
-rw-r--r--src/mongo/db/mongod_options_storage.idl8
-rw-r--r--src/mongo/db/storage/storage_options.cpp1
-rw-r--r--src/mongo/db/storage/storage_options.h6
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp30
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_record_store_oplog_stones.h10
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();