From 12f02be6ab5ee45280c0b8714552e9ca78a4aad5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr> Date: Wed, 30 Mar 2022 14:55:38 +0200 Subject: [PATCH] [server] maximal socket buffer size --- src/plugins/server/server_socket.ml | 41 ++++++++++++++++++----------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/src/plugins/server/server_socket.ml b/src/plugins/server/server_socket.ml index b70df948852..9e7d1902ede 100644 --- a/src/plugins/server/server_socket.ml +++ b/src/plugins/server/server_socket.ml @@ -41,6 +41,15 @@ module Socket = Senv.String Finally, the server is executed until shutdown." end) +let () = Parameter_customize.set_group socket_group +module SocketSize = Senv.Int + (struct + let option_name = "-server-socket-size" + let arg_name = "n" + let default = 8192 + let help = "Set the maximal size of socket buffers (default: 8192)" + end) + let _ = Server_doc.protocole ~title:"Unix Socket Protocol" ~readme:"server_socket.md" @@ -237,9 +246,11 @@ let channel (s: socket) = | None -> try let sock,_ = Unix.accept ~cloexec:true s.socket in - let snd = Unix.getsockopt_int sock SO_SNDBUF in - let rcv = Unix.getsockopt_int sock SO_RCVBUF in - Senv.debug "Client connected" ; + Unix.set_nonblock sock ; + let size = max 256 (SocketSize.get ()) in + let rcv = min size @@ Unix.getsockopt_int sock SO_RCVBUF in + let snd = min size @@ Unix.getsockopt_int sock SO_SNDBUF in + Senv.debug "Client connected (in: %d) (out: %d)" rcv snd ; let ch = Some { sock ; snd = Bytes.create snd ; @@ -262,12 +273,10 @@ let fetch (s:socket) () = Senv.warning "Socket: exn %s" (Printexc.to_string exn) ; close s ; None -let bind fd = +let establish_server fd = let socket = { socket = fd ; channel = None } in try - Unix.set_nonblock fd ; Unix.listen fd 1 ; - Unix.set_nonblock fd ; ignore (Sys.signal Sys.sigpipe Signal_ignore) ; let pretty = Format.pp_print_string in let server = Main.create ~pretty ~fetch:(fetch socket) () in @@ -293,17 +302,16 @@ let bind fd = let server = ref None let cmdline () = - let addr = Socket.get () in - match !server with - | Some addr0 -> - if Senv.debug_atleast 1 && addr <> addr0 then + let option = match Socket.get () with "" -> None | a -> Some a in + match !server, option with + | _ , None -> () + | Some addr0, Some addr -> + if addr0 <> addr then Senv.warning "Socket server already running on [%s]." addr0 - else - Senv.feedback "Socket server already running." - | None -> - if addr <> "" then + | None, Some addr -> + begin try - server := Some addr ; + server := option ; if Sys.file_exists addr then Unix.unlink addr ; let fd = Unix.socket PF_UNIX SOCK_STREAM 0 in Unix.bind fd (ADDR_UNIX addr) ; @@ -311,10 +319,11 @@ let cmdline () = Senv.feedback "Socket server running on [%s]." addr else Senv.feedback "Socket server running." ; - bind fd + establish_server fd ; with exn -> Senv.fatal "Server socket failed.@\nError: %s@" (Printexc.to_string exn) + end let () = Db.Main.extend cmdline -- GitLab