11 open my $fh, "-|", "varnishncsa -F '%{%s}t %U %q tffb=%{Varnish:time_firstbyte}x' -q 'ReqURL ~ \"^/analysis.pl\"'"
12 or die "varnishncsa: $!";
15 my $ev = AnyEvent::Handle->new(
21 my ($hdl, $line, $eof) = @_;
27 my $ev2 = AnyEvent->timer(
35 $line =~ m#(\d+) /analysis.pl \?ims=\d+&unique=(.*) tffb=(.*)# or return;
41 print "[$now] $1 $2 $3\n";
45 my $mtime = (stat($remoteglotconf::json_output))[9] - 1; # Compensate for subsecond issues.
48 while (my ($unique, $hash) = each %uniques) {
49 my $last_seen = $hash->{'last_seen'};
50 if ($now - $last_seen <= 5) {
51 # We've seen this user in the last five seconds;
55 if ($last_seen >= $mtime) {
56 # This user has the latest version;
57 # they are probably just hanging.
60 if (!defined($hash->{'grace'})) {
61 # They have five seconds after a new JSON has been
62 # provided to get get it, or they're out.
63 # We don't simply use $mtime, since we don't want to
64 # reset the grace timer just because a new JSON is
66 $hash->{'grace'} = $mtime;
68 if ($now - $hash->{'grace'} > 5) {
69 printf "Timing out %s (last_seen=%d, now=%d, mtime=%d, grace=%d)\n",
70 $unique, $last_seen, $now, $mtime, $hash->{'grace'};
71 delete $uniques{$unique};
75 my $num_viewers = scalar keys %uniques;
76 printf "%d entries in hash, mtime=$mtime\n", scalar keys %uniques;
77 LWP::Simple::get('http://127.0.0.1:5000/override-num-viewers?num=' . $num_viewers);