From 44d90466304eae7d7aab0f375ac4c07a3f37b586 Mon Sep 17 00:00:00 2001 From: Dirk Koopman Date: Fri, 14 Aug 2020 14:33:19 +0100 Subject: [PATCH] fix missing fields in rbn_cache, add timings set/debug rbntimer will show how long a queue takes to process (remember that this includes sending data out to users). set/debug rbnskim shows the process of determining the "one true frequency" of a spot, by running a weighed "auction" of all the spotters's performance in previous "auctions". A spotter's frequency "score" can be between 5 and -5 (good -> bad) and that is added to each version of the frequency that is sent by the RBN. The frequency with the highest score is the one posted. It is the 'QRGScore' in the "progress" spot message. --- perl/DXUtil.pm | 12 +++++++++++- perl/RBN.pm | 20 +++++++++++++------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/perl/DXUtil.pm b/perl/DXUtil.pm index 24fa840f..7d9e63a9 100644 --- a/perl/DXUtil.pm +++ b/perl/DXUtil.pm @@ -27,7 +27,7 @@ require Exporter; print_all_fields cltounix unpad is_callsign is_latlong is_qra is_freq is_digits is_pctext is_pcflag insertitem deleteitem is_prefix dd is_ipaddr $pi $d2r $r2d localdata localdata_mv - diffms _diffms difft parraydifft is_ztime + diffms _diffms _diffus difft parraydifft is_ztime ); @@ -514,6 +514,16 @@ sub _diffms return $b - $a; } +# and in microseconds +sub _diffus +{ + my $ta = shift; + my $tb = shift || [gettimeofday]; + my $a = int($ta->[0] * 1000000) + int($ta->[1]); + my $b = int($tb->[0] * 1000000) + int($tb->[1]); + return $b - $a; +} + sub diffms { my $call = shift; diff --git a/perl/RBN.pm b/perl/RBN.pm index 8c591a7a..5898693e 100644 --- a/perl/RBN.pm +++ b/perl/RBN.pm @@ -99,7 +99,7 @@ our $minqual = 2; # the minimum quality we will accept for output my $json; my $noinrush = 0; # override the inrushpreventor if set -our $maxdeviants = 10; # the number of deviant QRGs to record for skimmer records +our $maxdeviants = 5; # the number of deviant QRGs to record for skimmer records sub init { @@ -537,13 +537,16 @@ sub process { foreach my $dxchan (DXChannel::get_all()) { next unless $dxchan->is_rbn; - + # At this point we run the queue to see if anything can be sent onwards to the punter my $now = $main::systime; - + my $ta = [gettimeofday]; + my $items; + # now run the waiting queue which just contains KEYS ($call|$qrg) foreach my $sp (keys %{$dxchan->{queue}}) { my $cand = $spots->{$sp}; + ++$items; unless ($cand && $cand->[CTime]) { dbg "RBN Cand $sp " . ($cand ? 'def' : 'undef') . " [CTime] " . ($cand->[CTime] ? 'def' : 'undef') . " dwell $dwelltime"; next; @@ -619,15 +622,14 @@ sub process --$skimmer->[DGood] if $skimmer->[DGood] > 0; push @deviant, sprintf("$r->[ROrigin]:%+.1f", $diff); push @{$skimmer->[DEviants]}, $diff; - shift @{$skimmer->[DEviants]} if @{$skimmer->[DEviants]} > $maxdeviants; + shift @{$skimmer->[DEviants]} while @{$skimmer->[DEviants]} > $maxdeviants; } else { ++$skimmer->[DGood] if $skimmer->[DGood] < $maxdeviants; --$skimmer->[DBad] if $skimmer->[DBad] > 0; shift @{$skimmer->[DEviants]}; } - $skimmer->[DScore] = ($skimmer->[DBad] != 0) ? $skimmer->[DGood] / $skimmer->[DBad] : $skimmer->[DGood]; + $skimmer->[DScore] = $skimmer->[DGood] - $skimmer->[DBad]; $skimmer->[DScore] ||= 0.2; # minimun score - $skimmer->[DScore] = $maxdeviants if $skimmer->[DScore] > $maxdeviants; dbg("RBN:SKIM key $sp slot $sk $r->[RQrg] - $qrg = $diff " . $json->encode($skimmer)) if isdbg('rbnskim'); $skimmer->[DLastin] = $now; $r->[RSpotData]->[SQrg] = $qrg if $qrg && $c > 1; # set all the QRGs to the agreed value @@ -672,8 +674,11 @@ sub process dbg sprintf("RBN: QUEUE key: '$sp' SEND time not yet reached %.1f secs left", $cand->[CTime] + $dwelltime - $now) if isdbg 'rbnqueue'; } } + if (isdbg('rbntimer')) { + my $diff = _diffus($ta); + dbg "RBN: TIMER process queue for call: $dxchan->{call} $items spots $diff uS"; + } } - } sub per_minute @@ -780,6 +785,7 @@ sub check_cache while (my ($k, $cand) = each %$spots) { next if $k eq 'VERSION'; next if $k =~ /^O\|/; + next if $k =~ /^SKIM\|/; if (@$cand > CData) { $spots->{$k} = [$cand->[CTime], $cand->[CQual]]; } -- 2.34.1