Skip to content

Commit ae980ef

Browse files
committed
refactor: improve efficiency and maintainability based on code review
- Optimize start_listener to avoid second hashmap lookup - Simplify stop_listener using remove() directly instead of get_mut + drain + remove - Extract duplicated test code into create_test_listener_config helper function - Improve code readability and performance Signed-off-by: Eeshu-Yadav <[email protected]>
1 parent 0f16e12 commit ae980ef

File tree

1 file changed

+21
-36
lines changed

1 file changed

+21
-36
lines changed

orion-lib/src/listeners/listeners_manager.rs

Lines changed: 21 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -145,21 +145,20 @@ impl ListenersManager {
145145

146146
let listener_info = ListenerInfo::new(join_handle, listener_conf, version);
147147

148-
self.listener_handles.entry(listener_name.clone()).or_insert_with(Vec::new).push(listener_info);
149-
150-
info!("Listener {} now has {} active version(s)", listener_name, self.listener_handles.get(&listener_name).unwrap().len());
148+
let versions = self.listener_handles.entry(listener_name.clone()).or_default();
149+
versions.push(listener_info);
150+
info!("Listener {} now has {} active version(s)", listener_name, versions.len());
151151

152152
Ok(())
153153
}
154154

155155
pub fn stop_listener(&mut self, listener_name: &str) -> Result<()> {
156-
if let Some(listeners) = self.listener_handles.get_mut(listener_name) {
156+
if let Some(listeners) = self.listener_handles.remove(listener_name) {
157157
info!("Stopping all {} version(s) of listener {}", listeners.len(), listener_name);
158-
for listener_info in listeners.drain(..) {
158+
for listener_info in listeners {
159159
info!("Stopping listener {} version {}", listener_name, listener_info.version);
160160
listener_info.handle.abort();
161161
}
162-
self.listener_handles.remove(listener_name);
163162
} else {
164163
info!("No listeners found with name {}", listener_name);
165164
}
@@ -179,6 +178,19 @@ mod tests {
179178
use orion_configuration::config::Listener as ListenerConfig;
180179
use tracing_test::traced_test;
181180

181+
fn create_test_listener_config(name: &str, port: u16) -> ListenerConfig {
182+
ListenerConfig {
183+
name: name.into(),
184+
address: SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), port),
185+
filter_chains: HashMap::default(),
186+
bind_device: None,
187+
with_tls_inspector: false,
188+
proxy_protocol_config: None,
189+
with_tlv_listener_filter: false,
190+
tlv_listener_filter_config: None,
191+
}
192+
}
193+
182194
#[traced_test]
183195
#[tokio::test]
184196
async fn start_listener_dup() {
@@ -277,50 +289,23 @@ mod tests {
277289
let (routeb_tx1, routeb_rx) = broadcast::channel(chan);
278290
let (_secb_tx1, secb_rx) = broadcast::channel(chan);
279291
let l1 = Listener::test_listener(name, routeb_rx, secb_rx);
280-
let l1_info = ListenerConfig {
281-
name: name.into(),
282-
address: SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 1234),
283-
filter_chains: HashMap::default(),
284-
bind_device: None,
285-
with_tls_inspector: false,
286-
proxy_protocol_config: None,
287-
with_tlv_listener_filter: false,
288-
tlv_listener_filter_config: None,
289-
};
292+
let l1_info = create_test_listener_config(name, 1234);
290293
man.start_listener(l1, l1_info).unwrap();
291294
assert!(routeb_tx1.send(RouteConfigurationChange::Removed("n/a".into())).is_ok());
292295
tokio::task::yield_now().await;
293296

294297
let (routeb_tx2, routeb_rx) = broadcast::channel(chan);
295298
let (_secb_tx2, secb_rx) = broadcast::channel(chan);
296299
let l2 = Listener::test_listener(name, routeb_rx, secb_rx);
297-
let l2_info = ListenerConfig {
298-
name: name.into(),
299-
address: SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 1235), // Different port
300-
filter_chains: HashMap::default(),
301-
bind_device: None,
302-
with_tls_inspector: false,
303-
proxy_protocol_config: None,
304-
with_tlv_listener_filter: false,
305-
tlv_listener_filter_config: None,
306-
};
300+
let l2_info = create_test_listener_config(name, 1235);
307301
man.start_listener(l2, l2_info).unwrap();
308302
assert!(routeb_tx2.send(RouteConfigurationChange::Removed("n/a".into())).is_ok());
309303
tokio::task::yield_now().await;
310304

311305
let (routeb_tx3, routeb_rx) = broadcast::channel(chan);
312306
let (_secb_tx3, secb_rx) = broadcast::channel(chan);
313307
let l3 = Listener::test_listener(name, routeb_rx, secb_rx);
314-
let l3_info = ListenerConfig {
315-
name: name.into(),
316-
address: SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 1236), // Different port
317-
filter_chains: HashMap::default(),
318-
bind_device: None,
319-
with_tls_inspector: false,
320-
proxy_protocol_config: None,
321-
with_tlv_listener_filter: false,
322-
tlv_listener_filter_config: None,
323-
};
308+
let l3_info = create_test_listener_config(name, 1236);
324309
man.start_listener(l3, l3_info).unwrap();
325310
assert!(routeb_tx3.send(RouteConfigurationChange::Removed("n/a".into())).is_ok());
326311
tokio::task::yield_now().await;

0 commit comments

Comments
 (0)