Skip to main content

arc_malachitebft_engine/util/
msg_buffer.rs

1use std::collections::VecDeque;
2
3use malachitebft_core_types::Context;
4use tracing::{info, warn};
5
6use crate::consensus::ConsensusMsg;
7
8pub struct MessageBuffer<Ctx: Context> {
9    messages: VecDeque<ConsensusMsg<Ctx>>,
10    max_size: usize,
11}
12
13impl<Ctx: Context> MessageBuffer<Ctx> {
14    pub fn new(max_size: usize) -> Self {
15        Self {
16            messages: VecDeque::new(),
17            max_size,
18        }
19    }
20
21    pub fn buffer(&mut self, msg: ConsensusMsg<Ctx>) -> bool {
22        if self.messages.len() < self.max_size {
23            info!("Buffering message: {msg:?}");
24            self.messages.push_back(msg);
25            true
26        } else {
27            warn!("Buffer is full, dropping message: {msg:?}");
28            false
29        }
30    }
31
32    pub fn pop(&mut self) -> Option<ConsensusMsg<Ctx>> {
33        self.messages.pop_front()
34    }
35
36    pub fn is_empty(&self) -> bool {
37        self.messages.is_empty()
38    }
39
40    pub fn len(&self) -> usize {
41        self.messages.len()
42    }
43}