Skip to content
This repository was archived by the owner on Aug 27, 2025. It is now read-only.

Commit ea98868

Browse files
Use Unix domain sockets for state server requests
This is ~3 times faster than the old implementation that used HTTP.
1 parent e762f38 commit ea98868

File tree

1 file changed

+18
-30
lines changed

1 file changed

+18
-30
lines changed

src/eval/StateIPCClient.ml

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -57,35 +57,23 @@ let ipcclient_exn_wrapper thunk =
5757
fail0 ~kind:(Printf.sprintf "StateIPCClient: Unexpected error making JSON-RPC call: %s" e)
5858
?inst:None
5959

60-
type state = { mutable client : Ezcurl.t option };;
61-
let current_state = { client = None };;
60+
type state = { mutable channels : (string, (Core.In_channel.t * Core.Out_channel.t)) Caml.Hashtbl.t }
61+
let current_state = { channels = Caml.Hashtbl.create 64 }
6262

63-
let http_rpc ~socket_addr (call : Rpc.call) : Rpc.response M.t =
64-
let client = match current_state.client with
65-
| Some c -> c
63+
let socket_rpc ~socket_addr (call : Rpc.call) : Rpc.response M.t =
64+
let (ic, oc) = match (Caml.Hashtbl.find_opt current_state.channels socket_addr) with
65+
| Some cs -> cs
6666
| None ->
67-
let c = Ezcurl.make () in
68-
current_state.client <- Some c;
69-
c
67+
let cs = Core_unix.open_connection (Core_unix.ADDR_UNIX socket_addr) in
68+
Caml.Hashtbl.replace current_state.channels socket_addr cs;
69+
cs
7070
in
7171
let msg_buf = Jsonrpc.string_of_call ~version:Jsonrpc.V2 call in
7272
DebugMessage.plog (Printf.sprintf "Sending: %s\n" msg_buf);
73-
let exception Http_error of string in
74-
let response =
75-
match Ezcurl.post ~client ~headers:["content-type", "application/json"] ~content:(`String msg_buf) ~params:[] ~url:socket_addr () with
76-
| Ok response -> response
77-
| Error (_, err) -> (
78-
DebugMessage.plog (Printf.sprintf "error calling RPC: %s" err);
79-
raise (Http_error (Printf.sprintf "error calling RPC: %s" err))
80-
)
81-
in
82-
83-
let response = if response.code = 200 then response.body else (
84-
DebugMessage.plog (Printf.sprintf "error response from RPC: code: %d, body: %s" response.code response.body);
85-
raise (Http_error "error response from RPC")
86-
)
87-
in
88-
73+
(* Send data to the socket. *)
74+
let _ = send_delimited oc msg_buf in
75+
(* Get response. *)
76+
let response = Caml.input_line ic in
8977
DebugMessage.plog (Printf.sprintf "Response: %s\n" response);
9078
M.return @@ Jsonrpc.response_of_string response
9179

@@ -184,7 +172,7 @@ let fetch ~socket_addr ~fname ~keys ~tp =
184172
let%bind q' = encode_serialized_query q in
185173
let%bind res =
186174
let thunk () =
187-
translate_res @@ IPCClient.fetch_state_value (http_rpc ~socket_addr) q'
175+
translate_res @@ IPCClient.fetch_state_value (socket_rpc ~socket_addr) q'
188176
in
189177
ipcclient_exn_wrapper thunk
190178
in
@@ -227,7 +215,7 @@ let external_fetch ~socket_addr ~caddr ~fname ~keys ~ignoreval =
227215
let%bind res =
228216
let thunk () =
229217
translate_res
230-
@@ IPCClient.fetch_ext_state_value (http_rpc ~socket_addr) caddr q'
218+
@@ IPCClient.fetch_ext_state_value (socket_rpc ~socket_addr) caddr q'
231219
in
232220
ipcclient_exn_wrapper thunk
233221
in
@@ -263,7 +251,7 @@ let update ~socket_addr ~fname ~keys ~value ~tp =
263251
let%bind () =
264252
let thunk () =
265253
translate_res
266-
@@ IPCClient.update_state_value (http_rpc ~socket_addr) q' value'
254+
@@ IPCClient.update_state_value (socket_rpc ~socket_addr) q' value'
267255
in
268256
ipcclient_exn_wrapper thunk
269257
in
@@ -283,7 +271,7 @@ let is_member ~socket_addr ~fname ~keys ~tp =
283271
let%bind q' = encode_serialized_query q in
284272
let%bind res =
285273
let thunk () =
286-
translate_res @@ IPCClient.fetch_state_value (http_rpc ~socket_addr) q'
274+
translate_res @@ IPCClient.fetch_state_value (socket_rpc ~socket_addr) q'
287275
in
288276
ipcclient_exn_wrapper thunk
289277
in
@@ -306,7 +294,7 @@ let remove ~socket_addr ~fname ~keys ~tp =
306294
let%bind () =
307295
let thunk () =
308296
translate_res
309-
@@ IPCClient.update_state_value (http_rpc ~socket_addr) q' dummy_val
297+
@@ IPCClient.update_state_value (socket_rpc ~socket_addr) q' dummy_val
310298
in
311299
ipcclient_exn_wrapper thunk
312300
in
@@ -320,7 +308,7 @@ let fetch_bcinfo ~socket_addr ~query_name ~query_args =
320308
let%bind res =
321309
let thunk () =
322310
translate_res
323-
@@ IPCClient.fetch_bcinfo (http_rpc ~socket_addr) query_name query_args
311+
@@ IPCClient.fetch_bcinfo (socket_rpc ~socket_addr) query_name query_args
324312
in
325313
ipcclient_exn_wrapper thunk
326314
in

0 commit comments

Comments
 (0)