summaryrefslogtreecommitdiff
path: root/src/mongo/db/concurrency/lock_state.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/concurrency/lock_state.h')
-rw-r--r--src/mongo/db/concurrency/lock_state.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/mongo/db/concurrency/lock_state.h b/src/mongo/db/concurrency/lock_state.h
index 9ef575ae56a..a95d4268be2 100644
--- a/src/mongo/db/concurrency/lock_state.h
+++ b/src/mongo/db/concurrency/lock_state.h
@@ -444,6 +444,35 @@ private:
/**
+ * RAII-style class to opt out of the ticket acquisition mechanism when acquiring a global lock.
+ *
+ * Operations that acquire the global lock but do not use any storage engine resources are eligible
+ * to skip ticket acquisition. Otherwise, a ticket acquisition is required to prevent throughput
+ * from suffering under high load.
+ */
+class SkipTicketAcquisitionForLock {
+public:
+ SkipTicketAcquisitionForLock(const SkipTicketAcquisitionForLock&) = delete;
+ SkipTicketAcquisitionForLock& operator=(const SkipTicketAcquisitionForLock&) = delete;
+ explicit SkipTicketAcquisitionForLock(OperationContext* opCtx)
+ : _opCtx(opCtx), _shouldAcquireTicket(_opCtx->lockState()->shouldAcquireTicket()) {
+ if (_shouldAcquireTicket) {
+ _opCtx->lockState()->skipAcquireTicket();
+ }
+ }
+
+ ~SkipTicketAcquisitionForLock() {
+ if (_shouldAcquireTicket) {
+ _opCtx->lockState()->setAcquireTicket();
+ }
+ }
+
+private:
+ OperationContext* _opCtx;
+ const bool _shouldAcquireTicket;
+};
+
+/**
* Retrieves the global lock manager instance.
*/
LockManager* getGlobalLockManager();