summaryrefslogtreecommitdiff
path: root/lib/Multi
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2016-01-10 08:44:52 +0100
committerYorhel <git@yorhel.nl>2016-01-10 08:44:52 +0100
commit3fa146962f64c2a12235ca9fc08b249b2bfc29ac (patch)
tree670fa10a881ef8d9d4166668d69c74fb1062b190 /lib/Multi
parentb0d18a88fd8dc092808e2f9b5970496a48b0bcff (diff)
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.
Diffstat (limited to 'lib/Multi')
-rw-r--r--lib/Multi/Anime.pm41
1 files 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 {