Re: Когда может возникнуть ситуация, что rev->instance != instance?

Maxim Dounin mdounin at mdounin.ru
Fri Sep 27 15:51:40 UTC 2013


Hello!

On Fri, Sep 27, 2013 at 11:32:20AM -0400, megalodon wrote:

> Но после закрытия дескриптора, ядро автоматически удалит этот дескриптор из
> своих структур и не будет по нему отслеживать события. 
> 
> Ход событий в общем: воркер блокируется на epoll_wait(), по истечении
> тайм-аута либо по получении nevent событий, воркер просыпается и в цикле
> перебирает эти события. Допустим, встретилось событие на чтение и recv()
> вернуло 0, мы закрываем соединение, при этом дескриптор удаляется из
> структур подсистемы epoll, также в массив cycle->free_connections
> возвращается структура ngx_connection_t. 
> 
> Я не понимаю такой момент: почему ядро потом может вернуть событие для уже
> закрытого сокета?

Ядро возвращает более одного события за раз.  А соединение может 
быть закрыто не только при обработке событий от этого соединения, 
но и при обработке событий от другого соединения.

Простейший пример: от бекенда пришёл ответ, мы его прочитали, 
отправили клиенту, закрыли оба соединения - и с бекендом, и с 
клиентом.

-- 
Maxim Dounin
http://nginx.org/en/donation.html



Подробная информация о списке рассылки nginx-ru