不得不佩服章老师的技术品质,无论多忙都能及时回复邮件,真是我等程序员学习的楷模
------------------ 原始邮件 ------------------
发件人: "agentzh";<age...@gmail.com>;
发送时间: 2014年7月26日(星期六) 凌晨3:32
收件人: "openresty"<openresty@googlegroups.com>;
主题: Re: [openresty] 关于nginx body filter
Hello!
2014-07-22 22:54 GMT-07:00 <3169...@qq.com>:
> 在nginx自带的chunked的body filter中我发现在调用ngx_chain_update_chains时,把上次没发完的chain放到了ctx->busy中,应该就是您说的“写不动的情况吧”,但是这个body
> filter中我并没有看到,什么时候处理该ctx->busy,也就是上次没发完的数据啊 ?
>
“写不动”是指操作系统的 socket send buffer(一般是网络协议栈实现的一部分)满了,用户态一时不能向该 socket 发送更多的数据。
“busy buffer”是 nginx 自己的概念,而且是一个相对于 buffer 创建者的概念。当 buffer 的创建者 A(可以是
content handler 或者是某一级 output body filter)发现它创建并发送给下游过滤器的一个 buffer
还没有被标记为“消耗掉”,则 A 就认为该 buffer 是一个“busy buffer”。我之前已经讲到标记为“消耗掉”其实就是
b->pos == b->last,而且不一定是它的数据真的被写到系统 socket send buffer 中(因为某个下游 socket
可能会拦截并替换掉它,如我们之前一直在讨论的情形)。
换言之,每一个 buffer 生产者一般都会在调用完下游输出过滤器(链)之后,通过 ngx_chain_update_chains()
函数对它*自己的* buffer 进行 busy/free 标记和回收。当然只有标记为 free 的 buf 才能回收。这也是 busy
buf 的全部意义所在。kw
> 而其他的一些body filter例如sub filter中,在该body filter下次被调用的时候,都会处理ctx->busy,也就是上次没写到客户端的数据啊?
>
ctx 是各个模块自己的,是独立的。它们各自进行 buf 的回收利用,同时避免对自己的 busy buf 进行回收。
建议在阅读 nginx 源码时一定要仔细和有耐心,同时要避免断章取义。
Regards,
-agentzh
--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty+subscribe@googlegroups.com
发言: 请发邮件到 openresty@googlegroups.com
退订: 请发邮件至 openresty+unsubscribe@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html