AC-Yenta
view release on metacpan or search on metacpan
lib/AC/Yenta/Status.pm view on Meta::CPAN
# remove map info
for my $map ( @{$DATA->{peermap}{$id}} ){
delete $DATA->{mappeer}{$map}{$id};
}
delete $DATA->{peermap}{$id};
# delete its monitored items
for my $p (keys %{$DATA->{allpeer}}){
next unless $DATA->{allpeer}{$p}{via} eq $id;
_remove($p);
}
}
sub _maybe_remove {
my $id = shift;
my $d = $DATA->{allpeer}{$id};
if( ($^T - $d->{lastup} > $KEEPDOWN) || ($^T - $d->{timestamp} > $KEEPLOST) ){
_remove($id);
}
}
sub isdown {
my $class = shift;
my $id = shift;
debug("marking peer '$id' as down");
if( ! $DATA->{allpeer}{$id} ){
return unless $DATA->{sceptical}{$id};
# we know it is down, and want to kibbitz this fact
$DATA->{allpeer}{$id} = $DATA->{sceptical}{$id};
}
delete $DATA->{sceptical}{$id};
if( $DATA->{allpeer}{$id} ){
$DATA->{allpeer}{$id}{timestamp} = $^T;
$DATA->{allpeer}{$id}{status} = 0;
$DATA->{allpeer}{$id}{path} = my_server_id();
}
_maybe_remove( $id );
}
################################################################
sub _env_ok {
my $class = shift;
my $id = shift;
my $up = shift;
# if( $up->{environment} ne conf_value('environment') ){
# verbose("ignoring update from $id - wrong env: $up->{environment}");
# return;
# }
return 1;
}
sub update_sceptical {
my $class = shift;
my $id = shift; # ->server_id
my $up = shift;
my $io = shift;
return unless $class->_env_ok($id, $up);
if( $DATA->{allpeer}{$id} ){
# already known
delete $DATA->{sceptical}{$id};
return;
}
debug("rcvd update (sceptical) about $id from $io->{peerip}");
# only accept updates from the server itself
# no 3rd party updates. no misconfigured serevrs.
problem("server misconfigured $id != $io->{peerip}")
unless grep { inet_atoi($io->{peerip}) == $_->{ipv4} } @{$up->{ip}};
$up->{id} = $id;
delete $up->{lastup};
$DATA->{sceptical}{$id} = $up;
}
sub update {
my $class = shift;
my $id = shift; # -> server_id
my $up = shift;
return unless $class->_env_ok($id, $up);
# only keep it if it is relatively fresh, and valid
return unless $up->{timestamp} > $^T - $KEEPLOST;
return unless $up->{status};
delete $DATA->{sceptical}{$id};
$up->{id} = $id;
my $previnfo = $DATA->{allpeer}{$id};
verbose("discovered new peer: $id ($up->{hostname})") unless $previnfo;
# only keep it if it is newer than what we have
return if $previnfo && $up->{timestamp} <= $previnfo->{timestamp};
$up->{path} .= ' ' . my_server_id();
# debug("updating $id => $up->{status} => " . dumper($up));
debug("updating $id => $up->{status}");
$DATA->{allpeer}{$id} = $up;
if( $up->{status} != 200 ){
_maybe_remove( $id );
return ;
}
# update datacenter info
unless( $DATA->{datacenter}{$up->{datacenter}}{$id} ){
my $pdc = $previnfo->{datacenter};
delete $DATA->{datacenter}{$pdc}{$id} if $pdc;
$DATA->{datacenter}{$up->{datacenter}}{$id} = $id;
}
# update subsystem info
unless( $DATA->{peertype}{$up->{subsystem}}{$id} ){
my $ss = $previnfo->{subsystem};
delete $DATA->{peertype}{$ss}{$id} if $ss;
$DATA->{peertype}{$up->{subsystem}}{$id} = $id;
}
# update map info
$DATA->{peermap}{$id} ||= [];
$up->{map} ||= [];
my @curmap = @{$DATA->{peermap}{$id}};
my @newmap = sort @{$up->{map}};
return if "@curmap" eq "@newmap"; # unchanged
# what do we need to add/remove
my (%remove, %add);
@remove{@curmap} = @curmap;
@add{@newmap} = @newmap;
delete $remove{$_} for @newmap;
delete $add{$_} for @curmap;
( run in 2.321 seconds using v1.01-cache-2.11-cpan-0bb4e1dffa6 )