Skip to main content

sozu_lib/protocol/mux/
debug.rs

1//! Debug history ring buffer and event enum.
2//!
3//! Used by the mux layer to record a bounded trail of per-session events for
4//! post-mortem inspection when `debug_assertions` are enabled. In release
5//! builds `push` and `set_interesting` are no-ops.
6
7use std::collections::VecDeque;
8
9use kawa::ParsingPhase;
10use mio::Token;
11use sozu_command::ready::Ready;
12
13use super::{BackendConnectionError, MuxResult, Readiness, StreamState};
14
15/// Maximum number of debug events retained in the ring buffer.
16/// Oldest entries are dropped when this limit is reached.
17pub(super) const DEBUG_HISTORY_CAPACITY: usize = 512;
18
19pub struct DebugHistory {
20    pub events: VecDeque<DebugEvent>,
21    pub is_interesting: bool,
22}
23impl Default for DebugHistory {
24    fn default() -> Self {
25        Self {
26            events: VecDeque::with_capacity(DEBUG_HISTORY_CAPACITY),
27            is_interesting: false,
28        }
29    }
30}
31impl DebugHistory {
32    pub fn new() -> Self {
33        Self::default()
34    }
35    pub fn push(&mut self, _event: DebugEvent) {
36        #[cfg(debug_assertions)]
37        {
38            if self.events.len() >= DEBUG_HISTORY_CAPACITY {
39                self.events.pop_front();
40            }
41            self.events.push_back(_event);
42        }
43    }
44    pub fn set_interesting(&mut self, _interesting: bool) {
45        #[cfg(debug_assertions)]
46        {
47            self.is_interesting = _interesting;
48        }
49    }
50    pub fn is_interesting(&self) -> bool {
51        #[cfg(debug_assertions)]
52        {
53            self.is_interesting
54        }
55        #[cfg(not(debug_assertions))]
56        {
57            false
58        }
59    }
60}
61
62#[derive(Debug)]
63pub enum DebugEvent {
64    EV(Token, Ready),
65    ReadyTimestamp(usize),
66    LoopStart,
67    LoopIteration(i32),
68    SR(Token, MuxResult, Readiness),
69    SW(Token, MuxResult, Readiness),
70    CW(Token, MuxResult, Readiness),
71    CR(Token, MuxResult, Readiness),
72    CC(usize, StreamState),
73    CCS(Token, String),
74    CCF(usize, BackendConnectionError),
75    CH(Token, Readiness),
76    S(u32, usize, ParsingPhase, usize, usize),
77    Str(String),
78    StreamEvent(usize, usize),
79    SocketIO(usize, usize, usize),
80}