我在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
谢谢!
答案 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