From 038637f94d86a37b45ee9d27fcc41d307b597692 Mon Sep 17 00:00:00 2001 From: Ivan Boldyrev Date: Mon, 22 Jul 2024 13:38:21 +0200 Subject: [PATCH] fix(execution-engine): quickfix for canon map iteration order (#845) An O(n) quickfix for the canon map reverse iteration bug. --- .../execution_step/instructions/fold/utils.rs | 6 ++++ air/tests/test_module/instructions/fold.rs | 32 +++++++++---------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/air/src/execution_step/instructions/fold/utils.rs b/air/src/execution_step/instructions/fold/utils.rs index 394eb4b3..8f0a5248 100644 --- a/air/src/execution_step/instructions/fold/utils.rs +++ b/air/src/execution_step/instructions/fold/utils.rs @@ -123,6 +123,12 @@ pub(crate) fn create_canon_stream_map_iterable_value( } } } + // the reverse iteration of the original data produce `values` in reverse order; + // the spec requires direct order of iteration, so reverse it one more time + // + // it can be solved at O(1) with special handling of reversed iterators in fold, + // so this O(n) implementation is just a quick fix + values.reverse(); let iterable_ingredients = CanonStreamMapIterableIngredients::init(values); let iterable = Box::new(iterable_ingredients); diff --git a/air/tests/test_module/instructions/fold.rs b/air/tests/test_module/instructions/fold.rs index fe6b47fb..ec0bf3f7 100644 --- a/air/tests/test_module/instructions/fold.rs +++ b/air/tests/test_module/instructions/fold.rs @@ -955,12 +955,12 @@ async fn fold_canon_stream_map() { (seq (seq (seq - (ap ("key" "value4") %map) - (ap (-42 "value3") %map) + (ap ("key" "value1") %map) + (ap (-42 "value2") %map) ) (seq - (ap (-42 "value2") %map) - (ap ("key" "value1") %map) + (ap (-42 "value3") %map) + (ap ("key" "value4") %map) ) ) (seq @@ -986,8 +986,8 @@ async fn fold_canon_stream_map() { let mut cid_tracker: ExecutionCidState = ExecutionCidState::new(); let tetraplet = json!({"function_name": "", "lens": "", "peer_pk": vm_1_peer_id, "service_id": ""}); - let map_value_2 = json!({"key": -42, "value": "value2"}); let map_value_1 = json!({"key": "key", "value": "value1"}); + let map_value_2 = json!({"key": -42, "value": "value2"}); let map_value_3 = json!({"key": -42, "value": "value3"}); let map_value_4 = json!({"key": "key", "value": "value4"}); @@ -999,13 +999,8 @@ async fn fold_canon_stream_map() { canon_tracked( json!({"tetraplet": tetraplet, "values": [ - { - "result": map_value_4, - "tetraplet": tetraplet, - "provenance": Provenance::Literal, - }, { - "result": map_value_3, + "result": map_value_1, "tetraplet": tetraplet, "provenance": Provenance::Literal, }, @@ -1015,7 +1010,12 @@ async fn fold_canon_stream_map() { "provenance": Provenance::Literal, }, { - "result": map_value_1, + "result": map_value_3, + "tetraplet": tetraplet, + "provenance": Provenance::Literal, + }, + { + "result": map_value_4, "tetraplet": tetraplet, "provenance": Provenance::Literal, }, @@ -1023,20 +1023,20 @@ async fn fold_canon_stream_map() { &mut cid_tracker, ), scalar_tracked!( - map_value_1.clone(), + map_value_3.clone(), cid_tracker, peer = &vm_1_peer_id, service = "m..0", function = "f", - args = [map_value_1] + args = [map_value_3] ), scalar_tracked!( - map_value_2.clone(), + map_value_4.clone(), cid_tracker, peer = vm_1_peer_id, service = "m..0", function = "f", - args = [map_value_2] + args = [map_value_4] ), ];