query_runtime/attempt/
queue.rs1#[cfg(test)]
3use std::sync::MutexGuard;
4use std::{
5 collections::VecDeque,
6 sync::{
7 Arc, Mutex,
8 atomic::{AtomicU64, Ordering},
9 },
10};
11
12use crate::observability::QueryAttemptReport;
13
14#[derive(Debug, Default)]
20pub struct AttemptBackendCounters {
21 pub(crate) attempts_begun: AtomicU64,
22 pub(crate) reports_ready: AtomicU64,
23 pub(crate) completion_queue_pushed: AtomicU64,
24 pub(crate) completion_queue_overflowed: AtomicU64,
25}
26
27#[derive(Debug, Clone, Copy, PartialEq, Eq)]
31pub struct AttemptBackendCountersSnapshot {
32 pub attempts_begun: u64,
34 pub reports_ready: u64,
36 pub completion_queue_pushed: u64,
38 pub completion_queue_overflowed: u64,
40}
41
42impl AttemptBackendCounters {
43 pub(crate) fn snapshot(&self) -> AttemptBackendCountersSnapshot {
44 AttemptBackendCountersSnapshot {
45 attempts_begun: self.attempts_begun.load(Ordering::Acquire),
46 reports_ready: self.reports_ready.load(Ordering::Acquire),
47 completion_queue_pushed: self.completion_queue_pushed.load(Ordering::Acquire),
48 completion_queue_overflowed: self.completion_queue_overflowed.load(Ordering::Acquire),
49 }
50 }
51}
52
53#[derive(Debug)]
59pub struct AttemptCompletionQueue {
60 capacity: usize,
61 queue: Mutex<VecDeque<Arc<QueryAttemptReport>>>,
62}
63
64impl AttemptCompletionQueue {
65 pub fn new(capacity: usize) -> Option<Self> {
67 (capacity > 0).then(|| Self { capacity, queue: Mutex::new(VecDeque::new()) })
68 }
69
70 pub(crate) fn try_push(&self, report: Arc<QueryAttemptReport>) -> bool {
72 let mut queue = self.queue.lock().unwrap_or_else(std::sync::PoisonError::into_inner);
75 if queue.len() == self.capacity {
76 false
77 } else {
78 queue.push_back(report);
79 true
80 }
81 }
82 pub(crate) fn drain(&self, max: usize) -> Vec<Arc<QueryAttemptReport>> {
83 let mut queue = self.queue.lock().unwrap_or_else(std::sync::PoisonError::into_inner);
84 let n = max.min(queue.len());
85 queue.drain(..n).collect()
86 }
87
88 #[cfg(test)]
91 pub(super) fn hold_lock_for_test(&self) -> MutexGuard<'_, VecDeque<Arc<QueryAttemptReport>>> {
92 self.queue.lock().unwrap_or_else(std::sync::PoisonError::into_inner)
93 }
94}