summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@vyos.io>2025-11-03 13:39:00 +0000
committerGitHub <noreply@github.com>2025-11-03 13:39:00 +0000
commit80e28b1e191fe6f518f7b1ee3d77e672f7397159 (patch)
treecbcb953c1edeb4838191aa7f2b733a3ba2d595fc /src
parent0ac562ebf8f292f5c342d5e2904cbe4dd9933f23 (diff)
parenteb6afbdb35e57687732e0663462629e11c104ae5 (diff)
downloadvyos1x-config-80e28b1e191fe6f518f7b1ee3d77e672f7397159.tar.gz
vyos1x-config-80e28b1e191fe6f518f7b1ee3d77e672f7397159.zip
Merge pull request #55 from jestabro/vyconfd-restart
T7980: add write_internal_atomic to cache config in presence of readers
Diffstat (limited to 'src')
-rw-r--r--src/internal.ml26
-rw-r--r--src/internal.mli1
2 files changed, 27 insertions, 0 deletions
diff --git a/src/internal.ml b/src/internal.ml
index 5ee3926..cd7e968 100644
--- a/src/internal.ml
+++ b/src/internal.ml
@@ -1,3 +1,8 @@
+(*
+ * A functor for 'internal' representation of Config_tree and Reference_tree.
+ * This is useful for avoiding re-parsing *_trees on cache and load.
+ *)
+
exception Read_error of string
exception Write_error of string
@@ -12,6 +17,7 @@ module type T =
module type FI = functor (M: T) ->
sig
val write_internal : M.t -> string -> unit
+ val write_internal_atomic : M.t -> string -> unit
val read_internal : string -> M.t
val replace_internal : string -> string -> unit
end
@@ -44,6 +50,26 @@ module Make : FI = functor (M: T) -> struct
let ct = Result.value ct_res ~default:M.default in
close_in_noerr ic; ct
+ let write_internal_atomic x file_name =
+ let file_name_tmp = file_name ^ ".tmp" in
+ let yt = M.to_yojson x in
+ let ys = Yojson.Safe.to_string yt in
+ let fd =
+ try
+ Unix.openfile file_name_tmp [Unix.O_CREAT;Unix.O_WRONLY] 0o664
+ with Unix.Unix_error (e,f,p) ->
+ let out =
+ Printf.sprintf "%s %s: %s" (Unix.error_message e) f p
+ in raise (Write_error out)
+ 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.chmod file_name_tmp 0o664 in
+ let () = Unix.rename file_name_tmp file_name in
+ close_out_noerr oc
+
let replace_internal dst src =
let tmp = src ^ ".tmp" in
try
diff --git a/src/internal.mli b/src/internal.mli
index a82232d..4fc9b10 100644
--- a/src/internal.mli
+++ b/src/internal.mli
@@ -12,6 +12,7 @@ module type T =
module type FI = functor (M : T) ->
sig
val write_internal : M.t -> string -> unit
+ val write_internal_atomic : M.t -> string -> unit
val read_internal : string -> M.t
val replace_internal : string -> string -> unit
end