fix missing fields in rbn_cache, add timings
authorDirk Koopman <djk@tobit.co.uk>
Fri, 14 Aug 2020 13:33:19 +0000 (14:33 +0100)
committerDirk Koopman <djk@tobit.co.uk>
Fri, 14 Aug 2020 13:33:19 +0000 (14:33 +0100)
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
perl/RBN.pm

index 24fa840ff12962d50273bf7fbf3f99c3fc99cdd8..7d9e63a97b89dde5c9e7cf4e90d36eda0a1cd169 100644 (file)
@@ -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;
index 8c591a7aed4042c2823730c2c4de488a398ce28e..5898693e2b30ecc0cd05162ca490e82b39320e86 100644 (file)
@@ -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]];
                                                        }