From b113c1f096830fbabdfea586cd3b0f41c5ce4611 Mon Sep 17 00:00:00 2001 From: John Estabrook Date: Sat, 1 Nov 2025 22:12:34 -0500 Subject: T7980: use write_internal_atomic for running cache and refactor --- src/session.ml | 60 ++++++++++++++++++++++++++++++++++++++++++--------------- src/session.mli | 6 +++++- src/vyconfd.ml | 15 ++++++--------- 3 files changed, 55 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/session.ml b/src/session.ml index 5f70feb..f5fff2f 100644 --- a/src/session.ml +++ b/src/session.ml @@ -251,23 +251,51 @@ let save w s file = | Error e -> raise (Session_error (Printf.sprintf "Error saving config: %s" e)) | Ok () -> s -let prepare_commit ?(dry_run=false) w config id pid sudo_user user = - let at = w.running_config in - let rt = w.reference_tree in +let write_running_cache w = let vc = w.vyconf_config in - let () = - try - IC.write_internal at (FP.concat vc.session_dir vc.running_cache) - with - Vyos1x.Internal.Write_error msg -> raise (Session_error msg) - in - let () = - try - IC.write_internal config (FP.concat vc.session_dir vc.session_cache) - with - Vyos1x.Internal.Write_error msg -> raise (Session_error msg) - in - CC.make_commit_data ~dry_run:dry_run rt at config id pid sudo_user user + try + let () = + IC.write_internal_atomic + w.running_config + (FP.concat vc.session_dir vc.running_cache); + in Ok () + with + Vyos1x.Internal.Write_error msg -> + let msg = + Printf.sprintf "Write error caching running config: %s" msg + in Error msg + +let write_session_cache w config = + let vc = w.vyconf_config in + try + let () = + IC.write_internal + config + (FP.concat vc.session_dir vc.session_cache); + in Ok () + with + Vyos1x.Internal.Write_error msg -> + let msg = + Printf.sprintf "Write error caching session config: %s" msg + in Error msg + +let prepare_commit ?(dry_run=false) w s config id = + let opt_running = write_running_cache w in + let opt_session = write_session_cache w config in + match opt_running, opt_session with + | Ok (), Ok () -> + Ok (CC.make_commit_data + ~dry_run:dry_run + w.reference_tree + w.running_config + config + id + s.client_pid + s.client_sudo_user + s.client_user) + | Error msg, Ok () -> Error msg + | Ok (), Error msg -> Error msg + | Error msg1, Error msg2 -> Error (Printf.sprintf "%s\n %s" msg1 msg2) let post_process_commit w s ((c_data: CC.commit_data), proposed_config) = let ident n v y = diff --git a/src/session.mli b/src/session.mli index a08f873..1750f6c 100644 --- a/src/session.mli +++ b/src/session.mli @@ -69,7 +69,11 @@ val list_children : world -> session_data -> string list -> string list val string_of_op : cfg_op -> string -val prepare_commit : ?dry_run:bool -> world -> Vyos1x.Config_tree.t -> string -> int32 -> string -> string -> Commitd_client.Commit.commit_data +val write_running_cache : world -> (unit, string) result + +val write_session_cache : world -> Vyos1x.Config_tree.t -> (unit, string) result + +val prepare_commit : ?dry_run:bool -> world -> session_data -> Vyos1x.Config_tree.t -> string -> (Commitd_client.Commit.commit_data, string) result val post_process_commit : world -> session_data -> Commitd_client.Commit.commit_data * Vyos1x.Config_tree.t -> Vyos1x.Config_tree.t * Vyos1x.Config_tree.t diff --git a/src/vyconfd.ml b/src/vyconfd.ml index 05cd693..1d270ab 100644 --- a/src/vyconfd.ml +++ b/src/vyconfd.ml @@ -274,16 +274,13 @@ let commit world token (req: request_commit) = let proposed_config = Session.get_proposed_config world s in let req_dry_run = Option.value req.dry_run ~default:false in let commit_data = - Session.prepare_commit - ~dry_run:req_dry_run - world - proposed_config - token - s.client_pid - s.client_sudo_user - s.client_user + Session.prepare_commit ~dry_run:req_dry_run world s proposed_config token in - let%lwt received_commit_data = VC.do_commit commit_data in + match commit_data with + | Error msg -> + Lwt.return {response_tmpl with status=Internal_error; error=(Some msg)} + | Ok c_data -> + let%lwt received_commit_data = VC.do_commit c_data in let%lwt result_commit_data = Lwt.return (CC.commit_update received_commit_data) in -- cgit v1.2.3