Lwt和Cohttp:`致命错误:异常Unix.Unix_error(Unix.ECONNRESET,“read”,“”)`

时间:2016-11-08 22:14:57

标签: ocaml ocaml-lwt

我在Ocaml中使用Cohttp和Lwt的简单HTTP服务器。当我运行user_ops时,只要wrk完成,应用程序就会在大约50%的时间内崩溃。我想这次崩溃是由连接的意外拆除引发的。

我在控制台上看到以下错误:

wrk

有没有阻止这个?

我的完整源代码是:

Fatal error: exception Unix.Unix_error(Unix.ECONNRESET, "read", "")
Raised by primitive operation at file "src/unix/lwt_bytes.ml", line 130, characters 42-84
Called from file "src/unix/lwt_unix.ml", line 489, characters 13-24

谢谢!

1 个答案:

答案 0 :(得分:4)

您看到的错误来自客户端意外断开连接时引发的无法异常。相关的异常被传递给Lwt的异步异常钩子(http://ocsigen.org/lwt/2.6.0/api/Lwt#VALasync_exception_hook),根据Lwt的默认情况,它会打印一个回溯并退出程序,退出代码为2

关于cohttp github问题跟踪器的讨论正在进行中:https://github.com/mirage/ocaml-cohttp/issues/511

简而言之,如果为Lwt的异步/“后台”线程定义自定义异常处理程序,则可以捕获并忽略/记录/处理客户端错误。在启动cohttp服务器之前添加如下内容:

Lwt.async_exception_hook := (function
  | Unix.Unix_error (error, func, arg) ->
    Logs.warn (fun m ->
      m  "Client connection error %s: %s(%S)"
        (Unix.error_message error) func arg
    )
  | exn -> Logs.err (fun m -> m "Unhandled exception: %a" Fmt.exn exn)
);

取自https://github.com/mirage/ocaml-cohttp/issues/511#issuecomment-258510531并使用logs库记录事件:http://erratique.ch/software/logs