Skip to content

Commit 32968f9

Browse files
committed
CA-218103: v6: don't daemonise
Remove the daemonisation and watchdog code now that were are using systemd. Systemd will do all the forking and watching for us. The rest of the code in v6daemon.ml will go away once we move v6d to xcp-idl. Signed-off-by: Rob Hoes <[email protected]>
1 parent 0cecd90 commit 32968f9

File tree

3 files changed

+5
-138
lines changed

3 files changed

+5
-138
lines changed

ocaml/license/OMakefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
OCAML_LIBS = ../util/version ../idl/ocaml_backend/xapi_client
22
OCAMLINCLUDES = ../idl/ocaml_backend ../idl ../autogen ../xapi ../gpg ../util
3-
OCAMLPACKS = xml-light2 stdext stunnel http-svr xcp rpclib uuid
3+
OCAMLPACKS = xml-light2 stdext stunnel http-svr xcp rpclib uuid systemd
44

55
UseCamlp4(rpclib.syntax, v6rpc v6errors)
66

ocaml/license/v6daemon.ml

Lines changed: 3 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ open Printf
1919
module D=Debug.Make(struct let name="v6daemon" end)
2020
open D
2121

22-
module W=Debug.Make(struct let name="watchdog" end)
23-
2422
let xmlrpc_handler process req bio _ =
2523
Debug.with_thread_associated "v6d_handler" (fun () ->
2624
let path = match String.split '/' req.Http.Request.uri with
@@ -43,149 +41,18 @@ let xmlrpc_handler process req bio _ =
4341

4442
let server = Http_svr.Server.empty ()
4543

46-
let daemon_init post_daemonize_hook process =
44+
let startup process =
4745
Debug.with_thread_associated "daemon_init" (fun () ->
48-
post_daemonize_hook ();
49-
46+
info "(Re)starting v6d...";
5047
(* unix socket *)
5148
let unix_socket_path = Filename.concat "/var/lib/xcp" "v6" in
5249
Stdext.Unixext.mkdir_safe (Filename.dirname unix_socket_path) 0o700;
5350
Stdext.Unixext.unlink_safe unix_socket_path;
5451
let domain_sock = Http_svr.bind (Unix.ADDR_UNIX(unix_socket_path)) "unix_rpc" in
5552
Http_svr.start server domain_sock;
5653
Http_svr.Server.add_handler server Http.Post "/" (Http_svr.BufIO (xmlrpc_handler process));
57-
58-
(* TCP socket: only use for testing! *)
59-
(* let localhost = Unix.inet_addr_of_string "127.0.0.1" in
60-
let localhost_sock = Http_svr.bind (Unix.ADDR_INET(localhost, 4094)) in
61-
ignore(Http_svr.start (localhost_sock, "inet-RPC"));*)
62-
54+
ignore Daemon.(notify State.Ready);
6355
(* keep daemon alive *)
6456
Stdext.Threadext.keep_alive ()
6557
) ()
6658

67-
let watchdog f =
68-
Debug.with_thread_associated "watchdog" (fun () ->
69-
(* parent process blocks sigint and forward sigterm to child. *)
70-
ignore(Unix.sigprocmask Unix.SIG_BLOCK [Sys.sigint]);
71-
Sys.catch_break false;
72-
73-
(* watchdog logic *)
74-
let loginfo fmt = W.info fmt in
75-
76-
let restart = ref true
77-
and error_msg = ref "" and exit_code = ref 0
78-
and last_badsig = ref (0.) and pid = ref 0
79-
and last_badexit = ref (0.) and no_retry_interval = 10. in
80-
81-
while !restart
82-
do
83-
begin
84-
loginfo "(Re)starting v6d...";
85-
if !pid = 0 then
86-
begin
87-
let newpid = Unix.fork () in
88-
if newpid = 0 then
89-
begin
90-
try
91-
ignore(Unix.sigprocmask Unix.SIG_UNBLOCK [Sys.sigint]);
92-
f ();
93-
exit 127
94-
with e ->
95-
error "Caught exception at toplevel: '%s'" (Printexc.to_string e);
96-
Debug.log_backtrace e (Backtrace.get e);
97-
raise e (* will exit the process with rc=2 *)
98-
end;
99-
(* parent just reset the sighandler *)
100-
Sys.set_signal Sys.sigterm (Sys.Signal_handle (fun i ->
101-
restart := false; Unix.kill newpid Sys.sigterm));
102-
pid := newpid
103-
end;
104-
try
105-
(* remove the pid in all case, except stop *)
106-
match snd (Unix.waitpid [] !pid) with
107-
| Unix.WEXITED 0 ->
108-
loginfo "Received exit code 0. Not restarting.";
109-
pid := 0;
110-
restart := false;
111-
error_msg := "";
112-
| Unix.WEXITED i ->
113-
loginfo "Received exit code %d" i;
114-
exit_code := i;
115-
pid := 0;
116-
let ctime = Unix.time () in
117-
if ctime < (!last_badexit +. no_retry_interval) then
118-
begin
119-
restart := false;
120-
loginfo "Received 2 bad exits within no-retry-interval. Giving up.";
121-
end
122-
else
123-
begin
124-
(* restart := true; -- don't need to do this - it's true already *)
125-
loginfo "Received bad exit, retrying";
126-
last_badexit := ctime
127-
end
128-
| Unix.WSIGNALED i ->
129-
loginfo "Received signal %s" (Stdext.Unixext.string_of_signal i);
130-
pid := 0;
131-
(* arbitrary choice of signals, probably need more though, for real use *)
132-
if i = Sys.sigsegv || i = Sys.sigpipe then
133-
begin
134-
let ctime = Unix.time () in
135-
if ctime < (!last_badsig +. no_retry_interval) then
136-
begin
137-
restart := false;
138-
error_msg := sprintf "v6d died with signal %d: not restarting (2 bad signals within no_retry_interval)" i;
139-
exit_code := 13
140-
end
141-
else
142-
begin
143-
loginfo "v6d died with signal %d: restarting" i;
144-
last_badsig := ctime
145-
end
146-
end
147-
else
148-
begin
149-
restart := false;
150-
error_msg := sprintf "v6d died with signal %d: not restarting (watchdog never restarts on this signal)" i;
151-
exit_code := 12
152-
end
153-
| Unix.WSTOPPED i ->
154-
loginfo "Receive stop code %i" i;
155-
Unix.sleep 1;
156-
(* well, just resume the stop process. the watchdog cannot do anything if the process is stopped *)
157-
Unix.kill !pid Sys.sigcont;
158-
with
159-
| Unix.Unix_error(Unix.EINTR,_,_) -> ()
160-
| e -> loginfo "Watchdog received unexpected exception: %s" (Printexc.to_string e)
161-
end;
162-
done;
163-
if !error_msg <> "" then
164-
begin
165-
loginfo "v6d watchdog exiting.";
166-
loginfo "Fatal: %s" !error_msg;
167-
eprintf "%s\n" !error_msg;
168-
end;
169-
exit !exit_code
170-
) ()
171-
172-
173-
let daemon = ref false
174-
let pidfile = ref ""
175-
176-
(* A lot of this boilerplate ought to go into a utility library *)
177-
let startup post_daemonize_hook process =
178-
(* Parse command-line arguments *)
179-
Arg.parse [ "-daemon", Arg.Set daemon, "Daemonize";
180-
"-pidfile", Arg.Set_string pidfile, "pidfile"]
181-
(fun x -> warn "Ignoring argument: %s" x)
182-
"v6 licensing daemon";
183-
184-
if !daemon then
185-
Stdext.Unixext.daemonize ();
186-
187-
if !pidfile <> "" then
188-
Stdext.Unixext.pidfile_write !pidfile;
189-
190-
watchdog (fun () -> daemon_init post_daemonize_hook process)
191-

ocaml/license/v6daemon.mli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@
1515
(** Licensing daemon creation module *)
1616

1717
(** Create and start up the licensing daemon *)
18-
val startup : (unit -> 'a) -> (Rpc.call -> Rpc.response) -> unit
18+
val startup : (Rpc.call -> Rpc.response) -> unit

0 commit comments

Comments
 (0)