middleware_core/discovery/
lease_health.rs1use 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}