From 5e02742e64f2998845f9fbf378060937dab3f45a Mon Sep 17 00:00:00 2001 From: Victor Allombert Date: Mon, 27 Nov 2023 09:31:05 +0100 Subject: [PATCH 1/3] Tezt: make snapshot drag after rolling import test consistent --- tezt/tests/storage_snapshots.ml | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/tezt/tests/storage_snapshots.ml b/tezt/tests/storage_snapshots.ml index 7b8a8863aec8..b7b1a710ed28 100644 --- a/tezt/tests/storage_snapshots.ml +++ b/tezt/tests/storage_snapshots.ml @@ -309,6 +309,20 @@ let test_export_import_snapshots = in unit +let wait_for_complete_merge node target = + let wait_for_starting_merge target = + let filter json = + let level = JSON.(json |> as_int) in + if level = target then Some () else None + in + Node.wait_for node "start_merging_stores.v0" filter + in + let wait_for_ending_merge () = + Node.wait_for node "end_merging_stores.v0" @@ fun _json -> Some () + in + let* () = wait_for_starting_merge target in + wait_for_ending_merge () + (* This test aims to export and import a rolling snapshot, bake some blocks and make sure that the checkpoint, savepoint and caboose are well dragged. *) @@ -395,9 +409,18 @@ let test_drag_after_rolling_import = ~caboose:expected_caboose in let* () = bake_blocks archive_node client ~blocks_to_bake in - let* () = Client.Admin.connect_address ~peer:fresh_node client in let* expected_head = Node.get_level archive_node in + let wait_for_merge_at_checkpoint = + (* Waiting for the last cycle to be cemented before checking + store's invariants. *) + let expected_checkpoint = + expected_head - (preserved_cycles * blocks_per_cycle) + in + wait_for_complete_merge fresh_node expected_checkpoint + in + let* () = Client.Admin.connect_address ~peer:fresh_node client in let* (_ : int) = Node.wait_for_level fresh_node expected_head in + let* () = wait_for_merge_at_checkpoint in let expected_checkpoint, expected_savepoint, expected_caboose = match history_mode with | Node.Full_history -> Test.fail "testing only rolling mode" -- GitLab From b8e8c1f2e7e8a90b681e38ff5b78b879916eed82 Mon Sep 17 00:00:00 2001 From: Victor Allombert Date: Mon, 27 Nov 2023 14:30:21 +0100 Subject: [PATCH 2/3] Store: improve cementing events --- src/lib_store/shared/store_events.ml | 25 ++++++++++++++++-- src/lib_store/unix/block_store.ml | 38 ++++++++++++++++++++-------- src/lib_store/unix/block_store.mli | 3 ++- 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/lib_store/shared/store_events.ml b/src/lib_store/shared/store_events.ml index 356034990016..856ab68f467f 100644 --- a/src/lib_store/shared/store_events.ml +++ b/src/lib_store/shared/store_events.ml @@ -116,12 +116,33 @@ let start_updating_floating_stores = ~msg:"updating floating stores" () +let cementing_block_ranges = + declare_1 + ~section + ~level:Info + ~name:"cementing_block_ranges" + ~msg:"cementing block ranges: {ranges}." + ~pp1: + (Format.pp_print_list + ~pp_sep:(fun ppf () -> Format.pp_print_string ppf "; ") + (fun ppf (s, e) -> Format.fprintf ppf "[ %ld, %ld ]" s e)) + ("ranges", Data_encoding.(list (tup2 int32 int32))) + let start_cementing_blocks = - declare_0 + declare_2 ~section ~level:Info ~name:"start_cementing_blocks" - ~msg:"cementing blocks" + ~msg:"cementing blocks between level {start} and {stop}" + ("start", Data_encoding.int32) + ("stop", Data_encoding.int32) + +let end_cementing_blocks = + declare_0 + ~section + ~level:Info + ~name:"end_cementing_blocks" + ~msg:"successful cementing" () let start_cementing_blocks_metadata = diff --git a/src/lib_store/unix/block_store.ml b/src/lib_store/unix/block_store.ml index 108bf78642fb..62dc8a1b3964 100644 --- a/src/lib_store/unix/block_store.ml +++ b/src/lib_store/unix/block_store.ml @@ -415,16 +415,22 @@ let store_block block_store block resulting_context_hash = block)) let cement_blocks ?(check_consistency = true) ~write_metadata block_store - chunk_iterator = + chunk_iterator ~cycle_range:(cycle_start, cycle_stop) = (* No need to lock *) let open Lwt_result_syntax in - let*! () = Store_events.(emit start_cementing_blocks) () in + let*! () = + Store_events.(emit start_cementing_blocks) (cycle_start, cycle_stop) + in let {cemented_store; _} = block_store in - Cemented_block_store.cement_blocks - ~check_consistency - cemented_store - ~write_metadata - chunk_iterator + let* () = + Cemented_block_store.cement_blocks + ~check_consistency + cemented_store + ~write_metadata + chunk_iterator + in + let*! () = Store_events.(emit end_cementing_blocks) () in + return_unit (* [try_retrieve_n_predecessors stores block_hash n] retrieves, at most, the [n] [block_hash]'s predecessors (including [block_hash]) @@ -1218,6 +1224,9 @@ let create_merging_thread block_store ~history_mode ~old_ro_store ~old_rw_store ~lowest_bound_to_preserve_in_floating ~cementing_highwatermark in + let*! () = + Store_events.(emit cementing_block_ranges) cycles_interval_to_cement + in let cycle_reader = read_iterator_block_range_in_floating_stores block_store @@ -1232,7 +1241,11 @@ let create_merging_thread block_store ~history_mode ~old_ro_store ~old_rw_store (fun cycle_range -> let* chunk_iterator = cycle_reader cycle_range in (* In archive, we store the metadatas *) - cement_blocks ~write_metadata:true block_store chunk_iterator) + cement_blocks + ~write_metadata:true + block_store + chunk_iterator + ~cycle_range) cycles_interval_to_cement | Rolling offset -> let offset = @@ -1249,7 +1262,8 @@ let create_merging_thread block_store ~history_mode ~old_ro_store ~old_rw_store cement_blocks ~write_metadata:true block_store - chunk_iterator) + chunk_iterator + ~cycle_range) cycles_interval_to_cement in (* Clean-up the files that are below the offset *) @@ -1278,7 +1292,8 @@ let create_merging_thread block_store ~history_mode ~old_ro_store ~old_rw_store cement_blocks ~write_metadata:true block_store - chunk_iterator) + chunk_iterator + ~cycle_range) cycles_interval_to_cement in (* Clean-up the files that are below the offset *) @@ -1296,7 +1311,8 @@ let create_merging_thread block_store ~history_mode ~old_ro_store ~old_rw_store cement_blocks ~write_metadata:false block_store - chunk_iterator) + chunk_iterator + ~cycle_range) cycles_interval_to_cement in return (new_savepoint, new_caboose)) diff --git a/src/lib_store/unix/block_store.mli b/src/lib_store/unix/block_store.mli index 034fe00320e9..04116518980d 100644 --- a/src/lib_store/unix/block_store.mli +++ b/src/lib_store/unix/block_store.mli @@ -237,7 +237,7 @@ val store_block : block_store -> Block_repr.t -> Context_hash.t -> unit tzresult Lwt.t (** [cement_blocks ?check_consistency ~write_metadata block_store - chunk_iterator] + chunk_iterator ~cycle_range] Wrapper of {!Cemented_block_store.cement_blocks}. *) val cement_blocks : @@ -245,6 +245,7 @@ val cement_blocks : write_metadata:bool -> block_store -> Cemented_block_store.chunk_iterator -> + cycle_range:int32 * int32 -> unit tzresult Lwt.t (** [move_floating_store block_store ~src ~dst_kind] closes the -- GitLab From 9531b018b2953062a505e1777c4fdd9b53bac4e9 Mon Sep 17 00:00:00 2001 From: Victor Allombert Date: Mon, 27 Nov 2023 09:42:27 +0100 Subject: [PATCH 3/3] Tezt: fix inconsistent snapshot drag after rolling import test --- tezt/tests/storage_snapshots.ml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tezt/tests/storage_snapshots.ml b/tezt/tests/storage_snapshots.ml index b7b1a710ed28..e4e9628d6464 100644 --- a/tezt/tests/storage_snapshots.ml +++ b/tezt/tests/storage_snapshots.ml @@ -161,7 +161,7 @@ let check_blocks_availability node ~history_mode ~head ~savepoint ~caboose = match history_mode with | Node.Full_history -> iter_block_range_s 1 (savepoint - 1) @@ expect_no_metadata - | _ -> + | Node.Rolling_history -> if caboose <> 0 then iter_block_range_s 1 (caboose - 1) @@ expect_no_block else unit @@ -312,10 +312,10 @@ let test_export_import_snapshots = let wait_for_complete_merge node target = let wait_for_starting_merge target = let filter json = - let level = JSON.(json |> as_int) in + let level = JSON.(json |-> "stop" |> as_int) in if level = target then Some () else None in - Node.wait_for node "start_merging_stores.v0" filter + Node.wait_for node "start_cementing_blocks.v0" filter in let wait_for_ending_merge () = Node.wait_for node "end_merging_stores.v0" @@ fun _json -> Some () @@ -383,6 +383,7 @@ let test_drag_after_rolling_import = ~name:fresh_node_name ~snapshot:(snapshot_dir // filename, false) node_arguments + ~event_sections_levels:[("node.store", `Info)] in (* Baking a few blocks so that the caboose is not the genesis anymore. *) @@ -432,7 +433,7 @@ let test_drag_after_rolling_import = expected_head - ((preserved_cycles + additional_cycles) * blocks_per_cycle) in - (checkpoint, savepoint, savepoint - max_op_ttl) + (checkpoint, savepoint, min savepoint (checkpoint - max_op_ttl)) in let* () = check_consistency_after_import @@ -442,6 +443,11 @@ let test_drag_after_rolling_import = ~expected_savepoint ~expected_caboose in + (* Restart the node to invalidate the cache and avoid false + positives. *) + let* () = Node.terminate fresh_node in + let* () = Node.run fresh_node node_arguments in + let* () = Node.wait_for_ready fresh_node in let* () = check_blocks_availability fresh_node -- GitLab