from_ptop.in 2.28 KB
Newer Older
1 2
#!/usr/bin/perl 
#
3
# Copyright (c) 2009 University of Utah and the Flux Group.
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
# 
# {{{EMULAB-LICENSE
# 
# This file is part of the Emulab network testbed software.
# 
# This file is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or (at
# your option) any later version.
# 
# This file is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public
# License for more details.
# 
# You should have received a copy of the GNU Affero General Public License
# along with this file.  If not, see <http://www.gnu.org/licenses/>.
# 
# }}}
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
#
use English;
use Getopt::Std;
use POSIX qw(strftime floor ceil);
use Data::Dumper;
use Carp;

use strict;
use warnings;

#
# Turn off line buffering on output
#
$| = 1; 

# Load the Testbed support stuff.
39
use lib "@prefix@/lib";
40 41 42
use libdb;
use libtestbed;

43
chdir "@prefix@/data/node_usage";
44 45 46 47 48 49 50 51 52 53 54

my $qr = DBQueryFatal("select t.idx,action,t.exptidx,eid,pid,UNIX_TIMESTAMP(start_time), UNIX_TIMESTAMP(end_time) from testbed_stats as t left join experiment_stats as e on t.exptidx = e.exptidx where (t.action='swapin' or t.action='start') and exitcode=0 and start_time >= '2005-09-03' order by t.idx");


while (my ($idx,$action,$exptidx,$eid,$pid,$start,$stop) = $qr->fetchrow()) {

    unless (defined $pid) {
	print "xxx $exptidx\n";
	next;
    }

55
    my $dir = "/usr/testbed/expinfo/$pid/$eid/$exptidx";
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89

    my @res;
    foreach my $fn (<$dir/*.ptop>) {
	next if $fn =~ /-empty.ptop$/;
	my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
	    $atime,$mtime,$ctime,$blksize,$blocks) = stat("$fn") or die;
	next unless $start <= $mtime && $mtime <= $stop;
	push @res, [$fn,$mtime];
    }
    
    next unless @res == 1;

    my %tally;

    my $fn = $res[0][0];
    my $mtime = $res[0][1];

    open F, $fn or die;
    while (<F>) {
	next unless /^node pc\d+/;
	if (/^node (pc\d+) (pc[\d\w]+):1/) {
	    $tally{$2}++;
	} else {
	    print STDERR "SKIPPING: $idx $fn $.: $_";
	}
    }

    print "$mtime $idx $fn ::";
    foreach my $k (sort keys %tally) {
	print " $k: $tally{$k}";
    }
    print "\n";
    
}