[dev] synchronous write

Manlio Perillo manlio_perillo at libero.it
Mon Oct 22 23:48:48 MSD 2007


Manlio Perillo ha scritto:
> Igor Sysoev ha scritto:
>> On Mon, Oct 22, 2007 at 01:11:21PM +0200, Manlio Perillo wrote:
>>
>>> Igor Sysoev ha scritto:
>>>> [...]
>>>>>> No, this completely kill the idea of nginx - a worker will be 
>>>>>> blocked.
>>>>>>
>>>>> Unfortunately this is required by the WSGI spec, and some "legacy" 
>>>>> WSGI applications will block the worker, anyway.
>>>>>
>>>>> I have implemented an alternative version that uses a buffer, but I 
>>>>> would like to know if using this "hack" is "safe", that is if Nginx 
>>>>> will send the correct data to the client and if after setting again 
>>>>> the socket to nonblocking mode, Nginx will work as usual.
>>>> Yes, it will work. However, you should use the following cycle:
>>>>
>>>>    ngx_blocking(self->r->connection->fd);
>>>>
>>>>    do {
>>>>        rc = ngx_http_output_filter(self->r, &out);
>>>>    } while (rc == NGX_AGAIN);
>>>>
>>>>    ngx_nonblocking(self->r->connection->fd);
>>>>
>>> That's unexpected, I have assumed that with socket in blocking mode 
>>> ngx_http_output_filter never returns NGX_AGAIN.
>>
>> No, write() to a socket in blocking mode may send less bytes than you 
>> ask.
>>
> 
> But NGX_AGAIN is returned also for EINTR?
> 
> I have noted that when testing your "patch" over a slow connection 
> (qemu) and with a very big buffer, hitting Ctrl-C cause an infinite(?) 
> loop.
> 

This happen also if the client closes the connection.


Manlio Perillo





More information about the nginx mailing list