From 3fa146962f64c2a12235ca9fc08b249b2bfc29ac Mon Sep 17 00:00:00 2001 From: Yorhel Date: Sun, 10 Jan 2016 08:44:52 +0100 Subject: Multi::Anime: Regularly resolve the AniDB API DNS The API IP address doesn't change often, but we don't want months of downtime when it does. --- lib/Multi/Anime.pm | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/lib/Multi/Anime.pm b/lib/Multi/Anime.pm index 89f74a9e..f189286e 100644 --- a/lib/Multi/Anime.pm +++ b/lib/Multi/Anime.pm @@ -43,12 +43,14 @@ my %O = ( timeoutdelay => 0.4, # $delay = $msgdelay ** (1 + $tm*$timeoutdelay) maxtimeoutdelay => 2*3600, check_delay => 3600, + resolve_delay => 3*3600, cachetime => '3 months', ); my %C = ( sock => undef, + io => undef, tw => undef,# timer guard s => '', # session key, '' = not logged in tm => 0, # number of repeated timeouts @@ -74,21 +76,8 @@ sub run { %O = (%O, @_); die "No AniDB user/pass configured!" if !$O{user} || !$O{pass}; - AnyEvent::Socket::resolve_sockaddr $O{apihost}, $O{apiport}, 'udp', 0, undef, sub { - my($fam, $type, $proto, $saddr) = @{$_[0]}; - socket $C{sock}, $fam, $type, $proto or die "Can't create UDP socket: $!"; - connect $C{sock}, $saddr or die "Can't connect() UDP socket: $!"; - fh_nonblocking $C{sock}, 1; - - my($p, $h) = AnyEvent::Socket::unpack_sockaddr($saddr); - AE::log info => sprintf "AniDB API client started, communicating with %s:%d", format_address($h), $p; - - push_watcher pg->listen(anime => on_notify => \&check_anime); - push_watcher schedule 0, $O{check_delay}, \&check_anime; - push_watcher AE::io $C{sock}, 0, \&receivemsg; - - check_anime(); - }; + push_watcher schedule 0, $O{resolve_delay}, \&resolve; + resolve(); } @@ -97,6 +86,28 @@ sub unload { } +sub resolve { + AnyEvent::Socket::resolve_sockaddr $O{apihost}, $O{apiport}, 'udp', 0, undef, sub { + my($fam, $type, $proto, $saddr) = @{$_[0]}; + my $sock; + socket $sock, $fam, $type, $proto or die "Can't create UDP socket: $!"; + connect $sock, $saddr or die "Can't connect() UDP socket: $!"; + fh_nonblocking $sock, 1; + + if(!$C{sock}) { + my($p, $h) = AnyEvent::Socket::unpack_sockaddr($saddr); + AE::log info => sprintf "AniDB API client started, communicating with %s:%d", format_address($h), $p if !$C{sock}; + push_watcher pg->listen(anime => on_notify => \&check_anime); + push_watcher schedule 0, $O{check_delay}, \&check_anime; + check_anime(); + } + + $C{sock} = $sock; + $C{io} = AE::io $C{sock}, 0, \&receivemsg; + }; +} + + sub check_anime { return if $C{aid} || $C{tw}; pg_cmd 'SELECT id FROM anime WHERE lastfetch IS NULL OR lastfetch < NOW() - $1::interval ORDER BY lastfetch DESC NULLS FIRST LIMIT 1', [ $O{cachetime} ], sub { -- cgit v1.2.3