Opened 9 years ago

Closed 9 years ago

Last modified 9 years ago

#139 closed defect (invalid)

pread() read only

Reported by: Disarmer Mk Owned by: somebody
Priority: minor Milestone:
Component: nginx-core Version: 1.0.x
Keywords: pread, static html Cc:
uname -a: Linux desktop 3.2.13-1-ARCH #1 SMP PREEMPT Sat Mar 24 09:10:39 CET 2012 x86_64 AMD Athlon(tm) II X4 630 Processor AuthenticAMD GNU/Linux
nginx -V: nginx version: nginx/1.0.14
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx.lock --http-client-body-temp-path=/var/spool/nginx/client_body_temp --http-proxy-temp-path=/var/spool/nginx/proxy_temp --http-fastcgi-temp-path=/var/spool/nginx/fastcgi_temp --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --user=http --group=http --with-imap --with-imap_ssl_module --with-http_ssl_module --with-http_stub_status_module --with-http_dav_module --with-http_gzip_static_module --with-ipv6 --add-module=/usr/lib/passenger/ext/nginx --http-scgi-temp-path=/var/spool/nginx --http-uwsgi-temp-path=/var/spool/nginx

Description

после изменения статической html страницы при запросе её в браузере появляется надпись "Соединение закрыто удалённым сервером"

кеширование для html страниц включено, фрагмент конфига:
open_file_cache max=1000 inactive=300s;
open_file_cache_valid 360s;
open_file_cache_min_uses 2;
open_file_cache_errors off;
expires 30d;
add_header Vary "Accept-Encoding";

очевидно это происходит из за кеширования. Баг ли это?

в error.log появляется несколько сообщений вида:
2012/03/30 18:00:41 [alert] 785#0: *1076 pread() read only 5891 of 5904 from "/var/www/work/cash/out/index.html" while sending response to client, client: 127.0.0.1, server: , request: "GET /work/cash/out/index%2Ehtml HTTP/1.1", host: "127.0.0.1"

в access.log:
127.0.0.1 - - [30/Mar/2012:18:20:54 +0400] "GET /work/cash/out/index%2Ehtml HTTP/1.1" 200 0 "-" "Opera/9.80 (X11; Linux x86_64; U; ru) Presto/2.10.229 Version/11.62"
127.0.0.1 - - [30/Mar/2012:18:20:54 +0400] "GET /work/cash/out/index%2Ehtml HTTP/1.1" 200 0 "-" "Opera/9.80 (X11; Linux x86_64; U; ru) Presto/2.10.229 Version/11.62"
127.0.0.1 - - [30/Mar/2012:18:20:54 +0400] "GET /work/cash/out/index%2Ehtml HTTP/1.1" 200 0 "-" "Opera/9.80 (X11; Linux x86_64; U; ru) Presto/2.10.229 Version/11.62"
127.0.0.1 - - [30/Mar/2012:18:20:54 +0400] "GET /work/cash/out/index%2Ehtml HTTP/1.1" 200 0 "-" "Opera/9.80 (X11; Linux x86_64; U; ru) Presto/2.10.229 Version/11.62"
127.0.0.1 - - [30/Mar/2012:18:20:54 +0400] "GET /work/cash/out/index%2Ehtml HTTP/1.1" 200 0 "-" "Opera/9.80 (X11; Linux x86_64; U; ru) Presto/2.10.229 Version/11.62"

когда пытаюсь получить этот документ через wget прогрессбар мгновенно доходит приблизительно до 85% и останавливается
[disarmer@desktop ~]$ wget -S http://127.0.0.1/work/cash/out/index%2Ehtml
--2012-03-30 18:26:31-- http://127.0.0.1/work/cash/out/index%2Ehtml
Подключение к 127.0.0.1:80... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа...

HTTP/1.1 200 OK
Server: nginx/1.0.14
Date: Fri, 30 Mar 2012 14:26:32 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 5251
Last-Modified: Fri, 30 Mar 2012 14:19:17 GMT
Connection: keep-alive
Expires: Sun, 29 Apr 2012 14:26:32 GMT
Cache-Control: max-age=2592000
Vary: Accept-Encoding
Accept-Ranges: bytes

Длина: 5251 (5,1K) [text/html]
Сохранение в каталог: ««index.html»».

длина в заголовке 5251 байт а реальный размер документа 4540 байт.
видимо такой длины документ был до изменения.
Если документ увеличивается то он отдается со старым значением длины и получается обрезанныи,

Change History (2)

comment:1 by Maxim Dounin, 9 years ago

Resolution: invalid
Status: newclosed

Это не баг. Файлы нужно обновлять атомарно (создавать новый файл, и потом переименовывать в нужное имя), в противном случае существует race: при открытии файла он имеет один размер/содержимое (и именно этот размер отдаётся в заголовках), а в процессе отправки размер и содержимое меняются. Использование open_file_cache позволяет закешировать результаты открытия файла надолго, таким образом существенно облегчая наблюдение последствий неатормарного обновления файлов.

comment:2 by Disarmer Mk, 9 years ago

ясно, большое спасибо

Note: See TracTickets for help on using tickets.