diff options
author | Jack Mulrow <jack.mulrow@mongodb.com> | 2020-07-15 22:56:52 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-07-21 17:39:48 +0000 |
commit | 0cb70e9577c46257798d0385b15ec6bff8dbd28d (patch) | |
tree | a81a6efea5ce32e67a5e0193d08e0d69c05305bf /src/mongo/db/keys_collection_manager.cpp | |
parent | a7548e3f0b558d5a8bb936751402cfa0601c34cc (diff) | |
download | mongo-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.cpp | 23 |
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); |