[Moscow.pm] AnyEven::HTTP перед и после fork с сокетами между процессами

Mons Anderson mons на cpan.org
Ср Окт 16 07:17:07 PDT 2013


Подтверждаю, проблема с форками в AnyEvent::DNS.
Сокет там UDP'шный.

у нас решается так:

use AnyEvent::DNS ();
        
BEGIN {
    no warnings 'redefine';
    my $RESOLVER;
    my $FORPID = 0;
    my $res = \&AnyEvent::DNS::resolver;
    *AnyEvent::DNS::resolver = sub () {
        undef $RESOLVER if $FORPID != $$;
        $RESOLVER || do {
            #warn "Create overriden resolver for $$. previous was for $FORPID";
            undef $AnyEvent::DNS::RESOLVER;
            local $AnyEvent::DNS::RESOLVER;
            $FORPID = $$;
            $RESOLVER = AnyEvent::DNS->$res();
        };
    };
    # для дебага:
    my $new = \&AnyEvent::DNS::new;
    *AnyEvent::DNS::new = sub {
        Carp::cluck( "$$: Creating DNS resolver" );
        goto &$new;
    };
}



On 16.10.2013, at 17:41, Гришаев Анатолий <0body0 на rambler.ru> wrote:

> 
> Я в AnyEvent::DNS глубоко не влазил, а твой случай у меня не подтверждается.
> Может только PERL_ANYEVENT_MODEL=EV чуть медленнее отрабатывает чем PERL_ANYEVENT_MODEL=Perl, да и то в пределах полсекунды.
> А на всякий случай высылаю версии модулей с которыми у меня работает, может поможет :)
> 
> 
> Самое близкая к тебе конфигурация, которая работает у меня вот
> FreeBSD 7.2-RELEASE-p4
> Perl v5.10.1
> EV 4.11
> AnyEvent 7.04
> AnyEvent::HTTP 2.15
> 
> А вот линукс
> Linux  3.2.0-45-generic #70-Ubuntu SMP Wed May 29 20:11:31 UTC 2013 i686 i686 i386 GNU/Linux
> Perl v5.14.2
> EV 4.03
> AnyEvent 6.12
> AnyEvent::HTTP 2.13
> 
> Есть еще FreeBSD 8, но там
> EV 4.15
> AnyEvent 6.12
> AnyEvent::HTTP 2.13
> Perl v5.16.3
> 
> 
> 16.10.2013 16:12, ksvs пишет:
>> 
>> FreeBSD 9.2-RELEASE
>> Perl v5.14.4
>> EV 4.15
>> AnyEvent 7.04
>> AnyEvent::HTTP 2.15
>> 
>> 
>> Мое одно письмо на модерацию попало.
>> Вот оно.
>> 
>> Да, работает (если исключить RESOLVER).
>> А ведь была сначала мысль, что с dns у него проблема, но поститал, что раз
>> сказал persistent => 0, то  AnyEvent::HTTP должен дальше и сказать тоже не
>> сохранять открытые сокеты. :-)
>> 
>> А почему в netstat не видно открытого сокета?
>> 
>> Но как поремонтироваь это - не знаю.
>> Перед fork делаю
>> 
>> 
>> {
>>     ...
>> 
>>     my $rs = $AnyEvent::DNS::RESOLVER;
>>     $$rs{rw4} = $$rs{rw6} = undef;
>>     undef $AnyEvent::DNS::RESOLVER;
>> 
>> }
>> 
>> Отрегистрируем обработчики и уничтожаем resolver: сокеты закроются, так как my на них.
>> Не помогает.
>> 
>> 
>> On Wednesday, 16 October 2013, 14:47, Гришаев Анатолий <0body0 на rambler.ru> wrote:
>> 
>> Либо тебе не повезло,
>> либо у тебя забавные библиотеки:
>> 
>> Проверил на FreeBSD +  Linux
>> с  perl 5.10, 5.14, 5.16
>> с EV и без него.
>> 
>> Со строчкой работает,
>> без строчки нет.
>> 
> 
> 
> -- 
> С уважением Анатолий.
> -- 
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org



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