From 2356bbcc941af81cff69e5e5c9e90b2dc58a3b34 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 23 Aug 2026 20:04:00 +0000 Subject: [PATCH 1/2] refactor(evaluator): replace state vecs with zero-allocation slice comparison In `phase_composite_reevaluation`, multiple `Vec` allocations were used to snapshot and compare `ExecutionNode` states before, during, and after block execution. This replaces the allocations with a zero-allocation `states_differ` helper that compares slice lengths and uses `.zip().any()` to quickly short-circuit on changes, reducing memory overhead on the execution hot path. Co-authored-by: ovasylenko <3797513+ovasylenko@users.noreply.github.com> --- .jules/bolt.md | 3 +++ orch8-engine/src/evaluator.rs | 28 +++++++++++++++------------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/.jules/bolt.md b/.jules/bolt.md index 4fd410f7..92b1adb1 100644 --- a/.jules/bolt.md +++ b/.jules/bolt.md @@ -85,3 +85,6 @@ ## 2025-11-04 - [Avoid HashMap Allocation for Parent-to-Child Grouping on Hot Paths] **Learning:** In the `cancel_scoped` function within `orch8-engine/src/signals.rs`, allocating a `HashMap>` inside a hot path loop across all tree nodes results in severe memory allocation and hashing overhead, negatively impacting CPU and scaling. **Action:** Always replace dynamic `HashMap` allocations inside tree processing loops with a `Vec<(ParentId, &ChildType)>`. Sort the vector by the parent ID using `.sort_unstable_by_key()` and retrieve matching children efficiently in O(log N) time using `.partition_point()` and bounded `.skip()` iteration, achieving completely zero-allocation queries inside nested functions like `is_inside_finally_branch`. +## 2026-08-23 - [Zero-Allocation ExecutionNode State Comparison] +**Learning:** In the composite reevaluation hot path within `orch8-engine/src/evaluator.rs`, eagerly allocating multiple `Vec<(ExecutionNodeId, NodeState)>` snapshots of the execution tree solely to verify if state changes occurred creates unnecessary memory allocation overhead. +**Action:** When comparing snapshots of structurally stable slices (like `[ExecutionNode]`) to detect mutations, prefer a zero-allocation helper function that compares lengths and iterates with `.zip().any()` to short-circuit upon the first mismatch. diff --git a/orch8-engine/src/evaluator.rs b/orch8-engine/src/evaluator.rs index 051fb133..274498c1 100644 --- a/orch8-engine/src/evaluator.rs +++ b/orch8-engine/src/evaluator.rs @@ -885,11 +885,7 @@ async fn phase_composite_reevaluation( return Ok(IterAction::FallThrough); } - // Snapshot node states before dispatching any composite. - let pre_states: Vec<(ExecutionNodeId, NodeState)> = - ctx.tree.iter().map(|n| (n.id, n.state)).collect(); - - let mut early_restart = false; + let mut tree_mutated = false; for idx in &composite_indices { let node = &ctx.tree[*idx]; let Some(block) = block_map.get(&node.block_id).copied() else { @@ -910,23 +906,19 @@ async fn phase_composite_reevaluation( if may_mutate_instance(block) { ctx.instance_stale = true; let mid_tree = storage.get_execution_tree(instance_id).await?; - let mid_states: Vec<(ExecutionNodeId, NodeState)> = - mid_tree.iter().map(|n| (n.id, n.state)).collect(); - if pre_states != mid_states { + if states_differ(&ctx.tree, &mid_tree) { ctx.set_tree(mid_tree); - early_restart = true; + tree_mutated = true; break; } } } - if early_restart { + if tree_mutated { return Ok(IterAction::Continue); } let post_tree = storage.get_execution_tree(instance_id).await?; - let post_states: Vec<(ExecutionNodeId, NodeState)> = - post_tree.iter().map(|n| (n.id, n.state)).collect(); - if pre_states != post_states { + if states_differ(&ctx.tree, &post_tree) { ctx.set_tree(post_tree); return Ok(IterAction::Continue); } @@ -939,6 +931,16 @@ async fn phase_composite_reevaluation( })) } +fn states_differ(a: &[ExecutionNode], b: &[ExecutionNode]) -> bool { + // ⚡ Bolt: Rather than allocating Vecs of states to compare snapshots of the tree + // after executing a block, we use a zero-allocation length and element-wise comparison. + // Iteration short-circuits on the first mismatch. + a.len() != b.len() + || a.iter() + .zip(b.iter()) + .any(|(na, nb)| na.id != nb.id || na.state != nb.state) +} + fn may_mutate_instance(block: &BlockDefinition) -> bool { matches!( block, From 5a517a1b6c0f0db6bafeca53331113fe3377a4b9 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 23 Aug 2026 20:38:20 +0000 Subject: [PATCH 2/2] refactor(evaluator): replace state vecs with zero-allocation slice comparison In `phase_composite_reevaluation`, multiple `Vec` allocations were used to snapshot and compare `ExecutionNode` states before, during, and after block execution. This replaces the allocations with a zero-allocation `states_differ` helper that compares slice lengths and uses `.zip().any()` to quickly short-circuit on changes, reducing memory overhead on the execution hot path. Also fixed a clippy warning `clippy::manual_is_variant_and` in `orch8-push/src/fcm.rs`. Co-authored-by: ovasylenko <3797513+ovasylenko@users.noreply.github.com> --- orch8-push/src/fcm.rs | 20 +++++++++----------- rustc-ice-2026-08-23T20_28_34-127392.txt | 18 ++++++++++++++++++ rustc-ice-2026-08-23T20_29_05-135203.txt | 18 ++++++++++++++++++ rustc-ice-2026-08-23T20_31_15-151818.txt | 18 ++++++++++++++++++ rustc-ice-2026-08-23T20_31_49-159661.txt | 18 ++++++++++++++++++ rustc-ice-2026-08-23T20_33_01-175448.txt | 18 ++++++++++++++++++ rustc-ice-2026-08-23T20_33_21-179387.txt | 18 ++++++++++++++++++ 7 files changed, 117 insertions(+), 11 deletions(-) create mode 100644 rustc-ice-2026-08-23T20_28_34-127392.txt create mode 100644 rustc-ice-2026-08-23T20_29_05-135203.txt create mode 100644 rustc-ice-2026-08-23T20_31_15-151818.txt create mode 100644 rustc-ice-2026-08-23T20_31_49-159661.txt create mode 100644 rustc-ice-2026-08-23T20_33_01-175448.txt create mode 100644 rustc-ice-2026-08-23T20_33_21-179387.txt diff --git a/orch8-push/src/fcm.rs b/orch8-push/src/fcm.rs index 145f8e14..a6c7dc1a 100644 --- a/orch8-push/src/fcm.rs +++ b/orch8-push/src/fcm.rs @@ -67,18 +67,16 @@ fn classify_fcm_response(status: reqwest::StatusCode, body: &str) -> FcmOutcome // with 404 "Requested entity was not found") is a project-level failure: // treating it as InvalidToken would let one config typo wipe every // registered device token. - let unregistered = serde_json::from_str::(body) - .ok() - .is_some_and(|v| { - v.get("error") - .and_then(|e| e.get("details")) - .and_then(|d| d.as_array()) - .is_some_and(|details| { - details.iter().any(|d| { - d.get("errorCode").and_then(|c| c.as_str()) == Some("UNREGISTERED") - }) + let unregistered = serde_json::from_str::(body).is_ok_and(|v| { + v.get("error") + .and_then(|e| e.get("details")) + .and_then(|d| d.as_array()) + .is_some_and(|details| { + details.iter().any(|d| { + d.get("errorCode").and_then(|c| c.as_str()) == Some("UNREGISTERED") }) - }); + }) + }); if unregistered { return FcmOutcome::InvalidToken; } diff --git a/rustc-ice-2026-08-23T20_28_34-127392.txt b/rustc-ice-2026-08-23T20_28_34-127392.txt new file mode 100644 index 00000000..352c7c91 --- /dev/null +++ b/rustc-ice-2026-08-23T20_28_34-127392.txt @@ -0,0 +1,18 @@ +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(49:10446 ~ tokio[697b]::sync::mutex::{impl#10}::lock::{opaque#0}) }, args: [std::option::Option, '{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(0:47 ~ orch8_push[5ca6]::apns::{impl#1}::get_or_refresh_token::{opaque#0}) }, args: ['{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:899 ~ reqwest[17b5]::async_impl::request::{impl#1}::send::{opaque#0}) }, args: [], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:955 ~ reqwest[17b5]::async_impl::response::{impl#0}::text::{opaque#0}) }, args: [], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(49:10446 ~ tokio[697b]::sync::mutex::{impl#10}::lock::{opaque#0}) }, args: [std::option::Option, '{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:959 ~ reqwest[17b5]::async_impl::response::{impl#0}::json::{opaque#0}) }, args: [fcm::TokenResponse], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(0:110 ~ orch8_push[5ca6]::fcm::{impl#2}::get_or_refresh_token::{opaque#0}) }, args: ['{erased}], .. }) +disabled backtrace + + +rustc version: 1.100.0-nightly (c54751567 2026-08-22) +platform: x86_64-unknown-linux-gnu \ No newline at end of file diff --git a/rustc-ice-2026-08-23T20_29_05-135203.txt b/rustc-ice-2026-08-23T20_29_05-135203.txt new file mode 100644 index 00000000..352c7c91 --- /dev/null +++ b/rustc-ice-2026-08-23T20_29_05-135203.txt @@ -0,0 +1,18 @@ +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(49:10446 ~ tokio[697b]::sync::mutex::{impl#10}::lock::{opaque#0}) }, args: [std::option::Option, '{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(0:47 ~ orch8_push[5ca6]::apns::{impl#1}::get_or_refresh_token::{opaque#0}) }, args: ['{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:899 ~ reqwest[17b5]::async_impl::request::{impl#1}::send::{opaque#0}) }, args: [], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:955 ~ reqwest[17b5]::async_impl::response::{impl#0}::text::{opaque#0}) }, args: [], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(49:10446 ~ tokio[697b]::sync::mutex::{impl#10}::lock::{opaque#0}) }, args: [std::option::Option, '{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:959 ~ reqwest[17b5]::async_impl::response::{impl#0}::json::{opaque#0}) }, args: [fcm::TokenResponse], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(0:110 ~ orch8_push[5ca6]::fcm::{impl#2}::get_or_refresh_token::{opaque#0}) }, args: ['{erased}], .. }) +disabled backtrace + + +rustc version: 1.100.0-nightly (c54751567 2026-08-22) +platform: x86_64-unknown-linux-gnu \ No newline at end of file diff --git a/rustc-ice-2026-08-23T20_31_15-151818.txt b/rustc-ice-2026-08-23T20_31_15-151818.txt new file mode 100644 index 00000000..352c7c91 --- /dev/null +++ b/rustc-ice-2026-08-23T20_31_15-151818.txt @@ -0,0 +1,18 @@ +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(49:10446 ~ tokio[697b]::sync::mutex::{impl#10}::lock::{opaque#0}) }, args: [std::option::Option, '{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(0:47 ~ orch8_push[5ca6]::apns::{impl#1}::get_or_refresh_token::{opaque#0}) }, args: ['{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:899 ~ reqwest[17b5]::async_impl::request::{impl#1}::send::{opaque#0}) }, args: [], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:955 ~ reqwest[17b5]::async_impl::response::{impl#0}::text::{opaque#0}) }, args: [], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(49:10446 ~ tokio[697b]::sync::mutex::{impl#10}::lock::{opaque#0}) }, args: [std::option::Option, '{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:959 ~ reqwest[17b5]::async_impl::response::{impl#0}::json::{opaque#0}) }, args: [fcm::TokenResponse], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(0:110 ~ orch8_push[5ca6]::fcm::{impl#2}::get_or_refresh_token::{opaque#0}) }, args: ['{erased}], .. }) +disabled backtrace + + +rustc version: 1.100.0-nightly (c54751567 2026-08-22) +platform: x86_64-unknown-linux-gnu \ No newline at end of file diff --git a/rustc-ice-2026-08-23T20_31_49-159661.txt b/rustc-ice-2026-08-23T20_31_49-159661.txt new file mode 100644 index 00000000..352c7c91 --- /dev/null +++ b/rustc-ice-2026-08-23T20_31_49-159661.txt @@ -0,0 +1,18 @@ +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(49:10446 ~ tokio[697b]::sync::mutex::{impl#10}::lock::{opaque#0}) }, args: [std::option::Option, '{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(0:47 ~ orch8_push[5ca6]::apns::{impl#1}::get_or_refresh_token::{opaque#0}) }, args: ['{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:899 ~ reqwest[17b5]::async_impl::request::{impl#1}::send::{opaque#0}) }, args: [], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:955 ~ reqwest[17b5]::async_impl::response::{impl#0}::text::{opaque#0}) }, args: [], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(49:10446 ~ tokio[697b]::sync::mutex::{impl#10}::lock::{opaque#0}) }, args: [std::option::Option, '{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:959 ~ reqwest[17b5]::async_impl::response::{impl#0}::json::{opaque#0}) }, args: [fcm::TokenResponse], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(0:110 ~ orch8_push[5ca6]::fcm::{impl#2}::get_or_refresh_token::{opaque#0}) }, args: ['{erased}], .. }) +disabled backtrace + + +rustc version: 1.100.0-nightly (c54751567 2026-08-22) +platform: x86_64-unknown-linux-gnu \ No newline at end of file diff --git a/rustc-ice-2026-08-23T20_33_01-175448.txt b/rustc-ice-2026-08-23T20_33_01-175448.txt new file mode 100644 index 00000000..352c7c91 --- /dev/null +++ b/rustc-ice-2026-08-23T20_33_01-175448.txt @@ -0,0 +1,18 @@ +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(49:10446 ~ tokio[697b]::sync::mutex::{impl#10}::lock::{opaque#0}) }, args: [std::option::Option, '{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(0:47 ~ orch8_push[5ca6]::apns::{impl#1}::get_or_refresh_token::{opaque#0}) }, args: ['{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:899 ~ reqwest[17b5]::async_impl::request::{impl#1}::send::{opaque#0}) }, args: [], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:955 ~ reqwest[17b5]::async_impl::response::{impl#0}::text::{opaque#0}) }, args: [], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(49:10446 ~ tokio[697b]::sync::mutex::{impl#10}::lock::{opaque#0}) }, args: [std::option::Option, '{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:959 ~ reqwest[17b5]::async_impl::response::{impl#0}::json::{opaque#0}) }, args: [fcm::TokenResponse], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(0:110 ~ orch8_push[5ca6]::fcm::{impl#2}::get_or_refresh_token::{opaque#0}) }, args: ['{erased}], .. }) +disabled backtrace + + +rustc version: 1.100.0-nightly (c54751567 2026-08-22) +platform: x86_64-unknown-linux-gnu \ No newline at end of file diff --git a/rustc-ice-2026-08-23T20_33_21-179387.txt b/rustc-ice-2026-08-23T20_33_21-179387.txt new file mode 100644 index 00000000..352c7c91 --- /dev/null +++ b/rustc-ice-2026-08-23T20_33_21-179387.txt @@ -0,0 +1,18 @@ +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(49:10446 ~ tokio[697b]::sync::mutex::{impl#10}::lock::{opaque#0}) }, args: [std::option::Option, '{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(0:47 ~ orch8_push[5ca6]::apns::{impl#1}::get_or_refresh_token::{opaque#0}) }, args: ['{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:899 ~ reqwest[17b5]::async_impl::request::{impl#1}::send::{opaque#0}) }, args: [], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:955 ~ reqwest[17b5]::async_impl::response::{impl#0}::text::{opaque#0}) }, args: [], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(49:10446 ~ tokio[697b]::sync::mutex::{impl#10}::lock::{opaque#0}) }, args: [std::option::Option, '{erased}], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(92:959 ~ reqwest[17b5]::async_impl::response::{impl#0}::json::{opaque#0}) }, args: [fcm::TokenResponse], .. }) +disabled backtrace +delayed bug: unexpected rigid alias in layout_of after normalization: Alias(Yes, Alias { kind: Opaque { def_id: DefId(0:110 ~ orch8_push[5ca6]::fcm::{impl#2}::get_or_refresh_token::{opaque#0}) }, args: ['{erased}], .. }) +disabled backtrace + + +rustc version: 1.100.0-nightly (c54751567 2026-08-22) +platform: x86_64-unknown-linux-gnu \ No newline at end of file