ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: openssl-1.0.0d & proxy_buffering



Hello!

On Tue, Sep 06, 2011 at 10:46:25AM +0400, Andrey N. Oktyabrski wrote:

> On 06.09.11 09:52, Maxim Dounin wrote:
> >>Великое закрытие выглядит так:
> >>08:04:15.534696 IP localhost.8273>  localhost.1079: Flags [FP.], seq
> >>185:378, ack 428, win 1792, options [nop,nop,TS val 3480164 ecr
> >>3480164], length 193
> >>08:04:15.534703 IP localhost.1079>  localhost.8273: Flags [.], ack
> >>379, win 1785, options [nop,nop,TS val 3480164 ecr 3480164], length
> >>0
> >>
> >>То есть, после того как mochiweb отправил [FP.] и получил в ответ
> >>ack, он считает соединение закрытым.
> >
> >Это штатное закрытие, обратный fin будет после того, как nginx
> >закроет соединение со своей стороны.  Надо смотреть подробнее,
> >похоже проблемы с kqueue на dragonfly.
> >
> >Для начала - собраться с --with-select_module --with-poll_module,
> >и убедиться, то при использовании других event method'ов проблема
> >исчезает.
> Похоже, оно. И с poll, и с select работает прекрасно.
> Что можно посмотреть подробнее? B sysctl практически ничего нет:
> $ sysctl -a | grep -i kq
> kern.kq_checkloop: 1000000
> kern.kq_calloutmax: 4096
> lwkt.kq_collisions: 40106
> 
> Единственное, я не знаю, постоянный рост lwkt.kq_collisions - это
> нормально, или нет?
> $ for i in `jot 11`; do sysctl lwkt.kq_collisions; sleep 1; done
> lwkt.kq_collisions: 41277
> lwkt.kq_collisions: 41279
> lwkt.kq_collisions: 41280
> lwkt.kq_collisions: 41283
> lwkt.kq_collisions: 41284
> lwkt.kq_collisions: 41285
> lwkt.kq_collisions: 41286
> lwkt.kq_collisions: 41287
> lwkt.kq_collisions: 41289
> lwkt.kq_collisions: 41290
> lwkt.kq_collisions: 41291

Я в DragonFly BSD понимаю чуть менее, чем ничего, так что по 
данному вопросу мало что могу прокоментировать.

Сама проблема выражается в том, что не ставится EV_EOF.  Тестовая 
программка прилагается.  Она создаёт socketpair(), после чего 
пишет в один из сокетов, и заводит kqueue смотреть за вторым.

Ожидаемое поведение: первый вызов kevent() возвращает EV_EOF, т.к. 
сокет с той стороны уже закрыт, тест завершается.  Именно такое 
поведение наблюдается на FreeBSD и NetBSD.

На DragonFly BSD EV_EOF не ставится, вызывается второй kevent() и 
ожидаемо виснет (потому как новых событий не происходит, а 
используется EV_CLEAR).

Feel free to report this to DragonFly BSD folks.

Maxim Dounin
#include <sys/types.h>
#include <sys/event.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <sysexits.h>

#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int
main()
{
    int sock[2];
    struct kevent kc;
    int kq;
    char foo[1024];

    if (socketpair(PF_LOCAL, SOCK_STREAM, 0, sock) < 0)
        err(EX_TEMPFAIL, "socketpair");

    if (write(sock[0], foo, sizeof(foo)) < 0)
        err(EX_TEMPFAIL, "write");

    close(sock[0]);

    EV_SET(&kc, sock[1], EVFILT_READ, EV_ADD | EV_CLEAR, 0, 0, 0);

    kq = kqueue();
    if (kevent(kq, &kc, 1, NULL, 0, NULL) < 0)
        err(EX_TEMPFAIL, "kqueue");

    if (kevent(kq, NULL, 0, &kc, 1, NULL) < 0)
        err(EX_TEMPFAIL, "kevent1");
    printf("kevent1 done, flags: %04x\n", kc.flags);

    if (kc.flags & EV_EOF) {
        printf("kevent1 reported EOF, exiting\n");
        exit(0);
    }

    if (kevent(kq, NULL, 0, &kc, 1, NULL) < 0)
        err(EX_TEMPFAIL, "kevent2");
    printf("kevent2 done, flags: %04x\n", kc.flags);

    exit(0);
}
_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.