好的,谢谢章老师指点,我看了一下相应源码,又发现了一个问题:
上封邮件里提到的content_handler函数,它的返回值会直接传给ngx_http_finalize_request,如下
ngx_http_finalize_request(r, r->content_handler(r));
又因为我的content_handler的返回值是NGX_DONE,所以根据ngx_http_finalize_requset函数的逻辑,他会直接调用ngx_http_finalize_connection,在这个函数里又将r->read_event_handler重置回ngx_http_discarded_request_body_handler,所以r->read_event_handler就被修改了三次.....
问题就变成了ngx_http_upstream_rd_check_broken_connection回调又是在哪被调用的呢?r->read_event_handler已经不存在这个信息了呀
2014/04/02 20:11:02 [debug] 22800#0: timer delta: 5
2014/04/02 20:11:02 [debug] 22800#0: posted events 00000000
2014/04/02 20:11:02 [debug] 22800#0: worker cycle
2014/04/02 20:11:02 [debug] 22800#0: epoll timer: 5000
2014/04/02 20:11:02 [debug] 22800#0: epoll: fd:7 ev:0005 d:08D76544
2014/04/02 20:11:02 [debug] 22800#0: *1 http run request: "/foo?"
2014/04/02 20:11:02 [debug] 22800#0: *1 http read discarded body
2014/04/02 20:11:02 [debug] 22800#0: *1 recv: fd:7 4096 of 4096
2014/04/02 20:11:02 [debug] 22800#0: *1 recv: fd:7 92 of 92
2014/04/02 20:11:02 [debug] 22800#0: *1 http finalize request: -4, "/foo?" a:1, c:2
2014/04/02 20:11:02 [debug] 22800#0: *1 http request count:2 blk:0
2014/04/02 20:11:02 [debug] 22800#0: *1 http run request: "/foo?"
2014/04/02 20:11:02 [debug] 22800#0: *1 http upstream check client, write event:1, "/foo"
2014/04/02 20:11:02 [debug] 22800#0: *1 http upstream recv(): -1 (11: Resource temporarily unavailable)
从上述信息可以看出ngx_http_upstream_rd_check_broken_connection回调确实被执行了.而且是在ngx_http_discarded_request_body_handler回调之后,由同一个事件触发,非常疑惑
谢谢