Hi,各位大神们:
openresty版本:ngx_openresty-1.7.7.1
服务器(多台)更新共产生了10多个core,core的位置十分确定,都是在 /ngx_lua-0.9.13/src/ngx_http_lua_socket_tcp.c:4418
不是必现,多台服务器(使用上述版本的openresty, 且都向同一后端服务器请求)core的时间点接近,可能在这个时间点附近后端服务器的某一个行为 满足一个导致core的条件,还未查明。
core部分截图如下:
概括截图:

frame 5, u的内容,此处peer的connection为0x0, 我并不晓的这个connection是不是就是上面截图中setkeepalive中用到的connection
frame 0, connection
代码第4418行是:if (c->read->eof || c->read->error || c->read->timedout || c->write->error || c->write->timedout) {........}
遇到空指针,崩了
查看了一下此版本对连接是否关闭的判断为:
pc = &u->peer;
c = pc->connection;
if (u == NULL || pc == NULL || u->read_closed || u->write_closed) {.........}
然后对比了一下之前用过的在此处无问题的版本ngx_openresty-1.7.0.1(ngx_lua-0.9.8),此版本对连接是否断开的判断为:
pc = &u->peer;
c = pc->connection;
if (u == NULL || c == NULL || u->ft_type || u->eof){..........}
有对c是否为NULL作判断
想请教的问题:
在很多流程上,我并不是十分明白,所以想问一下:在新版本中(ngx_lua-0.9.13),是不是 if(!u->read_closed && !u->write_closed){assert(c);}始终是崩不掉的,也就是说如果read_closed 和 write_closed识都是0的话,则 c 必不为NULL ?
我们这边此次服务器更新也包括了pintsized的lua-resty-http模块的更新,如果这边没问题的话,再查查这处
还需要什么详细的信息我再提供,乐意帮忙定位问题。
谢谢!