Ну тут я уже не знаю какой выбрать :-). Со спаньём в 0 секунд вроде
выглядит неплохо довольно, к тому же отвечает старому поведению по
ограничению скорости.
Ведь если там было маленькое значение sent и большое значение
limit_rate то я так понимаю как раз получался 0 msec для таймера.
On 4/13/06, Igor Sysoev <is@xxxxxxxxxxxxx> wrote:
> On Thu, 13 Apr 2006, ForJest wrote:
>
> > Игорь, посмотрите, почему зависает, если указать 2000 вместо 1000 при
> > 3000 limit rate. Я полагаю что это поможет устранить баг с зависанием
> > некоторых сессий наших клиентов.
>
> Потому что послано меньше, чем нужно: c->sent <= to_send
>
> Есть два варианта решения:
>
> 1) первый всё-таки добавлять нулевой таймер и тогда это соединение
> будет обработано при следующем kevent()/epoll/etc
>
> 2) или послать ещё, не отходя от кассы:
>
> ------------
> for ( ;; ) {
>
> chain = c->send_chain(c, r->out, r->limit_rate);
>
> ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
> "http write filter %p", chain);
>
> if (chain == NGX_CHAIN_ERROR) {
> c->error = 1;
> return NGX_ERROR;
> }
>
> for (cl = r->out; cl && cl != chain; /* void */) {
> ln = cl;
> cl = cl->next;
> ngx_free_chain(r->pool, ln);
> }
>
> r->out = chain;
>
> if (r->limit_rate) {
> to_send = r->limit_rate * (ngx_time() - r->start_time);
>
> if (c->sent <= to_send) {
> continue;
> }
>
> c->write->delayed = 1;
> ngx_add_timer(r->connection->write,
> (ngx_msec_t) ((c->sent - to_send) * 1000 /
> r->limit_rate));
> }
>
> break;
> }
> ------------
>
> Я пока думаю, какой вариант выбрать.
>
>
> Игорь Сысоев
> http://sysoev.ru
>
>