From f5a0430b8471e86fe8800fbdca6e74ca35283807 Mon Sep 17 00:00:00 2001 From: rand00 Date: Fri, 28 Mar 2025 10:34:19 +0100 Subject: [PATCH 1/5] zmq-deferred/src/Socket: Trying out ignoring EINTR --- zmq-deferred/src/socket.ml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/zmq-deferred/src/socket.ml b/zmq-deferred/src/socket.ml index 0d34713..21063de 100644 --- a/zmq-deferred/src/socket.ml +++ b/zmq-deferred/src/socket.ml @@ -141,6 +141,9 @@ module Make(T: Deferred.T) = struct event_loop t | exception Unix.Unix_error(Unix.ENOTSOCK, "zmq_getsockopt", "") -> Deferred.return () + | exception Unix.Unix_error(Unix.EINTR, "zmq_getsockopt", "") -> + Format.eprintf "DEBUG: ZMQ-lwt: Got EINTR, retrying..\n%!"; + event_loop t end let of_socket: ('a Zmq.Socket.t -> 'a t) of_socket_args = fun socket -> From 65c1097bc33b5b06fd9ef4c8cd96ac833687dda8 Mon Sep 17 00:00:00 2001 From: rand00 Date: Fri, 28 Mar 2025 10:45:45 +0100 Subject: [PATCH 2/5] zmq-deferred/src/Socket: Removed debug-printing - retrying on EINTR works --- zmq-deferred/src/socket.ml | 1 - 1 file changed, 1 deletion(-) diff --git a/zmq-deferred/src/socket.ml b/zmq-deferred/src/socket.ml index 21063de..e4cda35 100644 --- a/zmq-deferred/src/socket.ml +++ b/zmq-deferred/src/socket.ml @@ -142,7 +142,6 @@ module Make(T: Deferred.T) = struct | exception Unix.Unix_error(Unix.ENOTSOCK, "zmq_getsockopt", "") -> Deferred.return () | exception Unix.Unix_error(Unix.EINTR, "zmq_getsockopt", "") -> - Format.eprintf "DEBUG: ZMQ-lwt: Got EINTR, retrying..\n%!"; event_loop t end From ceee3a27d179d05873f553b2a29c4240e63b289f Mon Sep 17 00:00:00 2001 From: rand00 Date: Fri, 28 Mar 2025 13:16:38 +0100 Subject: [PATCH 3/5] zmq-deferred/src/Socket: Added retrying after EINTR error from 'zmq_msg_recv' + Readded debug-printing --- zmq-deferred/src/socket.ml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/zmq-deferred/src/socket.ml b/zmq-deferred/src/socket.ml index e4cda35..6c77e69 100644 --- a/zmq-deferred/src/socket.ml +++ b/zmq-deferred/src/socket.ml @@ -141,7 +141,11 @@ module Make(T: Deferred.T) = struct event_loop t | exception Unix.Unix_error(Unix.ENOTSOCK, "zmq_getsockopt", "") -> Deferred.return () - | exception Unix.Unix_error(Unix.EINTR, "zmq_getsockopt", "") -> + | exception Unix.Unix_error(Unix.EINTR, ( + "zmq_msg_recv" + | "zmq_getsockopt" + ), "") -> + Format.eprintf "DEBUG: ZMQ-lwt: Got EINTR, retrying..\n%!"; event_loop t end From 9aa9753cdf41676cfdcfc347ed59ade42760672b Mon Sep 17 00:00:00 2001 From: rand00 Date: Fri, 28 Mar 2025 13:34:49 +0100 Subject: [PATCH 4/5] zmq-deferred/src/Socket: Fixed that exception from 'zmq_msg_recv' isn't raised in 'event_loop' but in 'recv_all' - so added retry in this spot too --- zmq-deferred/src/socket.ml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/zmq-deferred/src/socket.ml b/zmq-deferred/src/socket.ml index 6c77e69..3020ad3 100644 --- a/zmq-deferred/src/socket.ml +++ b/zmq-deferred/src/socket.ml @@ -141,11 +141,8 @@ module Make(T: Deferred.T) = struct event_loop t | exception Unix.Unix_error(Unix.ENOTSOCK, "zmq_getsockopt", "") -> Deferred.return () - | exception Unix.Unix_error(Unix.EINTR, ( - "zmq_msg_recv" - | "zmq_getsockopt" - ), "") -> - Format.eprintf "DEBUG: ZMQ-lwt: Got EINTR, retrying..\n%!"; + | exception Unix.Unix_error(Unix.EINTR, "zmq_getsockopt", "") -> + Format.eprintf "DEBUG: ZMQ-lwt: Got EINTR in event-loop - retrying..\n%!"; event_loop t end @@ -169,7 +166,9 @@ module Make(T: Deferred.T) = struct let f' mailbox () = let res = match f t.socket with | v -> Ok v - | exception Unix.Unix_error (Unix.EAGAIN, _, _) -> + | exception Unix.Unix_error (Unix.EAGAIN, _, _) + | exception Unix.Unix_error (Unix.EINTR, "zmq_msg_recv", _) -> + Format.eprintf "DEBUG: ZMQ-lwt: Got EINTR from 'zmq_msg_recv' - retrying..\n%!"; (* Signal try again *) raise Retry | exception exn -> Error exn From 1e1dd9e72e52ffba84cb9ff463e491a0f288916d Mon Sep 17 00:00:00 2001 From: rand00 Date: Fri, 28 Mar 2025 13:47:58 +0100 Subject: [PATCH 5/5] zmq-deferred/src/Socket: Fixed that we shouldn't print EINTR error when EAGAIN --- zmq-deferred/src/socket.ml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/zmq-deferred/src/socket.ml b/zmq-deferred/src/socket.ml index 3020ad3..6e5de5c 100644 --- a/zmq-deferred/src/socket.ml +++ b/zmq-deferred/src/socket.ml @@ -166,10 +166,11 @@ module Make(T: Deferred.T) = struct let f' mailbox () = let res = match f t.socket with | v -> Ok v - | exception Unix.Unix_error (Unix.EAGAIN, _, _) + | exception Unix.Unix_error (Unix.EAGAIN, _, _) -> + (* Signal try again *) + raise Retry | exception Unix.Unix_error (Unix.EINTR, "zmq_msg_recv", _) -> Format.eprintf "DEBUG: ZMQ-lwt: Got EINTR from 'zmq_msg_recv' - retrying..\n%!"; - (* Signal try again *) raise Retry | exception exn -> Error exn in