[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [MirageOS-devel] problem with NET=socket and multiple connections?

On Fri, Oct 24, 2014 at 3:09 PM, Len Maxwell <len@xxxxxxxx> wrote:
> Hello,
> I am seeing some unexpected behavior with --unix and NET=socket on
> Linux: it looks like the TCP server is not dealing well with multiple
> connections.

Looking at the code in mirage-tcpip/unix/tcpip_stack_socket.ml, the
listener loop does not accept the next connection until the previous
client callback has completed.  This did not look right to me, so I
tried the following:

--- a/unix/tcpip_stack_socket.ml
+++ b/unix/tcpip_stack_socket.ml
@@ -106,9 +106,12 @@ module Make(Console:V1_LWT.CONSOLE) = struct
         if true then loop () else return_unit in
       Lwt_unix.accept fd
       >>= fun (afd, _) ->
-      Lwt.catch
-        (fun () -> callback afd)
-        (fun _ -> return_unit)
+      Lwt.async (fun () ->
+        Lwt.catch
+          (fun () -> callback afd)
+          (fun _ -> return_unit)
+        );
+        return_unit
       >>= fun () ->
       continue ();

With this change, the client callback is handled in an async "thread",
while the listener immediately loops back to accept the next
connection.  My issues with mirage-skeleton/stackv4 and mirage-www (on
unix/socket) seem to be resolved.

However, I'm new to OCaml/Lwt/Mirage, and not too confident this is
the right fix.  I'd appreciate any input.



MirageOS-devel mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.