diff options
| author | Daniil Baturin <daniil@vyos.io> | 2025-11-03 13:39:00 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-03 13:39:00 +0000 |
| commit | 80e28b1e191fe6f518f7b1ee3d77e672f7397159 (patch) | |
| tree | cbcb953c1edeb4838191aa7f2b733a3ba2d595fc /src | |
| parent | 0ac562ebf8f292f5c342d5e2904cbe4dd9933f23 (diff) | |
| parent | eb6afbdb35e57687732e0663462629e11c104ae5 (diff) | |
| download | vyos1x-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.ml | 26 | ||||
| -rw-r--r-- | src/internal.mli | 1 |
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 |
