Это фильтр или модуль ? Если модуль - как завершается ?
Это фильтр.
Нужно смотреть на rc == NGX_AGAIN.
NGX_AGAIN вижу, но как правильно отличить в ngx_http_*_body_filter
режим докачки от ее завершения, ngx_chain_t* in == NULL
при NGX_AGAIN ?
----- Original Message -----
From: "Igor Sysoev" <is@xxxxxxxxxxxxx>
To: <nginx-ru@xxxxxxxxx>
Sent: Friday, July 06, 2007 3:29 PM
Subject: Re: Баг или фича?
On Fri, Jul 06, 2007 at 03:02:17PM +0400, Denis Erygin wrote:
>Это в стандартном nginx'е или с использованием своих модулей ?
>В стандартном всё должно работать.
В стандартном nginx'e я не нашел модулей, которые заходят в эту ветку
с writev.
"sendfile off" - и будут заходить.
Да, это свой модуль, который формирует цепочку chain буферов по 4 Кб,
но это все же достаточно низкий уровень, чтобы модуль мог на что-то
повлиять.
Это фильтр или модуль ? Если модуль - как завершается ?
Нужно смотреть на rc == NGX_AGAIN.
Цепочка сформирована правильно, дамп header.elts и header.nelts,
передаваемых
в writeev, тоже нормальный. Тот факт, что комментирование того места
приводит
к нормальной отдаче, тоже в пользу правильности цепочки буферов.
Страница получаеся размером ~ 50 Кб, но передается всегда всего 32 Кб.
----- Original Message -----
From: "Igor Sysoev" <is@xxxxxxxxxxxxx>
To: <nginx-ru@xxxxxxxxx>
Sent: Friday, July 06, 2007 2:15 PM
Subject: Re: Баг или фича?
On Fri, Jul 06, 2007 at 01:59:55PM +0400, Denis Erygin wrote:
>>Повторные попытки должны делаться позднее. Верхние уровни должны
>>корректно обрабатывать wev->ready == 0 и возрат != NULL из функции..
>
>В том то и дело, что повторные попытки не делаются даже позднее,
>просто выходит и все. Прошу проверить.
Это в стандартном nginx'е или с использованием своих модулей ?
В стандартном всё должно работать.
>----- Original Message -----
>From: "Igor Sysoev" <is@xxxxxxxxxxxxx>
>To: <nginx-ru@xxxxxxxxx>
>Sent: Friday, July 06, 2007 1:16 PM
>Subject: Re: Баг или фича?
>
>
>On Fri, Jul 06, 2007 at 12:59:10PM +0400, Denis Erygin wrote:
>
>>Под FreeBSD обнаружил проблему с обрезанием страниц больших 32 Кб,
>>под Linux больших 12 КБ, который отдаются в chain-ах из памяти
>>(без in_file = 1, т.е. без использования временных файлов, через
>>writev).
>>Если закомментировать этот блок/условие, то страницы отдаются
>>полностью,
>>но появляется много записей в логах типа этой:
>>
>>writev() not ready (11: Resource temporarily unavailable)
>>
>>Какой смысл несет условие выше, и как можно решить эту проблему
>>более прямым способом? Неужели нельзя вернуться и продолжить запись?
>
>Нет, нельзя - нужно подождать, когда ядро сообщит о свободном месте.
>А в это время можно или обрабатывать другие соединения, или же вообще
>ничего не делать, ожидая в kevent/epoll/etc.
>
>Если же это условие убрать, то nginx будет бессмысленно крутиться
>в цикле, кушая процессор.
>
>>Насколькоя понял, writev гарантировано успевает передать заголовки,
>>затем пытается передать тело, но передает только сколько влезет в
>>системный буфер,
>>затем происходит выход по if (!complete) , после чего повторных
>>попыток
>>продолжения записи не происходит.
>
>Повторные попытки должны делаться позднее. Верхние уровни должны
>корректно обрабатывать wev->ready == 0 и возрат != NULL из функции...
>
>>И это на всех версиях nginx.
>
>