From acdd6b33551b4cc9908db6c55eed8aeec857f914 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 16 Oct 2026 11:13:14 +0800 Subject: [PATCH] fix: honor native index node reference policy Preserve persisted Weak and explicit Strong policies when restoring native storage-backed indexes. Cover node collection and reload behavior with a regression test. --- impl/platform/native/platform.ml | 3 ++- test/test_storage.ml | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/impl/platform/native/platform.ml b/impl/platform/native/platform.ml index 8c1bac8..335af8d 100644 --- a/impl/platform/native/platform.ml +++ b/impl/platform/native/platform.ml @@ -206,4 +206,5 @@ let split_regex_limited regex value limit = if limit = 1 then [ value ] else if limit <= 0 then Str.split regex value else Str.bounded_split regex value limit -let strong_index_node_cache = true +(* Let restored index nodes be collected after scans and transactions. *) +let strong_index_node_cache = false diff --git a/test/test_storage.ml b/test/test_storage.ml index a2fd7ac..6e5a68f 100644 --- a/test/test_storage.ml +++ b/test/test_storage.ml @@ -574,7 +574,30 @@ let test_storage__test_empty_and_missing_count_metadata () = | exception Invalid_argument _ -> () | _ -> failwith "negative current snapshot count must be rejected") +let test_storage__test_restore_preserves_node_reference_policy () = + List.iter + (fun (ref_type, keyword) -> + let storage = count_fixture () in + map_storage_root storage (fun root -> { root with storage_ref_type = ref_type }); + let measured, reads = restore_counting_storage storage in + let restored = Option.get (restore measured) in + if List.assoc_opt "ref-type" (settings restored) <> Some (Keyword keyword) then + failwith ("restore must preserve " ^ keyword ^ " index references"); + let lookup () = datoms restored Eavt ~e:1 () in + let expected = lookup () in + reads := []; + Gc.full_major (); + assert_equal_triples "index lookup survives node collection" + (List.map (fun d -> d.e, d.a, d.v) expected) (lookup ()); + match ref_type with + | Persistent_sorted_set.Weak -> + if !reads = [] then failwith "weak index nodes must be reloadable after collection" + | Persistent_sorted_set.Strong -> + if !reads <> [] then failwith "explicit strong index nodes must stay cached") + [ Persistent_sorted_set.Weak, "weak"; Persistent_sorted_set.Strong, "strong" ] + let () = + test_storage__test_restore_preserves_node_reference_policy (); test_storage__test_restore_keeps_snapshot_counts (); test_storage__test_restore_counts_after_tail (); test_storage__test_empty_and_missing_count_metadata ();