mirror of
https://github.com/kanidm/kanidm.git
synced 2025-02-23 20:47:01 +01:00
Add measurement of lock acquisition (#2946)
This commit is contained in:
parent
f82a52de3b
commit
1fbe65b351
|
@ -1337,7 +1337,8 @@ impl QueryServer {
|
||||||
self.resolve_filter_cache.try_quiesce();
|
self.resolve_filter_cache.try_quiesce();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn read(&self) -> QueryServerReadTransaction<'_> {
|
#[instrument(level = "debug", skip_all)]
|
||||||
|
async fn read_acquire_ticket(&self) -> (SemaphorePermit<'_>, SemaphorePermit<'_>) {
|
||||||
// Get a read ticket. Basically this forces us to queue with other readers, while preventing
|
// Get a read ticket. Basically this forces us to queue with other readers, while preventing
|
||||||
// us from competing with writers on the db tickets. This tilts us to write prioritising
|
// us from competing with writers on the db tickets. This tilts us to write prioritising
|
||||||
// on db operations by always making sure a writer can get a db ticket.
|
// on db operations by always making sure a writer can get a db ticket.
|
||||||
|
@ -1371,6 +1372,14 @@ impl QueryServer {
|
||||||
.expect("unable to acquire db_ticket for qsr")
|
.expect("unable to acquire db_ticket for qsr")
|
||||||
};
|
};
|
||||||
|
|
||||||
|
(read_ticket, db_ticket)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn read(&self) -> QueryServerReadTransaction<'_> {
|
||||||
|
let (read_ticket, db_ticket) = self.read_acquire_ticket().await;
|
||||||
|
// Point of no return - we now have a DB thread AND the read ticket, we MUST complete
|
||||||
|
// as soon as possible! The following locks and elements below are SYNCHRONOUS but
|
||||||
|
// will never be contented at this point, and will always progress.
|
||||||
let schema = self.schema.read();
|
let schema = self.schema.read();
|
||||||
|
|
||||||
let cid_max = self.cid_max.read();
|
let cid_max = self.cid_max.read();
|
||||||
|
@ -1397,7 +1406,8 @@ impl QueryServer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn write(&self, curtime: Duration) -> QueryServerWriteTransaction<'_> {
|
#[instrument(level = "debug", skip_all)]
|
||||||
|
async fn write_acquire_ticket(&self) -> (SemaphorePermit<'_>, SemaphorePermit<'_>) {
|
||||||
// Guarantee we are the only writer on the thread pool
|
// Guarantee we are the only writer on the thread pool
|
||||||
#[allow(clippy::expect_used)]
|
#[allow(clippy::expect_used)]
|
||||||
let write_ticket = if cfg!(test) {
|
let write_ticket = if cfg!(test) {
|
||||||
|
@ -1427,6 +1437,12 @@ impl QueryServer {
|
||||||
.expect("unable to acquire db_ticket for qsw")
|
.expect("unable to acquire db_ticket for qsw")
|
||||||
};
|
};
|
||||||
|
|
||||||
|
(write_ticket, db_ticket)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn write(&self, curtime: Duration) -> QueryServerWriteTransaction<'_> {
|
||||||
|
let (write_ticket, db_ticket) = self.write_acquire_ticket().await;
|
||||||
|
|
||||||
// Point of no return - we now have a DB thread AND the write ticket, we MUST complete
|
// Point of no return - we now have a DB thread AND the write ticket, we MUST complete
|
||||||
// as soon as possible! The following locks and elements below are SYNCHRONOUS but
|
// as soon as possible! The following locks and elements below are SYNCHRONOUS but
|
||||||
// will never be contented at this point, and will always progress.
|
// will never be contented at this point, and will always progress.
|
||||||
|
|
Loading…
Reference in a new issue