AC-MrGamoo
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/AC/MrGamoo/Kibitz/Peers.pm view on Meta::CPAN
# -*- perl -*-
# Copyright (c) 2010 AdCopy
# Author: Jeff Weisberg
# Created: 2010-Jan-22 15:14 (EST)
# Function:
#
# $Id: Peers.pm,v 1.1 2010/11/01 18:41:59 jaw Exp $
package AC::MrGamoo::Kibitz::Peers;
use AC::MrGamoo::Debug 'kibitz_peers';
use AC::MrGamoo::About;
use AC::MrGamoo::MySelf;
use AC::MrGamoo::Config;
use AC::DC::Sched;
use AC::Misc;
use AC::Import;
use JSON;
use strict;
our @EXPORT = qw(pick_best_addr_for_peer peer_list_all get_peer_by_id);
my $KEEPDOWN = 300; # keep data about down servers for how long?
my $KEEPLOST = 600; # keep data about servers we have not heard about for how long?
my %SCEPTICAL;
my %ALLPEER;
my %MAYBEDOWN;
my $natdom;
my $natinit;
AC::DC::Sched->new(
info => 'kibitz status',
freq => (conf_value('time_status_kibitz') || 5),
func => \&periodic,
);
################################################################
sub periodic {
# clean up down or lost peers
for my $id ( keys %ALLPEER ){
my $p = $ALLPEER{$id};
next unless $p;
next if $p->{status} == 200 && $p->{timestamp} > $^T - $KEEPLOST;
_maybe_remove( $id );
}
_kibitz_with_random_peer();
}
################################################################
sub update_sceptical {
my $class = shift;
my $up = shift;
return unless _update_ok($up);
my $id = $up->{server_id};
return if $ALLPEER{$id};
debug("recvd update (sceptical) from $id");
$SCEPTICAL{$id} = $up;
}
sub update {
my $class = shift;
my $up = shift;
return unless _update_ok($up);
my $id = $up->{server_id};
my $previnfo = $ALLPEER{$id};
# only keep it if it is newer than what we have
return if $previnfo && $up->{timestamp} <= $previnfo->{timestamp};
# only keep it if it is relatively fresh
return unless $up->{timestamp} > $^T - $KEEPDOWN;
$up->{path} .= ' ' . my_server_id();
if( $previnfo ){
verbose("marking peer $id as up") if $up->{status} == 200 && $previnfo->{status} != 200;
}else{
verbose("discovered new peer: $id ($up->{hostname})");
}
$ALLPEER{$id} = $up;
delete $SCEPTICAL{$id};
if( $up->{status} != 200 ){
_maybe_remove( $id );
return ;
}
}
sub seems_ok {
my $class = shift;
my $id = shift;
delete $MAYBEDOWN{$id};
}
# require 2 failures before declaring it down
sub maybe_down {
my $class = shift;
my $id = shift;
my $why = shift;
if( $MAYBEDOWN{$id} ){
delete $MAYBEDOWN{$id};
$class->isdown($id, $why);
return;
}
return $class->isdown($id, $why) unless $ALLPEER{$id};
return $class->isdown($id, $why) unless $ALLPEER{$id}{status} == 200;
debug("peer '$id' might be down");
$MAYBEDOWN{$id} = $ALLPEER{$id};
}
sub isdown {
my $class = shift;
my $id = shift;
my $why = shift;
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.573 second using v1.00-cache-2.02-grep-82fe00e-cpan-2c419f77a38b )