From 12dd62a1081a37d49bb663a39651f886115c0ca9 Mon Sep 17 00:00:00 2001 From: John Estabrook Date: Wed, 11 Jun 2025 11:49:11 -0500 Subject: T7499: add non-/destructive configtree merge --- src/config_diff.ml | 10 ++++++++++ src/config_diff.mli | 1 + 2 files changed, 11 insertions(+) diff --git a/src/config_diff.ml b/src/config_diff.ml index 87b2663..73c379b 100644 --- a/src/config_diff.ml +++ b/src/config_diff.ml @@ -456,3 +456,13 @@ let tree_union s t = Vytree.make_full data (name_of v) (children_of v) in Tree_alg.ConfigAlg.tree_union s t f + +let tree_merge ?(destructive=false) s t = + let f u v = + let data = + match destructive with + | false -> data_of u + | true -> data_of v + in Vytree.make_full data (name_of v) (children_of v) + in + Tree_alg.ConfigAlg.tree_union s t f diff --git a/src/config_diff.mli b/src/config_diff.mli index 4262a58..fdc662c 100644 --- a/src/config_diff.mli +++ b/src/config_diff.mli @@ -45,6 +45,7 @@ val clone : ?recurse:bool -> ?set_values:string list option -> Config_tree.t -> val diff_tree : string list -> Config_tree.t -> Config_tree.t -> Config_tree.t val show_diff : ?cmds:bool -> string list -> Config_tree.t -> Config_tree.t -> string val tree_union : Config_tree.t -> Config_tree.t -> Config_tree.t +val tree_merge : ?destructive:bool -> Config_tree.t -> Config_tree.t -> Config_tree.t val mask_tree : Config_tree.t -> Config_tree.t -> Config_tree.t val make_diff_cstore : Config_tree.t -> Config_tree.t -> int -> Diff_cstore.t result val get_tagged_delete_tree : Config_tree.t -> Config_tree.t -- cgit v1.2.3 From 3be3209da87ad0902a77f1cda97c91a5033585e8 Mon Sep 17 00:00:00 2001 From: John Estabrook Date: Thu, 3 Jul 2025 19:31:24 -0500 Subject: T7499: remove internal locking Read/write of internal cache always occurs under an external lock; remove internal lock. --- src/internal.ml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/internal.ml b/src/internal.ml index a57f3db..3951f92 100644 --- a/src/internal.ml +++ b/src/internal.ml @@ -21,17 +21,10 @@ module Make : FI = functor (M: T) -> struct let yt = M.to_yojson x in let ys = Yojson.Safe.to_string yt in let fd = Unix.openfile file_name [Unix.O_CREAT;Unix.O_WRONLY] 0o664 in - let () = - try - Unix.lockf fd Unix.F_TLOCK 0 - with _ -> - Unix.close fd; raise (Write_error "write lock unavailable") - in let oc = Unix.out_channel_of_descr fd in let () = Unix.ftruncate fd 0 in let () = Printf.fprintf oc "%s" ys in let () = Unix.fsync fd in - let () = Unix.lockf fd Unix.F_ULOCK 0 in close_out_noerr oc let read_internal file_name = @@ -43,12 +36,6 @@ module Make : FI = functor (M: T) -> struct Printf.sprintf "%s %s: %s" (Unix.error_message e) f p in raise (Read_error out) in - let () = - try - Unix.lockf fd Unix.F_TEST 0 - with _ -> - Unix.close fd; raise (Read_error "read lock unavailable") - in let ic = Unix.in_channel_of_descr fd in let ys = really_input_string ic (in_channel_length ic) in let yt = Yojson.Safe.from_string ys in -- cgit v1.2.3 From c01c370535640d3cbd4e4c3839d570c596e11695 Mon Sep 17 00:00:00 2001 From: John Estabrook Date: Sun, 6 Jul 2025 18:16:29 -0500 Subject: T7499: set appropriate permissions on write cache --- src/internal.ml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/internal.ml b/src/internal.ml index 3951f92..5ee3926 100644 --- a/src/internal.ml +++ b/src/internal.ml @@ -25,6 +25,7 @@ module Make : FI = functor (M: T) -> struct let () = Unix.ftruncate fd 0 in let () = Printf.fprintf oc "%s" ys in let () = Unix.fsync fd in + let () = Unix.chmod file_name 0o664 in close_out_noerr oc let read_internal file_name = -- cgit v1.2.3