scirs2_core/distributed/cluster/
events.rs

1//! Cluster event logging and tracking
2//!
3//! This module provides event logging capabilities for tracking
4//! cluster activities, node changes, and system events.
5
6use std::collections::VecDeque;
7
8use super::types::ClusterEvent;
9
10/// Cluster event logging
11#[derive(Debug)]
12pub struct ClusterEventLog {
13    events: VecDeque<ClusterEvent>,
14    max_events: usize,
15}
16
17impl Default for ClusterEventLog {
18    fn default() -> Self {
19        Self::new()
20    }
21}
22
23impl ClusterEventLog {
24    /// Create a new cluster event log
25    pub fn new() -> Self {
26        Self {
27            events: VecDeque::with_capacity(10000usize),
28            max_events: 10000,
29        }
30    }
31
32    /// Create a new event log with a specific capacity
33    pub fn with_capacity(max_events: usize) -> Self {
34        Self {
35            events: VecDeque::with_capacity(max_events),
36            max_events,
37        }
38    }
39
40    /// Log a new event
41    pub fn log_event(&mut self, event: ClusterEvent) {
42        self.events.push_back(event);
43
44        // Maintain max size
45        while self.events.len() > self.max_events {
46            self.events.pop_front();
47        }
48    }
49
50    /// Get the most recent events
51    pub fn get_recent_events(&self, count: usize) -> Vec<ClusterEvent> {
52        self.events.iter().rev().take(count).cloned().collect()
53    }
54
55    /// Get all events
56    pub fn get_all_events(&self) -> Vec<ClusterEvent> {
57        self.events.iter().cloned().collect()
58    }
59
60    /// Get events in chronological order (oldest first)
61    pub fn get_events_chronological(&self) -> Vec<ClusterEvent> {
62        self.events.iter().cloned().collect()
63    }
64
65    /// Get the number of events stored
66    pub fn event_count(&self) -> usize {
67        self.events.len()
68    }
69
70    /// Clear all events
71    pub fn clear(&mut self) {
72        self.events.clear();
73    }
74
75    /// Set the maximum number of events to store
76    pub fn set_max_events(&mut self, max_events: usize) {
77        self.max_events = max_events;
78
79        // Trim events if necessary
80        while self.events.len() > self.max_events {
81            self.events.pop_front();
82        }
83    }
84
85    /// Get the maximum number of events that can be stored
86    pub fn get_max_events(&self) -> usize {
87        self.max_events
88    }
89
90    /// Check if the event log is empty
91    pub fn is_empty(&self) -> bool {
92        self.events.is_empty()
93    }
94
95    /// Check if the event log is full
96    pub fn is_full(&self) -> bool {
97        self.events.len() >= self.max_events
98    }
99
100    /// Get events matching a specific filter
101    pub fn get_filtered_events<F>(&self, filter: F) -> Vec<ClusterEvent>
102    where
103        F: Fn(&ClusterEvent) -> bool,
104    {
105        self.events
106            .iter()
107            .filter(|event| filter(event))
108            .cloned()
109            .collect()
110    }
111
112    /// Get the oldest event
113    pub fn get_oldest_event(&self) -> Option<&ClusterEvent> {
114        self.events.front()
115    }
116
117    /// Get the newest event
118    pub fn get_newest_event(&self) -> Option<&ClusterEvent> {
119        self.events.back()
120    }
121}