ошибка в nginx ?

Igor Sysoev is at rambler-co.ru
Fri Jul 11 09:22:54 MSD 2008


On Fri, Jul 11, 2008 at 02:02:24AM +0300, Gena Makhomed wrote:

> On Tuesday, July 8, 2008 at 20:13:44, Igor Sysoev wrote:
> 
> >> вот в этом сообщении Andrei Nigmatulin говорит об ошибке в nginx:
> >> http://groups.google.com/group/highload-php-ru/msg/a5a2883173f56f5d
> 
> >> но в changelog`е не нашел никаких упоминаний на эту тему.
> >> эта ошибка в nginx сейчас так и осталась не исправленной?
> 
> IS> На данный момент, судя по
> IS> http://www.ruby-forum.com/topic/132314
> IS> я вижу только ошибку в ядре.
> 
> почему это именно ошибка в ядре? в POSIX стандарте на функцию connect
> http://www.opengroup.org/onlinepubs/000095399/functions/connect.html
> 
> не написано что делать в случае переполнения backlog`а.
> есть только вот такое описание возвращаемых кодов ошибок:
> 
> ========================================================================================
> 
> ERRORS
> 
>     The connect() function shall fail if:
> 
> [ECONNREFUSED]
> The target address was not listening for connections or refused the connection request. 
> 
> ========================================================================================
> 
> [ECONNREFUSED] - это "refused request", когда ситуация persistent fail
> на стороне сервера - "target address was not listening for connections",
> или что-то не так с клиентским запросом - "or refused the connection request"
> 
> а переполнение backlog - это ситуация temporary fail
> на стороне сервера, и поэтому возвращается [EAGAIN]?

ECONNREFUSED - это, в случае TCP, получение пакета RST на стадии connect.
Локальная сторона не знает, временно это или нет. Кстати, ситуация
"target address was not listening for connections" может быть временной:
сервер падает и через пару секунд его перезапускают.

> [EINPROGRESS] в этом случае отправлять не выходит,
> потому что тогда - "the connection request
> shall not be aborted, and the connection
> shall be established asynchronously".
> 
> IS> В чём причина EAGAIN
> 
> насколько удалось понять из исходников ядра Linux,
> http://lxr.linux.no/linux/net/unix/af_unix.c#L1070
> 
> Linux всегда (2.2.6 - 2.6.25.10) возвращает EAGAIN
> при неблокирующем коннекте и переполнении backlog.
> 
> IS> и что делать при его получении - непонятно.
> 
> http://www.issociate.de/board/post/456462/non-blocking_connect_and_EAGAIN.html
> 
> From: Vladimir Shebordaev
> 
> The comment in the net/unix/af_unix.c prologue states as to AF_UNIX
> connect(), for performance and (very) old BSD compatibility
> reasons the current behavior is intentional and not to be fixed
> until checked against POSIX requirements. I also think proper
> change would break some (very important) existing applications
> since the relevant code - the one that aborts non-blocking
> connection with EAGAIN - lives there since 2.2.6 at least.
> 
> [...]
> 
> дальше том в сообщении он детально рассматривает
> как работает код функции unix_stream_connect()

Так что делать-то при получении EAGAIN ? Единственное, что можно делать:
ждать секунду и повторять попытку до истечения ..._connect_timeout.
Пока в следующей версии EAGAIN будет сразу писаться в лог.


-- 
Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list