From 417ad412a29642585573f29c13851e8d40c3f8f0 Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Tue, 3 Nov 2026 22:23:52 -0500 Subject: [PATCH] perf(engine): keep each events.poll topic once (#1935) The topic list was validated but not deduplicated, and it is scanned for every retained event while the log's lock is held, so a request repeating one topic thousands of times multiplied that work. Repeats collapse and a list naming all is just all. --- crates/engine/src/events.rs | 7 +++++-- crates/engine/src/events_tests.rs | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/crates/engine/src/events.rs b/crates/engine/src/events.rs index fbc1b9b6c..05433412c 100644 --- a/crates/engine/src/events.rs +++ b/crates/engine/src/events.rs @@ -127,12 +127,15 @@ pub fn topics(v: Option<&Value>) -> Result, String> { for t in list { let Some(s) = t.as_str() else { return Err("`topics` must be an array of strings".into()) }; match s { + // Each once: the list is scanned for every retained event under the log's lock, so + // a long list of repeats would multiply that work. + "comments" | "document" | "all" if out.iter().any(|t| t == s) => {} "comments" | "document" | "all" => out.push(s.to_string()), other => return Err(format!("unknown topic `{other}` (comments, document, all)")), } } - if out.is_empty() { - out.push("all".into()); + if out.is_empty() || out.iter().any(|t| t == "all") { + out = vec!["all".into()]; } Ok(out) } diff --git a/crates/engine/src/events_tests.rs b/crates/engine/src/events_tests.rs index 36b118a79..9cdef52ca 100644 --- a/crates/engine/src/events_tests.rs +++ b/crates/engine/src/events_tests.rs @@ -193,6 +193,10 @@ fn topics_parse_and_reject_unknown_names() { assert_eq!(events::topics(Some(&json!([]))).unwrap(), vec!["all".to_string()]); assert_eq!(events::topics(Some(&json!(["comments", "document"]))).unwrap(), vec!["comments".to_string(), "document".to_string()]); assert!(events::topics(Some(&json!(["nope"]))).is_err()); + // Repeats collapse (the list is scanned per event under the log's lock), and `all` is all. + let many: Vec<&str> = std::iter::repeat_n("comments", 10_000).chain(["document"]).collect(); + assert_eq!(events::topics(Some(&json!(many))).unwrap(), vec!["comments".to_string(), "document".to_string()]); + assert_eq!(events::topics(Some(&json!(["comments", "all", "document"]))).unwrap(), vec!["all".to_string()]); assert!(events::topics(Some(&json!("comments"))).is_err()); }