diff --git a/Cargo.lock b/Cargo.lock index 9859dffb..6a7f52c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -466,9 +466,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.11.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecount" @@ -499,9 +499,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" [[package]] name = "cfg-if" @@ -602,7 +602,7 @@ checksum = "f13b9c79b5d1dd500d20ef541215a6423c75829ef43117e1b4d17fd8af0b5d76" dependencies = [ "bitflags", "clap_derive", - "clap_lex 0.3.0", + "clap_lex 0.3.1", "is-terminal", "once_cell", "strsim", @@ -615,7 +615,7 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "684a277d672e91966334af371f1a7b5833f9aa00b07c84e92fbce95e00208ce8" dependencies = [ - "heck 0.4.0", + "heck 0.4.1", "proc-macro-error", "proc-macro2", "quote", @@ -633,9 +633,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8" +checksum = "783fe232adfca04f90f56201b26d79682d4cd2625e0bc7290b95123afe558ade" dependencies = [ "os_str_bytes", ] @@ -943,9 +943,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.85" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5add3fc1717409d029b20c5b6903fc0c0b02fa6741d820054f4a2efa5e5816fd" +checksum = "bc831ee6a32dd495436e317595e639a587aa9907bef96fe6e6abc290ab6204e9" dependencies = [ "cc", "cxxbridge-flags", @@ -955,9 +955,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.85" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c87959ba14bc6fbc61df77c3fcfe180fc32b93538c4f1031dd802ccb5f2ff0" +checksum = "94331d54f1b1a8895cd81049f7eaaaef9d05a7dcb4d1fd08bf3ff0806246789d" dependencies = [ "cc", "codespan-reporting", @@ -970,15 +970,15 @@ dependencies = [ [[package]] name = "cxxbridge-flags" -version = "1.0.85" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69a3e162fde4e594ed2b07d0f83c6c67b745e7f28ce58c6df5e6b6bef99dfb59" +checksum = "48dcd35ba14ca9b40d6e4b4b39961f23d835dbb8eed74565ded361d93e1feb8a" [[package]] name = "cxxbridge-macro" -version = "1.0.85" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e7e2adeb6a0d4a282e581096b06e1791532b7d576dcde5ccd9382acf55db8e6" +checksum = "81bbeb29798b407ccd82a3324ade1a7286e0d29851475990b612670f6f5124d2" dependencies = [ "proc-macro2", "quote", @@ -987,9 +987,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0dd3cd20dc6b5a876612a6e5accfe7f3dd883db6d07acfbf14c128f61550dfa" +checksum = "c0808e1bd8671fb44a113a14e13497557533369847788fa2ae912b6ebfce9fa8" dependencies = [ "darling_core", "darling_macro", @@ -997,9 +997,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a784d2ccaf7c98501746bf0be29b2022ba41fd62a2e622af997a03e9f972859f" +checksum = "001d80444f28e193f30c2f293455da62dcf9a6b29918a4253152ae2b1de592cb" dependencies = [ "fnv", "ident_case", @@ -1011,9 +1011,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7618812407e9402654622dd402b0a89dff9ba93badd6540781526117b92aab7e" +checksum = "b36230598a2d5de7ec1c6f51f72d8a99a9208daff41de2084d06e3fd3ea56685" dependencies = [ "darling_core", "quote", @@ -1109,9 +1109,9 @@ dependencies = [ [[package]] name = "either" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "ena" @@ -1334,9 +1334,9 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" @@ -1356,6 +1356,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "hex" version = "0.4.3" @@ -1445,9 +1451,9 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "1.0.3" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46112a93252b123d31a119a8d1a1ac19deac4fac6e0e8b0df58f0d4e5870e63c" +checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" dependencies = [ "libc", "windows-sys", @@ -1455,11 +1461,11 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189" +checksum = "22e18b0a45d56fe973d6db23972bf5bc46f988a4a2385deac9cc29572f09daef" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi 0.3.1", "io-lifetimes", "rustix", "windows-sys", @@ -2122,7 +2128,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api 0.4.9", - "parking_lot_core 0.9.5", + "parking_lot_core 0.9.7", ] [[package]] @@ -2155,9 +2161,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.5" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" dependencies = [ "cfg-if 1.0.0", "libc", @@ -2174,9 +2180,9 @@ checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" [[package]] name = "petgraph" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" dependencies = [ "fixedbitset", "indexmap", @@ -2312,9 +2318,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.49" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5" +checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" dependencies = [ "unicode-ident", ] @@ -2368,9 +2374,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.10.1" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" +checksum = "356a0625f1954f730c0201cdab48611198dc6ce21f4acff55089b5a78e6e835b" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -2441,9 +2447,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.36.5" +version = "0.36.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3807b5d10909833d3e9acd1eb5fb988f79376ff10fce42937de71a449c4c588" +checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644" dependencies = [ "bitflags", "errno", @@ -2567,9 +2573,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7434af0dc1cbd59268aa98b4c22c131c0584d2232f6fb166efb993e2832e896a" +checksum = "cad406b69c91885b5107daf2c29572f6c8cdb3c66826821e286c533490c0bc76" dependencies = [ "itoa 1.0.5", "ryu", @@ -2578,9 +2584,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bf4a5a814902cd1014dbccfa4d4560fb8432c779471e96e035602519f82eef" +checksum = "30d904179146de381af4c93d3af6ca4984b3152db687dacb9c3c35e86f39809c" dependencies = [ "base64", "chrono", @@ -2594,9 +2600,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3452b4c0f6c1e357f73fdb87cd1efabaa12acf328c7a528e252893baeb3f4aa" +checksum = "a1966009f3c05f095697c537312f5415d1e3ed31ce0a56942bac4c771c5c335e" dependencies = [ "darling", "proc-macro2", @@ -2676,7 +2682,7 @@ version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ - "heck 0.4.0", + "heck 0.4.1", "proc-macro2", "quote", "rustversion", @@ -2731,9 +2737,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.1.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] @@ -2841,9 +2847,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.10" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1333c76748e868a4d9d1017b5ab53171dfd095f70c712fdb4653a406547f598f" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] @@ -2949,9 +2955,9 @@ checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" [[package]] name = "unicode-segmentation" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode-width" @@ -3351,9 +3357,18 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.42.0" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -3366,45 +3381,45 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" [[package]] name = "windows_aarch64_msvc" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" [[package]] name = "windows_i686_gnu" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" [[package]] name = "windows_i686_msvc" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" [[package]] name = "windows_x86_64_gnu" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" +checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" [[package]] name = "windows_x86_64_msvc" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" +checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" [[package]] name = "yansi" diff --git a/air/src/execution_step/instructions/fold_stream.rs b/air/src/execution_step/instructions/fold_stream.rs index dd5040e4..ac599291 100644 --- a/air/src/execution_step/instructions/fold_stream.rs +++ b/air/src/execution_step/instructions/fold_stream.rs @@ -70,7 +70,7 @@ impl<'i> ExecutableInstruction<'i> for FoldStream<'i> { observer.update_completeness(exec_ctx); trace_to_exec_err!(trace_ctx.meet_fold_end(fold_id), self)?; - observer.into_result() + Ok(()) } } @@ -106,8 +106,10 @@ fn execute_iterations<'i>( exec_ctx, trace_ctx, ); + throw_error_if_not_catchable(result)?; trace_to_exec_err!(trace_ctx.meet_generation_end(fold_id), fold_stream)?; - generation_observer.observe_generation_results(exec_ctx.is_subgraph_complete(), result); + + generation_observer.observe_completeness(exec_ctx.is_subgraph_complete()); } Ok(()) @@ -128,3 +130,13 @@ fn remove_new_generation_if_non_empty<'ctx>( stream.remove_last_generation_if_empty(); stream } + +/// Fold over streams doesn't throw an error if it's a catchable one, because otherwise it would be +/// not deterministic. +fn throw_error_if_not_catchable(result: ExecutionResult<()>) -> ExecutionResult<()> { + match result { + Ok(_) => Ok(()), + Err(error) if error.is_catchable() => Ok(()), + error @ Err(_) => error, + } +} diff --git a/air/src/execution_step/instructions/fold_stream/completeness_updater.rs b/air/src/execution_step/instructions/fold_stream/completeness_updater.rs index 0e5c1548..72cb401c 100644 --- a/air/src/execution_step/instructions/fold_stream/completeness_updater.rs +++ b/air/src/execution_step/instructions/fold_stream/completeness_updater.rs @@ -15,34 +15,23 @@ */ use super::ExecutionCtx; -use super::ExecutionResult; pub(super) struct FoldGenerationObserver { - subtree_complete: bool, - // keeps either Ok or the last met error - result: ExecutionResult<()>, + subgraph_complete: bool, } impl FoldGenerationObserver { pub(super) fn new() -> Self { Self { - subtree_complete: false, - result: Ok(()), + subgraph_complete: false, } } - pub(super) fn observe_generation_results(&mut self, completeness: bool, result: ExecutionResult<()>) { - self.subtree_complete |= completeness; - if result.is_err() { - self.result = result; - } + pub(super) fn observe_completeness(&mut self, completeness: bool) { + self.subgraph_complete |= completeness; } - pub(super) fn update_completeness(&self, exec_ctx: &mut ExecutionCtx<'_>) { - exec_ctx.set_subgraph_completeness(self.subtree_complete); - } - - pub(super) fn into_result(self) -> ExecutionResult<()> { - self.result + pub(super) fn update_completeness(self, exec_ctx: &mut ExecutionCtx<'_>) { + exec_ctx.set_subgraph_completeness(self.subgraph_complete); } } diff --git a/air/tests/test_module/features/streams/recursive_streams.rs b/air/tests/test_module/features/streams/recursive_streams.rs index e213430b..8c35158a 100644 --- a/air/tests/test_module/features/streams/recursive_streams.rs +++ b/air/tests/test_module/features/streams/recursive_streams.rs @@ -263,10 +263,8 @@ fn recursive_stream_error_handling() { let mut vm_1 = create_avm(give_n_results_and_then_stop, vm_peer_id_1); - let vm_peer_id_2 = "vm_peer_id_2"; - let mut vm_2 = create_avm(echo_call_service(), vm_peer_id_2); - let result_value = "result_value"; + let vm_peer_id_2 = "vm_peer_id_2"; let script = f!(r#" (xor (seq @@ -281,17 +279,38 @@ fn recursive_stream_error_handling() { (null)) (seq (ap value $stream) - (next iterator)))))) + (next iterator) + ) + ) + ) + ) + ) (call "{vm_peer_id_2}" ("" "") ["{result_value}"])) "#); let result = checked_call_vm!(vm_1, <_>::default(), &script, "", ""); - let result = checked_call_vm!(vm_2, <_>::default(), &script, "", result.data); let actual_trace = trace_from_result(&result); - let actual_last_state = &actual_trace[11.into()]; - let expected_last_state = executed_state::scalar_string(result_value); + let expected_trace = vec![ + executed_state::stream_string("non_stop", 0), + executed_state::stream_string("non_stop", 1), + executed_state::fold(vec![ + subtrace_lore(0, SubTraceDesc::new(3.into(), 2), SubTraceDesc::new(5.into(), 0)), + subtrace_lore(1, SubTraceDesc::new(5.into(), 2), SubTraceDesc::new(7.into(), 0)), + subtrace_lore(4, SubTraceDesc::new(7.into(), 2), SubTraceDesc::new(10.into(), 0)), + subtrace_lore(6, SubTraceDesc::new(9.into(), 1), SubTraceDesc::new(10.into(), 0)), + subtrace_lore(8, SubTraceDesc::new(10.into(), 1), SubTraceDesc::new(11.into(), 0)), + ]), + executed_state::scalar_string("non_stop"), + executed_state::ap(2), + executed_state::scalar_string("non_stop"), + executed_state::ap(2), + executed_state::scalar_string("non_stop"), + executed_state::ap(3), + executed_state::service_failed(1, "error"), + executed_state::service_failed(1, "error"), + ]; - assert_eq!(actual_last_state, &expected_last_state); + assert_eq!(actual_trace, expected_trace); } #[test] diff --git a/air/tests/test_module/features/streams/scripts/fold_early_exit.air b/air/tests/test_module/features/streams/scripts/fold_early_exit.air index f43ed7a3..c785f7e5 100644 --- a/air/tests/test_module/features/streams/scripts/fold_early_exit.air +++ b/air/tests/test_module/features/streams/scripts/fold_early_exit.air @@ -3,45 +3,64 @@ (seq (seq (seq - (call "{0}" ("" "") ["stream_1"] stream_1_ingredients) - (call "{0}" ("" "") ["stream_2"] stream_2_ingredients)) - (call "{0}" ("" "") ["stream_3"] stream_3_ingredients)) - (call "{0}" ("" "") ["stream_4"] stream_4_ingredients)) - (seq + (ap "a1" $stream_1) + (ap "a2" $stream_1) + ) + (seq + (ap "b1" $stream_2) + (ap "b2" $stream_2) + ) + ) (seq - (seq - (fold stream_1_ingredients v1 - (seq - (call "{1}" ("" "") [v1] $stream_1) - (next v1))) - (fold stream_2_ingredients v2 - (seq - (call "{1}" ("" "") [v2] $stream_2) - (next v2)))) - (fold stream_3_ingredients v3 - (seq - (call "{1}" ("" "") [v3] $stream_3) - (next v3)))) - (fold stream_4_ingredients v4 - (seq - (call "{1}" ("" "") [v4] $stream_4) - (next v4))))) + (ap "c1" $stream_3) + (ap "c2" $stream_3) + ) + ) + (seq + (ap "d1" $stream_4) + (ap "d2" $stream_4) + ) + ) (par - (xor - (fold $stream_1 v1 - (seq - (fold $stream_2 v2 - (seq - (seq - (fold $stream_3 v3 - (par - (fold $stream_4 v4 + (par + (xor + (fold $stream_1 v1 + (seq + (fold $stream_2 v2 + (xor + (seq + (seq + (fold $stream_3 v3 (par - (call "{2}" ("" "") []) - (next v4))) - (next v3))) - (call "{3}" ("error" "") [])) ; will trigger an error - (next v2))) - (next v1))) - (call "{4}" ("" "") [%last_error%])) - (call "{5}" ("" "") ["last_peer"]))) + (fold $stream_4 v4 + (par + (call "{fold_executor_id}" ("" "") []) + (next v4) + ) + ) + (next v3))) + (call "{error_trigger_id}" ("error" "") []) ; will trigger an error + ) + (next v2) + ) + (ap %last_error% $error_stream) + ) + ) + (next v1) + ) + ) + (call "{last_error_receiver_id}" ("" "") [%last_error%]) ; shouldn't be called + ) + (seq + (call "{last_peer_checker_id}" ("" "") ["last_peer 2"]) + (fold $error_stream error + (seq + (call "{last_peer_checker_id}" ("" "") [error]) + (next error) + ) + ) + ) + ) + (call "{last_peer_checker_id}" ("" "") ["last_peer"]) + ) +) diff --git a/air/tests/test_module/features/streams/streams_early_exit.rs b/air/tests/test_module/features/streams/streams_early_exit.rs index 022f7043..36f41f9c 100644 --- a/air/tests/test_module/features/streams/streams_early_exit.rs +++ b/air/tests/test_module/features/streams/streams_early_exit.rs @@ -179,58 +179,33 @@ fn par_early_exit() { #[test] fn fold_early_exit() { - let variables_setter_id = "set_variable_id"; - let stream_setter_id = "stream_setter_id"; let fold_executor_id = "fold_executor_id"; let error_trigger_id = "error_trigger_id"; let last_error_receiver_id = "last_error_receiver_id"; let last_peer_checker_id = "last_peer_checker_id"; - let variables = maplit::hashmap!( - "stream_1".to_string() => json!(["a1", "a2"]), - "stream_2".to_string() => json!(["b1", "b2"]), - "stream_3".to_string() => json!(["c1", "c2"]), - "stream_4".to_string() => json!(["d1", "d2"]), - ); - - let mut variables_setter = create_avm( - set_variables_call_service(variables, VariableOptionSource::Argument(0)), - variables_setter_id, - ); - let mut stream_setter = create_avm(echo_call_service(), stream_setter_id); let mut fold_executor = create_avm(unit_call_service(), fold_executor_id); let mut error_trigger = create_avm(fallible_call_service("error"), error_trigger_id); - let mut last_error_receiver = create_avm(echo_call_service(), last_error_receiver_id); let mut last_peer_checker = create_avm(echo_call_service(), last_peer_checker_id); let script = format!( include_str!("scripts/fold_early_exit.air"), - variables_setter_id, - stream_setter_id, - fold_executor_id, - error_trigger_id, - last_error_receiver_id, - last_peer_checker_id + fold_executor_id = fold_executor_id, + error_trigger_id = error_trigger_id, + last_error_receiver_id = last_error_receiver_id, + last_peer_checker_id = last_peer_checker_id ); - let variables_setter_result = checked_call_vm!(variables_setter, <_>::default(), &script, "", ""); - let stream_setter_result = - checked_call_vm!(stream_setter, <_>::default(), &script, "", variables_setter_result.data); - let fold_executor_result = checked_call_vm!(fold_executor, <_>::default(), &script, "", stream_setter_result.data); + let fold_executor_result = checked_call_vm!(fold_executor, <_>::default(), &script, "", ""); + let error_trigger_result = checked_call_vm!(error_trigger, <_>::default(), &script, "", fold_executor_result.data); + let fold_executor_result = checked_call_vm!(fold_executor, <_>::default(), &script, "", error_trigger_result.data); let error_trigger_result = checked_call_vm!(error_trigger, <_>::default(), &script, "", fold_executor_result.data); - let last_error_receiver_result = checked_call_vm!( - last_error_receiver, - <_>::default(), - &script, - "", - error_trigger_result.data - ); let last_peer_checker_result = checked_call_vm!( last_peer_checker, <_>::default(), &script, "", - last_error_receiver_result.data + error_trigger_result.data ); let actual_trace = trace_from_result(&last_peer_checker_result); @@ -240,8 +215,11 @@ fn fold_early_exit() { "message": r#"Local service error, ret_code is 1, error message is '"failed result from fallible_call_service"'"#, "peer_id": "error_trigger_id"})); - let xor_right_subgraph_state_id = actual_trace.len() - 2; - assert_eq!(&actual_trace[xor_right_subgraph_state_id.into()], &expected_state); + let bubbled_error_from_stream_1 = actual_trace.len() - 3; + assert_eq!(&actual_trace[bubbled_error_from_stream_1.into()], &expected_state); + + let bubbled_error_from_stream_2 = actual_trace.len() - 2; + assert_eq!(&actual_trace[bubbled_error_from_stream_2.into()], &expected_state); } #[test]