summaryrefslogtreecommitdiff
path: root/src/mongo/db/keys_collection_manager.cpp
diff options
context:
space:
mode:
authorJack Mulrow <jack.mulrow@mongodb.com>2020-07-15 22:56:52 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-07-21 17:39:48 +0000
commit0cb70e9577c46257798d0385b15ec6bff8dbd28d (patch)
treea81a6efea5ce32e67a5e0193d08e0d69c05305bf /src/mongo/db/keys_collection_manager.cpp
parenta7548e3f0b558d5a8bb936751402cfa0601c34cc (diff)
downloadmongo-0cb70e9577c46257798d0385b15ec6bff8dbd28d.tar.gz
SERVER-48709 Fix overflow in key manager wake up calculation
Diffstat (limited to 'src/mongo/db/keys_collection_manager.cpp')
-rw-r--r--src/mongo/db/keys_collection_manager.cpp23
1 files changed, 12 insertions, 11 deletions
diff --git a/src/mongo/db/keys_collection_manager.cpp b/src/mongo/db/keys_collection_manager.cpp
index dd3277bdd1b..ff11c1779c3 100644
--- a/src/mongo/db/keys_collection_manager.cpp
+++ b/src/mongo/db/keys_collection_manager.cpp
@@ -61,14 +61,15 @@ Milliseconds kMaxRefreshWaitTime(10 * 60 * 1000);
// a successful refresh.
MONGO_FAIL_POINT_DEFINE(maxKeyRefreshWaitTimeOverrideMS);
-/**
- * Returns the amount of time to wait until the monitoring thread should attempt to refresh again.
- */
+} // unnamed namespace
+
+namespace keys_collection_manager_util {
+
Milliseconds howMuchSleepNeedFor(const LogicalTime& currentTime,
const LogicalTime& latestExpiredAt,
const Milliseconds& interval) {
- auto currentSecs = currentTime.asTimestamp().getSecs();
- auto expiredSecs = latestExpiredAt.asTimestamp().getSecs();
+ auto currentSecs = Seconds(currentTime.asTimestamp().getSecs());
+ auto expiredSecs = Seconds(latestExpiredAt.asTimestamp().getSecs());
if (currentSecs >= expiredSecs) {
// This means that the last round didn't generate a usable key for the current time.
@@ -76,16 +77,16 @@ Milliseconds howMuchSleepNeedFor(const LogicalTime& currentTime,
return kRefreshIntervalIfErrored;
}
- auto millisBeforeExpire = 1000 * (expiredSecs - currentSecs);
+ Milliseconds millisBeforeExpire = Milliseconds(expiredSecs) - Milliseconds(currentSecs);
- if (interval.count() <= millisBeforeExpire) {
+ if (interval <= millisBeforeExpire) {
return interval;
}
- return Milliseconds(millisBeforeExpire);
+ return millisBeforeExpire;
}
-} // unnamed namespace
+} // namespace keys_collection_manager_util
KeysCollectionManager::KeysCollectionManager(std::string purpose,
std::unique_ptr<KeysCollectionClient> client,
@@ -255,8 +256,8 @@ void KeysCollectionManager::PeriodicRunner::_doPeriodicRefresh(ServiceContext* s
_hasSeenKeys.store(true);
- nextWakeup =
- howMuchSleepNeedFor(currentTime, latestKey.getExpiresAt(), refreshInterval);
+ nextWakeup = keys_collection_manager_util::howMuchSleepNeedFor(
+ currentTime, latestKey.getExpiresAt(), refreshInterval);
} else {
errorCount += 1;
nextWakeup = Milliseconds(kRefreshIntervalIfErrored.count() * errorCount);