[dev] synchronous write
Manlio Perillo
manlio_perillo at libero.it
Tue Oct 23 14:51:29 MSD 2007
Igor Sysoev ha scritto:
> On Tue, Oct 23, 2007 at 11:29:41AM +0200, Manlio Perillo wrote:
>
>> Igor Sysoev ha scritto:
>>> [...]
>>>
>>> The loop should be:
>>>
>>> do {
>>> rc = ngx_http_output_filter(self->r, &out);
>>>
>>> self->r->connection->write->ready = 1;
>>>
>>> } while (rc == NGX_AGAIN);
>>>
>>> In usual processing event->ready is set by event module (kqueue/epoll/etc).
>>>
>> Ok, this solves the problem, thanks!
>> Now ngx_http_output_filter returns NGX_ERROR when the client closes the
>> connection.
>>
>> There is only one minor problem.
>> When I send a SIGINT signal to nginx during a blocking write operation,
>> the termination is not "clean":
>>
> [...]
>
> while (rc == NGX_AGAIN && !ngx_quit && !ngx_terminate);
>
>
There is still a problem with a:
[crit] 19816#0: *1 writev() failed (14: Bad address), client: 10.0.0.10,
server: localhost, URL: "/wsgi-write/", host: "localdomain:1234"
The problem may be caused by the memory buffer (owned by Python) being
deallocated when the write function returns and nginx still continues to
write the data.
I have "patched" the code with a:
if (ngx_quit || ngx_terminate) {
b->pos = 0;
b->last = 0;
b->last_buf = 0;
b->memory = 0;
return NULL;
}
Thanks for you support
Manlio Perillo
More information about the nginx
mailing list