Баг или фича?

Denis Erygin erygin at corp.mail.ru
Fri Jul 6 12:59:10 MSD 2007


Добрый день,

Под FreeBSD обнаружил проблему с обрезанием страниц больших 32 Кб,
под Linux больших 12 КБ, который отдаются в chain-ах из памяти 
(без in_file = 1, т.е. без использования временных файлов, через writev).

Расследование привело к условию ниже:

src/os/unix/ngx_freebsd_sendfile_chain.c:399
src/os/unix/ngx_linux_sendfile_chain.c:360

if (!complete) {
   wev->ready = 0;
   return cl;
}

Если закомментировать этот блок/условие, то страницы отдаются полностью,
но появляется много записей в логах типа этой:

writev() not ready (11: Resource temporarily unavailable)

Какой смысл несет условие выше, и как можно решить эту проблему 
более прямым способом? Неужели нельзя вернуться и продолжить запись?

Насколькоя понял, writev гарантировано успевает передать заголовки,
затем пытается передать тело, но передает только сколько влезет в системный буфер,
затем происходит выход по if (!complete) ,  после чего повторных попыток 
продолжения записи не происходит.

И это на всех версиях nginx.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx-ru/attachments/20070706/90708779/attachment.html>


More information about the nginx-ru mailing list