From: Dirk Koopman Date: Tue, 30 Jun 2020 12:33:33 +0000 (+0100) Subject: add RBN stats + other fixes X-Git-Url: http://scm.dxcluster.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=f4ce9b1afbcaeda10e0497b0d2b33fef0a4a5245;p=spider.git add RBN stats + other fixes Add some more comprehensive RBN stats (per minute, 10 minutes, hour). Make the RBN spot cache global and make the inrush preventor code work only on the first connection to skimmer provider. Fix the $_isdbg clearing so that non-conditional logging messages come out with a (*) in watchdbg and not the previous isdbg() sort. --- diff --git a/perl/DXDebug.pm b/perl/DXDebug.pm index 28ae8fe5..3b2e4b2c 100644 --- a/perl/DXDebug.pm +++ b/perl/DXDebug.pm @@ -130,6 +130,7 @@ sub dbg $fp->writeunix($t, $str) unless !$fp || $dbglevel{"nolog$_isdbg"} ; } } + $_isdbg = ''; } sub dbginit diff --git a/perl/RBN.pm b/perl/RBN.pm index 6773118f..cecbc4ba 100644 --- a/perl/RBN.pm +++ b/perl/RBN.pm @@ -39,6 +39,10 @@ our $dwelltime = 6; # the amount of time to wait for duplicates before issuin our $filterdef = $Spot::filterdef; # we use the same filter as the Spot system. Can't think why :-). +my $spots; # the GLOBAL spot cache + +my %runtime; # how long each channel has been running + sub new { my $self = DXChannel::alloc(@_); @@ -47,12 +51,20 @@ sub new my $pkg = shift; my $call = shift; -# DXProt::_add_thingy($main::routeroot, [$call, 0, 0, 1, undef, undef, $self->hostname], ); - $self->{spot} = {}; + $spots ||= {}; $self->{last} = 0; $self->{noraw} = 0; $self->{nospot} = 0; + $self->{nouser} = {}; $self->{norbn} = 0; + $self->{noraw10} = 0; + $self->{nospot10} = 0; + $self->{nouser10} = {}; + $self->{norbn10} = 0; + $self->{nospothour} = 0; + $self->{nouserhour} = {}; + $self->{norbnhour} = 0; + $self->{norawhour} = 0; $self->{sort} = 'N'; $self->{lasttime} = $main::systime; $self->{minspottime} = $minspottime; @@ -117,8 +129,8 @@ sub start $user->qra(DXBearing::lltoqra($lat, $long)) if (defined $lat && defined $long); } - # start inrush timer - $self->{inrushpreventor} = $main::systime + $startup_delay; + # if we have been running and stopped for a while + $self->{inrushpreventor} = exists $runtime{$call} && $runtime{$call} > $startup_delay ? 0 : $main::systime + $startup_delay; } my @queue; # the queue of spots ready to send @@ -128,7 +140,7 @@ sub normal my $self = shift; my $line = shift; my @ans; - my $spots = $self->{spot}; +# my $spots = $self->{spot}; # save this for them's that need it my $rawline = $line; @@ -162,6 +174,9 @@ sub normal $qra ||= ''; dbg qq{or:$origin qr:$qrg ca:$call mo:$mode s:$s m:$m sp:$spd u:$u sort:$sort t:$t tx:$tx qra:$qra} if isdbg('rbn'); + ++$self->{noraw}; + ++$self->{noraw10}; + ++$self->{norawhour}; my $b; @@ -217,8 +232,8 @@ sub normal # do we have it? my $spot = $spots->{$sp}; - $spot = $spots->{$spp}, $sp = $spp, dbg(qq{RBN: SPP using $spp for $sp}) if !$spot && exists $spots->{$spp}; - $spot = $spots->{$spm}, $sp = $spm, dbg(qq{RBN: SPM using $spm for $sp}) if !$spot && exists $spots->{$spm}; + $spot = $spots->{$spp}, $sp = $spp, dbg(qq{RBN: SPP using $spp for $sp}) if isdbg('rbn') && !$spot && exists $spots->{$spp}; + $spot = $spots->{$spm}, $sp = $spm, dbg(qq{RBN: SPM using $spm for $sp}) if isdbg('rbn') && !$spot && exists $spots->{$spm}; # if we have one and there is only one slot and that slot's time isn't expired for respot then return @@ -308,36 +323,54 @@ sub normal dbg sprintf("RBN: QUEUE key: '$sp' SEND time not yet reached %.1f secs left", $spot->[0] + $dwelltime - $now) if isdbg 'rbnqueue'; } } - - } else { dbg "RBN:DATA,$line" if isdbg('rbn'); } +} - # # periodic clearing out of the two caches - if (($tim % 60 == 0 && $tim > $self->{last}) || ($self->{last} && $tim >= $self->{last} + 60)) { - my $count = 0; - my $removed = 0; - while (my ($k,$v) = each %{$spots}) { - if ($tim - $v->[0] > $self->{minspottime}*2) { - delete $spots->{$k}; - ++$removed; - } - else { - ++$count; - } +sub per_minute +{ + foreach my $dxchan (DXChannel::get_all()) { + next unless $dxchan->is_rbn; + dbg "RBN:STATS minute $dxchan->{call} raw: $dxchan->{noraw} sent: $dxchan->{norbn} delivered: $dxchan->{nospot} users: " . scalar keys %{$dxchan->{nousers}} if isdbg('rbnstats'); + if ($dxchan->{noraw} == 0 && $dxchan->{lasttime} > 60) { + LogDbg('RBN', "RBN: no input from $dxchan->{call}, disconnecting"); + $dxchan->disconnect; } - dbg "RBN:ADMIN,$self->{call},spot cache remain: $count removed: $removed"; # if isdbg('rbn'); - dbg "RBN:" . join(',', "STAT", $self->{noraw}, $self->{norbn}, $self->{nospot}) if $self->{showstats}; - $self->{noraw} = $self->{norbn} = $self->{nospot} = 0; - $self->{last} = int($tim / 60) * 60; + $dxchan->{noraw} = $dxchan->{norbn} = $dxchan->{nospot} = 0; $dxchan->{nousers} = {}; + $runtime{$dxchan->{call}} += 60; } } +sub per_10_minute +{ + my $count = 0; + my $removed = 0; + while (my ($k,$v) = each %{$spots}) { + if ($main::systime - $v->[0] > $minspottime*2) { + delete $spots->{$k}; + ++$removed; + } + else { + ++$count; + } + } + dbg "RBN:STATS spot cache remain: $count removed: $removed"; # if isdbg('rbn'); + foreach my $dxchan (DXChannel::get_all()) { + next unless $dxchan->is_rbn; + dbg "RBN:STATS 10-minute $dxchan->{call} raw: $dxchan->{noraw10} sent: $dxchan->{norbn10} delivered: $dxchan->{nospot10} users: " . scalar keys %{$dxchan->{nousers10}}; + $dxchan->{noraw10} = $dxchan->{norbn10} = $dxchan->{nospot10} = 0; $dxchan->{nousers10} = {}; + } +} - -# } -# } +sub per_hour +{ + foreach my $dxchan (DXChannel::get_all()) { + next unless $dxchan->is_rbn; + dbg "RBN:STATS hour $dxchan->{call} raw: $dxchan->{norawhour} sent: $dxchan->{norbnhour} delivered: $dxchan->{nospothour} users: " . scalar keys %{$dxchan->{nousershour}}; + $dxchan->{norawhour} = $dxchan->{norbnhour} = $dxchan->{nospothour} = 0; $dxchan->{nousershour} = {}; + } +} # we should get the spot record minus the time, so just an array of record (arrays) sub send_dx_spot @@ -346,6 +379,10 @@ sub send_dx_spot my $quality = shift; my $spot = shift; + ++$self->{norbn}; + ++$self->{norbn10}; + ++$self->{norbnhour}; + # $r = [$origin, $qrg, $call, $mode, $s, $utz, $respot]; my $mode = $spot->[0]->[3]; # as all the modes will be the same; @@ -380,6 +417,8 @@ sub dx_spot my $dxchan = shift; my $quality = shift; my $spot = shift; + my $call = $dxchan->{call}; + my $strength = 100; # because it could if we talk about FTx my $saver; @@ -388,7 +427,11 @@ sub dx_spot my %qrg; my $respot; my $qra; - + + ++$self->{nousers}->{$call}; + ++$self->{nousers10}->{$call}; + ++$self->{nousershour}->{$call}; + foreach my $r (@$spot) { # $r = [$origin, $qrg, $call, $mode, $s, $t, $utz, $respot, $qra]; # Spot::prepare($qrg, $call, $utz, $comment, $origin); @@ -454,6 +497,10 @@ sub dx_spot $buf =~ s/^DX/RB/; $dxchan->local_send('N', $buf); + ++$self->{nospot}; + ++$self->{nospot10}; + ++$self->{nospothour}; + if ($qra) { my $user = DXUser::get_current($saver->[1]) || DXUser->new($saver->[1]); unless ($user->qra && is_qra($user->qra)) { diff --git a/perl/cluster.pl b/perl/cluster.pl index 8f41a1b8..bc64c5cb 100755 --- a/perl/cluster.pl +++ b/perl/cluster.pl @@ -776,20 +776,19 @@ sub per_10_sec } - sub per_minute { - + RBN::per_minute(); } sub per_10_minute { - + RBN::per_10_minute(); } sub per_hour { - + RBN::per_hour(); } sub per_day