Hello!
On Mon, Mar 31, 2014 at 10:01 PM, Kelvin Peng wrote:
> 2014/04/01 12:57:34 [info] 72182#0: *1 [lua] test.lua:22: closing, client:
> 127.0.0.1, server: , request: "GET /t HTTP/1.1", host: "127.0.0.1:8060"
> 2014/04/01 12:57:34 [error] 72182#0: *1 [lua] test.lua:28: socket busy,
> client: 127.0.0.1, server: , request: "GET /t HTTP/1.1", host:
> "127.0.0.1:8060"
>
> 这时候打开一个table,连接上websocket后关掉这个table,就有可能发生socket
> busy。我观察到大概是90%的几率出现,还有10%正常,这是Bug么?
>
看起来是你的 Lua 代码里的 bug,而不是 ngx_lua 的问题。“socket busy”错误是当有两个“轻线程”同时使用一个
cosocket 对象时抛出的。你这里的 ngx.on_abort()
注册的回调是会运行在独立的“轻线程”中的,这个“轻线程”和你请求本身的主“轻线程”是同时(并发)运行的,所以如果你在 clean()
函数里访问同一套 cosocket 是很容易遇到“socket busy”错误的。你需要自己进行简单的锁保护(比如通过自己 Lua 变量来作
flag)。
Regards,
-agentzh