diff options
author | Louis Williams <louis.williams@mongodb.com> | 2023-03-28 11:58:12 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2023-03-28 13:31:34 +0000 |
commit | 3e46a0ef81dfe95c11d9c5324fb86758b155363d (patch) | |
tree | 4765dcec524645178d080d79fca5db2ceb302a34 /src/mongo/util/concurrency/ticketholder.cpp | |
parent | a6ac9a1fe19da49b7067e802bf498d7fc0dcb5af (diff) | |
download | mongo-3e46a0ef81dfe95c11d9c5324fb86758b155363d.tar.gz |
SERVER-74778 Refactor and improve performance of PriorityTicketHolder
Diffstat (limited to 'src/mongo/util/concurrency/ticketholder.cpp')
-rw-r--r-- | src/mongo/util/concurrency/ticketholder.cpp | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/src/mongo/util/concurrency/ticketholder.cpp b/src/mongo/util/concurrency/ticketholder.cpp index d755b665626..03ef2ec90a4 100644 --- a/src/mongo/util/concurrency/ticketholder.cpp +++ b/src/mongo/util/concurrency/ticketholder.cpp @@ -43,7 +43,7 @@ namespace mongo { namespace { void updateQueueStatsOnRelease(ServiceContext* serviceContext, - TicketHolderWithQueueingStats::QueueStats& queueStats, + TicketHolder::QueueStats& queueStats, AdmissionContext* admCtx) { queueStats.totalFinishedProcessing.fetchAndAddRelaxed(1); auto startTime = admCtx->getStartProcessingTime(); @@ -53,7 +53,7 @@ void updateQueueStatsOnRelease(ServiceContext* serviceContext, } void updateQueueStatsOnTicketAcquisition(ServiceContext* serviceContext, - TicketHolderWithQueueingStats::QueueStats& queueStats, + TicketHolder::QueueStats& queueStats, AdmissionContext* admCtx) { if (admCtx->getAdmissions() == 0) { queueStats.totalNewAdmissions.fetchAndAddRelaxed(1); @@ -63,34 +63,34 @@ void updateQueueStatsOnTicketAcquisition(ServiceContext* serviceContext, } } // namespace -void TicketHolderWithQueueingStats::resize(int32_t newSize) noexcept { +void TicketHolder::resize(int32_t newSize) noexcept { stdx::lock_guard<Latch> lk(_resizeMutex); _resize(newSize, _outof.load()); _outof.store(newSize); } -void TicketHolderWithQueueingStats::appendStats(BSONObjBuilder& b) const { +void TicketHolder::appendStats(BSONObjBuilder& b) const { b.append("out", used()); b.append("available", available()); b.append("totalTickets", outof()); + b.append("immediatePriorityAdmissionsCount", getImmediatePriorityAdmissionsCount()); _appendImplStats(b); } -void TicketHolderWithQueueingStats::_releaseToTicketPool(AdmissionContext* admCtx) noexcept { +void TicketHolder::_releaseToTicketPool(AdmissionContext* admCtx) noexcept { auto& queueStats = _getQueueStatsToUse(admCtx); updateQueueStatsOnRelease(_serviceContext, queueStats, admCtx); _releaseToTicketPoolImpl(admCtx); } -Ticket TicketHolderWithQueueingStats::waitForTicket(OperationContext* opCtx, - AdmissionContext* admCtx) { +Ticket TicketHolder::waitForTicket(OperationContext* opCtx, AdmissionContext* admCtx) { auto res = waitForTicketUntil(opCtx, admCtx, Date_t::max()); invariant(res); return std::move(*res); } -boost::optional<Ticket> TicketHolderWithQueueingStats::tryAcquire(AdmissionContext* admCtx) { +boost::optional<Ticket> TicketHolder::tryAcquire(AdmissionContext* admCtx) { // 'kImmediate' operations should always bypass the ticketing system. invariant(admCtx && admCtx->getPriority() != AdmissionContext::Priority::kImmediate); auto ticket = _tryAcquireImpl(admCtx); @@ -104,9 +104,9 @@ boost::optional<Ticket> TicketHolderWithQueueingStats::tryAcquire(AdmissionConte } -boost::optional<Ticket> TicketHolderWithQueueingStats::waitForTicketUntil(OperationContext* opCtx, - AdmissionContext* admCtx, - Date_t until) { +boost::optional<Ticket> TicketHolder::waitForTicketUntil(OperationContext* opCtx, + AdmissionContext* admCtx, + Date_t until) { invariant(admCtx && admCtx->getPriority() != AdmissionContext::Priority::kImmediate); // Attempt a quick acquisition first. @@ -145,11 +145,11 @@ boost::optional<Ticket> TicketHolderWithQueueingStats::waitForTicketUntil(Operat } } -int32_t TicketHolderWithQueueingStats::getAndResetPeakUsed() { +int32_t TicketHolder::getAndResetPeakUsed() { return _peakUsed.swap(used()); } -void TicketHolderWithQueueingStats::_updatePeakUsed() { +void TicketHolder::_updatePeakUsed() { if (!feature_flags::gFeatureFlagExecutionControl.isEnabledAndIgnoreFCV()) { return; } @@ -161,8 +161,7 @@ void TicketHolderWithQueueingStats::_updatePeakUsed() { } } -void TicketHolderWithQueueingStats::_appendCommonQueueImplStats(BSONObjBuilder& b, - const QueueStats& stats) const { +void TicketHolder::_appendCommonQueueImplStats(BSONObjBuilder& b, const QueueStats& stats) const { auto removed = stats.totalRemovedQueue.loadRelaxed(); auto added = stats.totalAddedQueue.loadRelaxed(); @@ -195,6 +194,16 @@ boost::optional<Ticket> MockTicketHolder::waitForTicketUntil(OperationContext*, return {}; } +boost::optional<Ticket> MockTicketHolder::_tryAcquireImpl(AdmissionContext* admCtx) { + return boost::none; +} + +boost::optional<Ticket> MockTicketHolder::_waitForTicketUntilImpl(OperationContext* opCtx, + AdmissionContext* admCtx, + Date_t until) { + return boost::none; +} + void MockTicketHolder::setUsed(int32_t used) { _used = used; if (_used > _peakUsed) { |