From 2455e06ecd0a921dabf75ac5bfab5abe552931ce Mon Sep 17 00:00:00 2001 From: Victor Allombert Date: Fri, 19 Apr 2024 15:22:53 +0200 Subject: [PATCH 1/2] Store: allows cemented indexes sync --- src/lib_store/unix/cemented_block_store.ml | 13 +++++++++++-- src/lib_store/unix/cemented_block_store.mli | 6 ++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/lib_store/unix/cemented_block_store.ml b/src/lib_store/unix/cemented_block_store.ml index 01d095def3de..f3183ce10f05 100644 --- a/src/lib_store/unix/cemented_block_store.ml +++ b/src/lib_store/unix/cemented_block_store.ml @@ -69,6 +69,7 @@ type t = { cemented_block_hash_index : Cemented_block_hash_index.t; mutable cemented_blocks_files : cemented_blocks_file array option; metadata_fd_cache : metadata_handler Metadata_fd_cache.t; + readonly : bool; } type chunk_iterator = { @@ -100,6 +101,12 @@ let cemented_block_level_index {cemented_block_level_index; _} = let cemented_block_hash_index {cemented_block_hash_index; _} = cemented_block_hash_index +let may_synchronize_indexes + {cemented_block_level_index; cemented_block_hash_index; readonly; _} = + if readonly then + let () = Cemented_block_level_index.sync cemented_block_level_index in + Cemented_block_hash_index.sync cemented_block_hash_index + (* The log_size corresponds to the maximum size of the memory zone allocated in memory before flushing it onto the disk. It is basically a cache which is use for the index. The cache size is @@ -129,7 +136,7 @@ let init_metadata_fd_cache () = in Metadata_fd_cache.create destroyer default_metadata_fd_cache_size -let create ~log_size cemented_blocks_dir = +let create ~log_size ~readonly cemented_blocks_dir = let open Lwt_result_syntax in protect (fun () -> let cemented_blocks_dir_path = Naming.dir_path cemented_blocks_dir in @@ -178,6 +185,7 @@ let create ~log_size cemented_blocks_dir = cemented_block_hash_index; cemented_blocks_files; metadata_fd_cache; + readonly; } in return cemented_store) @@ -320,6 +328,7 @@ let load ~readonly ~log_size cemented_blocks_dir = cemented_block_hash_index; cemented_blocks_files; metadata_fd_cache; + readonly; } in return cemented_store @@ -340,7 +349,7 @@ let init ?(log_size = default_index_log_size) chain_dir ~readonly = (Failed_to_init_cemented_block_store cemented_blocks_dir_path) in load ~readonly ~log_size cemented_blocks_dir - | false -> create ~log_size cemented_blocks_dir + | false -> create ~log_size ~readonly cemented_blocks_dir let close cemented_store = (try diff --git a/src/lib_store/unix/cemented_block_store.mli b/src/lib_store/unix/cemented_block_store.mli index ad6d6b70ed29..e9ed02fcb127 100644 --- a/src/lib_store/unix/cemented_block_store.mli +++ b/src/lib_store/unix/cemented_block_store.mli @@ -156,6 +156,12 @@ val cemented_block_level_index : t -> Cemented_block_level_index.t index. *) val cemented_block_hash_index : t -> Cemented_block_hash_index.t +(** [may_synchronize_indexes cemented_store] updates a RO index + instance to allow concurrent access to the value added by a RW + instance. This operation is expected to be cheap (~10us) and has + no effect on RW instances. *) +val may_synchronize_indexes : t -> unit + (** [load_table ~cemented_blocks_dir] reads the [cemented_blocks_dir] directory and instantiate the cemented blocks chunks files. *) val load_table : -- GitLab From 3384b94f11310d62cd000a3c23d4209d926633d3 Mon Sep 17 00:00:00 2001 From: Victor Allombert Date: Mon, 22 Apr 2024 09:27:44 +0200 Subject: [PATCH 2/2] Store: allows cemented_blocks_files sync --- src/lib_store/unix/cemented_block_store.ml | 6 ++++++ src/lib_store/unix/cemented_block_store.mli | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/src/lib_store/unix/cemented_block_store.ml b/src/lib_store/unix/cemented_block_store.ml index f3183ce10f05..1fad8deccebc 100644 --- a/src/lib_store/unix/cemented_block_store.ml +++ b/src/lib_store/unix/cemented_block_store.ml @@ -333,6 +333,12 @@ let load ~readonly ~log_size cemented_blocks_dir = in return cemented_store +let reload_cemented_blocks_files t = + let open Lwt_result_syntax in + let* cemented_blocks_files = load_table t.cemented_blocks_dir in + t.cemented_blocks_files <- cemented_blocks_files ; + return_unit + let init ?(log_size = default_index_log_size) chain_dir ~readonly = let open Lwt_result_syntax in let cemented_blocks_dir = Naming.cemented_blocks_dir chain_dir in diff --git a/src/lib_store/unix/cemented_block_store.mli b/src/lib_store/unix/cemented_block_store.mli index e9ed02fcb127..85673e276f79 100644 --- a/src/lib_store/unix/cemented_block_store.mli +++ b/src/lib_store/unix/cemented_block_store.mli @@ -141,6 +141,11 @@ val close : t -> unit lowest known cycle of the store. *) val cemented_blocks_files : t -> cemented_blocks_file array option +(** [reload_cemented_blocks_files cemented_store] updates the cemented + store so the latest cemented files are available. This is + particularly useful for RO instances. *) +val reload_cemented_blocks_files : t -> (unit, tztrace) result Lwt.t + (** [cemented_metadata_files cemented_store] returns the {b current} array of cemented metadata files. The returned array is sorted in ascending order such that the first element of the array is the -- GitLab