From e1cc33aa73ec3aef730a1f3595fd56a3192e619e Mon Sep 17 00:00:00 2001 From: Jack Doughty Date: Tue, 8 Sep 2026 15:26:23 +0100 Subject: [PATCH 1/6] Added fast arg & implementation --- src/howl.rs | 43 ++++++++++++++++++++++++++++--------------- src/main.rs | 5 +++++ 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/howl.rs b/src/howl.rs index 3d6ad62..f5e9bf1 100644 --- a/src/howl.rs +++ b/src/howl.rs @@ -116,7 +116,7 @@ fn generate_run_stop<'a>(fbb: &'a mut FlatBufferBuilder<'_>, job_id: &str) -> &' fn produce_messages( producer: &ThreadedProducer, - fbb: &mut FlatBufferBuilder, + mut fbb: &mut FlatBufferBuilder, rng: &mut ThreadRng, frame: u32, conf: &HowlConfig, @@ -147,24 +147,36 @@ fn produce_messages( } } + let ev44 = generate_fake_events( + &mut fbb, + rng, + frame, + conf.event_message_config, + now_nanos, + ).to_vec(); + for _ in 0..conf.messages_per_frame { - match producer.send( - BaseRecord::to(conf.event_topic) + if *conf.fast{ + let _ = producer.send(BaseRecord::to(conf.event_topic) + .key("") + .payload(&ev44) + .timestamp(now_nanos / 1_000_000)) + .inspect_err(|e| error!("Failed to send messages: {}", e.0)); + + } else { + let _ = producer.send(BaseRecord::to(conf.event_topic) .key("") .payload(generate_fake_events( - fbb, - rng, - frame, - conf.event_message_config, - now_nanos, - )) - .timestamp(now_nanos / 1_000_000), - ) { - Ok(_) => {} - Err(err) => { - error!("Failed to send messages: {}", err.0); + &mut fbb, + rng, + frame, + conf.event_message_config, + now_nanos, + ) + ) + .timestamp(now_nanos / 1_000_000)) + .inspect_err(|e| error!("Failed to send messages: {}", e.0)); } - } } if conf.frames_per_run > 0 && frame.is_multiple_of(conf.frames_per_run) { @@ -273,6 +285,7 @@ pub struct HowlConfig<'a> { pub frames_per_run: u32, pub veto_probability: f64, // 1 = always vetoed, 0 = never vetoed pub event_message_config: &'a EventMessageConfig, + pub fast: &'a bool, pub kafka_config: Option>, } diff --git a/src/main.rs b/src/main.rs index fa13210..10b01c5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -98,6 +98,9 @@ enum Commands { /// Veto probability (0 = never vetoed; 1 = always vetoed) #[arg(long, default_value = "0.0")] veto_probability: f64, + /// Enable howl fast mode (Disables randomised ev44 blob generation) + #[arg(long, action=clap::ArgAction::SetTrue)] + fast: bool, // Additonal command line arguments #[arg(short = 'X', long)] kafka_config: Option>, @@ -164,6 +167,7 @@ async fn main() { det_min, det_max, veto_probability, + fast, kafka_config, } => howl(&HowlConfig { kafka_config, @@ -181,6 +185,7 @@ async fn main() { det_max, }, veto_probability, + fast: &fast, }), Commands::Count { topic, From ab7a69e4d84fc5e69acdb28af263936951eb1e31 Mon Sep 17 00:00:00 2001 From: Jack Doughty Date: Tue, 8 Sep 2026 15:41:03 +0100 Subject: [PATCH 2/6] Formatting --- src/howl.rs | 51 +++++++++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/src/howl.rs b/src/howl.rs index f5e9bf1..773e07d 100644 --- a/src/howl.rs +++ b/src/howl.rs @@ -116,7 +116,7 @@ fn generate_run_stop<'a>(fbb: &'a mut FlatBufferBuilder<'_>, job_id: &str) -> &' fn produce_messages( producer: &ThreadedProducer, - mut fbb: &mut FlatBufferBuilder, + fbb: &mut FlatBufferBuilder, rng: &mut ThreadRng, frame: u32, conf: &HowlConfig, @@ -147,36 +147,35 @@ fn produce_messages( } } - let ev44 = generate_fake_events( - &mut fbb, - rng, - frame, - conf.event_message_config, - now_nanos, - ).to_vec(); + let ev44 = + generate_fake_events(&mut fbb, rng, frame, conf.event_message_config, now_nanos).to_vec(); for _ in 0..conf.messages_per_frame { - if *conf.fast{ - let _ = producer.send(BaseRecord::to(conf.event_topic) - .key("") - .payload(&ev44) - .timestamp(now_nanos / 1_000_000)) + if *conf.fast { + let _ = producer + .send( + BaseRecord::to(conf.event_topic) + .key("") + .payload(&ev44) + .timestamp(now_nanos / 1_000_000), + ) .inspect_err(|e| error!("Failed to send messages: {}", e.0)); - - } else { - let _ = producer.send(BaseRecord::to(conf.event_topic) - .key("") - .payload(generate_fake_events( - &mut fbb, - rng, - frame, - conf.event_message_config, - now_nanos, - ) + } else { + let _ = producer + .send( + BaseRecord::to(conf.event_topic) + .key("") + .payload(generate_fake_events( + &mut fbb, + rng, + frame, + conf.event_message_config, + now_nanos, + )) + .timestamp(now_nanos / 1_000_000), ) - .timestamp(now_nanos / 1_000_000)) .inspect_err(|e| error!("Failed to send messages: {}", e.0)); - } + } } if conf.frames_per_run > 0 && frame.is_multiple_of(conf.frames_per_run) { From 009611ff9d15ecb9203348b2552974abdfdc4cd8 Mon Sep 17 00:00:00 2001 From: Jack Doughty Date: Tue, 8 Sep 2026 15:44:44 +0100 Subject: [PATCH 3/6] Re-added mut before fbb arg in produce_messages --- src/howl.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/howl.rs b/src/howl.rs index 773e07d..5c05315 100644 --- a/src/howl.rs +++ b/src/howl.rs @@ -116,7 +116,7 @@ fn generate_run_stop<'a>(fbb: &'a mut FlatBufferBuilder<'_>, job_id: &str) -> &' fn produce_messages( producer: &ThreadedProducer, - fbb: &mut FlatBufferBuilder, + mut fbb: &mut FlatBufferBuilder, rng: &mut ThreadRng, frame: u32, conf: &HowlConfig, From b39447b1a3d21596db44b303ea8c8d75b9b7eefe Mon Sep 17 00:00:00 2001 From: Jack Doughty Date: Tue, 8 Sep 2026 15:48:29 +0100 Subject: [PATCH 4/6] Remove mut before fbb arg in produce_messages --- src/howl.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/howl.rs b/src/howl.rs index 5c05315..5a9ee5c 100644 --- a/src/howl.rs +++ b/src/howl.rs @@ -116,7 +116,7 @@ fn generate_run_stop<'a>(fbb: &'a mut FlatBufferBuilder<'_>, job_id: &str) -> &' fn produce_messages( producer: &ThreadedProducer, - mut fbb: &mut FlatBufferBuilder, + fbb: &mut FlatBufferBuilder, rng: &mut ThreadRng, frame: u32, conf: &HowlConfig, @@ -147,8 +147,7 @@ fn produce_messages( } } - let ev44 = - generate_fake_events(&mut fbb, rng, frame, conf.event_message_config, now_nanos).to_vec(); + let ev44 = generate_fake_events(fbb, rng, frame, conf.event_message_config, now_nanos).to_vec(); for _ in 0..conf.messages_per_frame { if *conf.fast { @@ -166,7 +165,7 @@ fn produce_messages( BaseRecord::to(conf.event_topic) .key("") .payload(generate_fake_events( - &mut fbb, + fbb, rng, frame, conf.event_message_config, From 07779865b6e887123861f4489076a9a7a468ba05 Mon Sep 17 00:00:00 2001 From: Jack Harper Date: Tue, 8 Sep 2026 15:59:31 +0100 Subject: [PATCH 5/6] use as_slice on ev44 vec --- src/howl.rs | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/src/howl.rs b/src/howl.rs index 5a9ee5c..b7d2755 100644 --- a/src/howl.rs +++ b/src/howl.rs @@ -150,30 +150,20 @@ fn produce_messages( let ev44 = generate_fake_events(fbb, rng, frame, conf.event_message_config, now_nanos).to_vec(); for _ in 0..conf.messages_per_frame { - if *conf.fast { - let _ = producer - .send( - BaseRecord::to(conf.event_topic) - .key("") - .payload(&ev44) - .timestamp(now_nanos / 1_000_000), - ) - .inspect_err(|e| error!("Failed to send messages: {}", e.0)); - } else { - let _ = producer - .send( - BaseRecord::to(conf.event_topic) - .key("") - .payload(generate_fake_events( - fbb, - rng, - frame, - conf.event_message_config, - now_nanos, - )) - .timestamp(now_nanos / 1_000_000), - ) - .inspect_err(|e| error!("Failed to send messages: {}", e.0)); + match producer.send( + BaseRecord::to(conf.event_topic) + .key("") + .payload(if *conf.fast { + ev44.as_slice() + } else { + generate_fake_events(fbb, rng, frame, conf.event_message_config, now_nanos) + }) + .timestamp(now_nanos / 1_000_000), + ) { + Ok(_) => {} + Err(err) => { + error!("Failed to send messages: {}", err.0); + } } } From c472fbd39edd737dfd88a68605403b317f371670 Mon Sep 17 00:00:00 2001 From: Jack Doughty Date: Tue, 8 Sep 2026 16:05:34 +0100 Subject: [PATCH 6/6] Make fast arg less complicated --- src/howl.rs | 4 ++-- src/main.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/howl.rs b/src/howl.rs index b7d2755..bfdb1df 100644 --- a/src/howl.rs +++ b/src/howl.rs @@ -153,7 +153,7 @@ fn produce_messages( match producer.send( BaseRecord::to(conf.event_topic) .key("") - .payload(if *conf.fast { + .payload(if conf.fast { ev44.as_slice() } else { generate_fake_events(fbb, rng, frame, conf.event_message_config, now_nanos) @@ -273,7 +273,7 @@ pub struct HowlConfig<'a> { pub frames_per_run: u32, pub veto_probability: f64, // 1 = always vetoed, 0 = never vetoed pub event_message_config: &'a EventMessageConfig, - pub fast: &'a bool, + pub fast: bool, pub kafka_config: Option>, } diff --git a/src/main.rs b/src/main.rs index 10b01c5..0ac9c45 100644 --- a/src/main.rs +++ b/src/main.rs @@ -185,7 +185,7 @@ async fn main() { det_max, }, veto_probability, - fast: &fast, + fast, }), Commands::Count { topic,