Skip to main content

middleware_core/discovery/
lease_health.rs

1use std::time::{Duration, Instant};
2
3use super::SimpleDiscovery;
4use super::state_helpers::{
5    DiscoveryEntryKind, active_count, collect_inactive_names, inactive_count,
6    increment_prune_report, renew_lease, set_health,
7};
8use super::types::{DiscoveryInactiveReason, DiscoveryPruneReport, DiscoverySnapshot};
9
10impl SimpleDiscovery {
11    pub fn renew_topic_lease(&mut self, name: &str, ttl: Duration) -> bool {
12        renew_lease(self.topics.contains(name), &mut self.topic_state, name, ttl)
13    }
14
15    pub fn renew_service_lease(&mut self, name: &str, ttl: Duration) -> bool {
16        renew_lease(
17            self.services.contains(name),
18            &mut self.service_state,
19            name,
20            ttl,
21        )
22    }
23
24    pub fn renew_mission_lease(&mut self, name: &str, ttl: Duration) -> bool {
25        renew_lease(
26            self.missions.contains(name),
27            &mut self.mission_state,
28            name,
29            ttl,
30        )
31    }
32
33    pub fn renew_endpoint_lease(&mut self, name: &str, ttl: Duration) -> bool {
34        renew_lease(
35            self.endpoints.contains_key(name),
36            &mut self.endpoint_state,
37            name,
38            ttl,
39        )
40    }
41
42    pub fn set_topic_health(&mut self, name: &str, healthy: bool) -> bool {
43        set_health(
44            self.topics.contains(name),
45            &mut self.topic_state,
46            name,
47            healthy,
48        )
49    }
50
51    pub fn set_service_health(&mut self, name: &str, healthy: bool) -> bool {
52        set_health(
53            self.services.contains(name),
54            &mut self.service_state,
55            name,
56            healthy,
57        )
58    }
59
60    pub fn set_mission_health(&mut self, name: &str, healthy: bool) -> bool {
61        set_health(
62            self.missions.contains(name),
63            &mut self.mission_state,
64            name,
65            healthy,
66        )
67    }
68
69    pub fn set_endpoint_health(&mut self, name: &str, healthy: bool) -> bool {
70        set_health(
71            self.endpoints.contains_key(name),
72            &mut self.endpoint_state,
73            name,
74            healthy,
75        )
76    }
77
78    pub fn prune_inactive(&mut self) -> DiscoveryPruneReport {
79        let now = Instant::now();
80        let mut report = DiscoveryPruneReport::default();
81
82        let inactive_topics = collect_inactive_names(self.topics.iter(), &self.topic_state, now);
83        for (name, reason) in inactive_topics {
84            self.topics.remove(&name);
85            self.topic_state.remove(&name);
86            self.remove_labels_if_unused(&name);
87            increment_prune_report(&mut report, reason, DiscoveryEntryKind::Topic);
88        }
89
90        let inactive_services =
91            collect_inactive_names(self.services.iter(), &self.service_state, now);
92        for (name, reason) in inactive_services {
93            self.services.remove(&name);
94            self.service_state.remove(&name);
95            self.remove_labels_if_unused(&name);
96            increment_prune_report(&mut report, reason, DiscoveryEntryKind::Service);
97        }
98
99        let inactive_missions =
100            collect_inactive_names(self.missions.iter(), &self.mission_state, now);
101        for (name, reason) in inactive_missions {
102            self.missions.remove(&name);
103            self.mission_state.remove(&name);
104            self.remove_labels_if_unused(&name);
105            increment_prune_report(&mut report, reason, DiscoveryEntryKind::Mission);
106        }
107
108        let inactive_endpoints =
109            collect_inactive_names(self.endpoints.keys(), &self.endpoint_state, now);
110        for (name, reason) in inactive_endpoints {
111            self.endpoints.remove(&name);
112            self.endpoint_state.remove(&name);
113            self.remove_labels_if_unused(&name);
114            increment_prune_report(&mut report, reason, DiscoveryEntryKind::Endpoint);
115        }
116
117        report
118    }
119
120    pub fn snapshot(&self) -> DiscoverySnapshot {
121        let now = Instant::now();
122        DiscoverySnapshot {
123            topics: active_count(self.topics.iter(), &self.topic_state, now),
124            services: active_count(self.services.iter(), &self.service_state, now),
125            missions: active_count(self.missions.iter(), &self.mission_state, now),
126            endpoints: active_count(self.endpoints.keys(), &self.endpoint_state, now),
127            expired: inactive_count(
128                self.topics.iter(),
129                &self.topic_state,
130                now,
131                DiscoveryInactiveReason::Expired,
132            ) + inactive_count(
133                self.services.iter(),
134                &self.service_state,
135                now,
136                DiscoveryInactiveReason::Expired,
137            ) + inactive_count(
138                self.missions.iter(),
139                &self.mission_state,
140                now,
141                DiscoveryInactiveReason::Expired,
142            ) + inactive_count(
143                self.endpoints.keys(),
144                &self.endpoint_state,
145                now,
146                DiscoveryInactiveReason::Expired,
147            ),
148            unhealthy: inactive_count(
149                self.topics.iter(),
150                &self.topic_state,
151                now,
152                DiscoveryInactiveReason::Unhealthy,
153            ) + inactive_count(
154                self.services.iter(),
155                &self.service_state,
156                now,
157                DiscoveryInactiveReason::Unhealthy,
158            ) + inactive_count(
159                self.missions.iter(),
160                &self.mission_state,
161                now,
162                DiscoveryInactiveReason::Unhealthy,
163            ) + inactive_count(
164                self.endpoints.keys(),
165                &self.endpoint_state,
166                now,
167                DiscoveryInactiveReason::Unhealthy,
168            ),
169        }
170    }
171}