Open MPI logo

MTT Devel Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all MTT Devel mailing list

Subject: Re: [MTT devel] [MTT svn] svn:mtt-svn r1216
From: Ethan Mallove (ethan.mallove_at_[hidden])
Date: 2008-07-23 12:21:28


Nice!

Which device(s) does DiskFree.pm check for space on? I
occasionally run out of room in /tmp, so I would want it to
check my swap space.

Can we remove these? (All but the .pm and README files.)

 trunk/lib/Filesys/Changes
 trunk/lib/Filesys/MANIFEST
 trunk/lib/Filesys/Makefile.PL
 trunk/lib/Filesys/eg/
 trunk/lib/Filesys/eg/perldf
 trunk/lib/Filesys/eg/silly
 trunk/lib/Filesys/test.pl

-Ethan

On Tue, Jul/22/2008 09:27:04PM, jsquyres_at_[hidden] wrote:
> Author: jsquyres
> Date: 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> New Revision: 1216
> URL: https://svn.open-mpi.org/trac/mtt/changeset/1216
>
> Log:
> Fixes #370: have MTT exit if there isn't enough disk space left.
>
> Added:
> trunk/lib/Filesys/
> trunk/lib/Filesys/Changes
> trunk/lib/Filesys/DiskFree.pm
> trunk/lib/Filesys/MANIFEST
> trunk/lib/Filesys/Makefile.PL
> trunk/lib/Filesys/README
> trunk/lib/Filesys/README.mtt
> trunk/lib/Filesys/eg/
> trunk/lib/Filesys/eg/perldf (contents, props changed)
> trunk/lib/Filesys/eg/silly (contents, props changed)
> trunk/lib/Filesys/test.pl
> Text files modified:
> trunk/client/mtt | 11 ++++----
> trunk/lib/MTT/Globals.pm | 5 +++
> trunk/lib/MTT/MPI/Get.pm | 2
> trunk/lib/MTT/MPI/Install.pm | 4 +-
> trunk/lib/MTT/Test/Build.pm | 4 +-
> trunk/lib/MTT/Test/Get.pm | 2
> trunk/lib/MTT/Test/Run.pm | 4 +-
> trunk/lib/MTT/Test/RunEngine.pm | 6 ++--
> trunk/lib/MTT/Util.pm | 50 ++++++++++++++++++++++++++++++++++++++-
> trunk/samples/ompi-core-template.ini | 17 +++++++++++++
> 10 files changed, 86 insertions(+), 19 deletions(-)
>
> Modified: trunk/client/mtt
> ==============================================================================
> --- trunk/client/mtt (original)
> +++ trunk/client/mtt 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -112,6 +112,7 @@
> use MTT::Values;
> use MTT::Timer;
> use MTT::Util;
> +use Filesys::DiskFree;
>
> my @file_arg;
> my $stdin_arg;
> @@ -492,31 +493,31 @@
> MTT::Reporter::Init($ini);
> }
>
> - if ($mpi_get && !MTT::Util::find_terminate_file()) {
> + if ($mpi_get && !MTT::Util::time_to_terminate()) {
> &MTT::Timer::start($time_phases);
> MTT::MPI::Get::Get($ini, $source_dir, $force_arg);
> &MTT::Timer::stop();
> &MTT::Timer::print("Phase: MPI Get", $time_phases, 1);
> }
> - if ($mpi_install && !MTT::Util::find_terminate_file()) {
> + if ($mpi_install && !MTT::Util::time_to_terminate()) {
> &MTT::Timer::start($time_phases);
> MTT::MPI::Install::Install($ini, $ini_full, $install_dir, $force_arg);
> &MTT::Timer::stop();
> &MTT::Timer::print("Phase: MPI Install", $time_phases, 1);
> }
> - if ($test_get && !MTT::Util::find_terminate_file()) {
> + if ($test_get && !MTT::Util::time_to_terminate()) {
> &MTT::Timer::start($time_phases);
> MTT::Test::Get::Get($ini, $source_dir, $force_arg);
> &MTT::Timer::stop();
> &MTT::Timer::print("Phase: Test Get", $time_phases, 1);
> }
> - if ($test_build && !MTT::Util::find_terminate_file()) {
> + if ($test_build && !MTT::Util::time_to_terminate()) {
> &MTT::Timer::start($time_phases);
> MTT::Test::Build::Build($ini, $ini_full, $install_dir, $force_arg);
> &MTT::Timer::stop();
> &MTT::Timer::print("Phase: Test Build", $time_phases, 1);
> }
> - if ($test_run && !MTT::Util::find_terminate_file()) {
> + if ($test_run && !MTT::Util::time_to_terminate()) {
> &MTT::Timer::start($time_phases);
> MTT::Test::Run::Run($ini, $ini_full, $install_dir, $runs_data_dir,
> $force_arg);
>
> Added: trunk/lib/Filesys/Changes
> ==============================================================================
> --- (empty file)
> +++ trunk/lib/Filesys/Changes 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -0,0 +1,27 @@
> +Revision history for Perl extension Filesys::DiskFree.
> +
> +0.06 Fri Oct 23 18:26:19 EDT 1998
> + - Now supports HP-UX, thanks to Richard Paul for the patch.
> +
> +0.05 Wed Aug 26 23:54:15 EDT 1998
> + - Now supports OSF/1, thanks to Eric Foster-Johnson for the details.
> +
> +0.04 Sat Aug 1 12:15:42 EDT 1998
> + - Fixes problem if passed a barefilename, without any '/'.
> + - Bug fix in 'silly' example, accidentally deleted a ;
> + - perldf now works on filesystems with 0% free (eg psuedo-fs), and
> + formats filesystems with <10% free without decimals. Also changed
> + to round to nearest percentage, instead of rounding down.
> + - thanks to Lupe Christoph for spotting these problems.
> +
> +0.03 Fri Jul 24 16:28:54 EDT 1998
> + - Added Irix format, thanks Danial F. Sully for the patch.
> + - Changed Solaris to work across more versions of Solaris,
> + thanks to Lupe Christoph for the details.
> +
> +0.02 Thu Jul 23 15:13:20 1998
> + - Fixed a mistake in the documentation
> +
> +0.01 Tue Jul 14 10:32:48 1998
> + - original version; created by h2xs 1.18
> +
>
> Added: trunk/lib/Filesys/DiskFree.pm
> ==============================================================================
> --- (empty file)
> +++ trunk/lib/Filesys/DiskFree.pm 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -0,0 +1,351 @@
> +#
> +#
> +#
> +# Copyright (c) 1998 Alan R. Barclay. All rights reserved. This program
> +# is free software; you can redistribute it and/or modify it under
> +# the same terms as Perl itself.
> +
> +package Filesys::DiskFree;
> +
> +use Carp;
> +use strict;
> +
> +#qw();
> +
> +use vars qw($VERSION $Format %Df);
> +
> +$VERSION = 0.06;
> +
> +#
> +# The format table
> +#
> +# Note, the format names are not gauranteed. If I find that there
> +# is a reason to rename one, then they be renamed.
> +#
> +
> +%Df = (
> + 'linux' => {
> + 'blocks' => "df -P",
> + 'inodes' => "df -Pi",
> + 'format' => "linuxish",
> + },
> + 'solaris' => {
> + 'blocks' => "df -k",
> + 'inodes' => "df -k -o i -F ufs",
> + 'format' => "svish",
> + },
> + 'bsdos' => {
> + 'blocks' => "df -i",
> + 'inodes' => "df -i",
> + 'format' => 'bsdish',
> + },
> +
> + 'irix' => {
> + 'blocks' => "df",
> + 'inodes' => "df -i",
> + 'format' => "irixish",
> + },
> + 'hpux' => {
> + 'blocks' => "bdf -l -i",
> + 'inodes' => "bdf -l -i",
> + 'format' => 'hpuxish',
> + },
> + 'dec_osf' => {
> + 'blocks' => "df",
> + 'inodes' => "df -i",
> + 'format' => 'svish',
> + },
> +);
> +
> +use strict;
> +
> +BEGIN {
> + $Format = $^O;
> +}
> +
> +sub new {
> + my $proto = shift;
> + my $class = ref($proto) || $proto;
> + my $self = {
> + FORMAT => $Format,
> + DEVICES => undef,
> + MOUNTS => undef,
> + MODE => 'blocks'
> + };
> +
> + bless ($self, $class);
> + return $self;
> +}
> +
> +sub set(){
> + my $self=shift;
> + my @return;
> +
> + return undef if(defined $self->{'DEVICES'});
> +
> + if(@_){
> + if($_[0] =~ m/format/i){
> + push(@return,$self->{'FORMAT'});
> + $self->{'FORMAT'}=$_[1] if(defined $_[1]);
> + }
> +
> + if($_[0] =~ m/mode/i){
> + push(@return,$self->{'MODE'});
> + $self->{'MODE'}='blocks' if($_[1] =~ m/block/i and defined $_[1]);
> + $self->{'MODE'}='inodes' if($_[1] =~ m/inode/i and defined $_[1]);
> + }
> + }
> + return @return;
> +}
> +
> +sub command () {
> + my $self=shift;
> + return $Df{"\L".$self->{'FORMAT'}."\E"}{$self->{'MODE'}};
> +}
> +sub df(){
> + my $self=shift;
> + my $cmd="df";
> +
> + $cmd=$self->command() or
> + croak "No df command known for format ".$self->{'FORMAT'};
> + open(HANDLE,"$cmd|") or croak("Cannot fork $!");
> + return $self->load(\*HANDLE);
> + close(HANDLE) or croak("Cannot df $!");
> +}
> +
> +sub load() {
> + my $self=shift;
> + my $handle=shift;
> +
> + if(ref $handle eq "GLOB"){
> + while(<$handle>){
> + $self->readline($_);
> + }
> + } else {
> + map { $self->readline($_) } split(/$\//,$handle);
> + }
> + return 'true';
> +}
> +
> +sub readline() {
> + my $self=shift;
> + my $line=shift;
> + my ($device,$btotal,$bused,$bavail,$iused,$iavail,$mount,
> + $total,$used,$avail);
> +
> + chomp($line);
> +
> + $_=$Df{"\L".$self->{'FORMAT'}."\E"}{'format'};
> +
> + if(/linuxish/i){
> + return undef if($line =~ /^Filesystem.*Mounted on/i);
> + ($device,$total,$used,$avail,undef,$mount)=split(' ',$line);
> + if($self->{'MODE'} eq 'blocks'){
> + $total *= 1024;
> + $used *= 1024;
> + $avail *= 1024;
> + }
> + } elsif(/svish/i){
> + return undef if($line =~ /^Filesystem.*Mounted on/i);
> + if($self->{'MODE'} eq 'blocks'){
> + ($device,$total,$used,$avail,undef,$mount)=split(' ',$line);
> + $total *= 1024;
> + $used *= 1024;
> + $avail *= 1024;
> + } else {
> + ($device,$used,$avail,undef,$mount)=split(' ',$line);
> + $total=$used+$avail;
> + }
> + } elsif(/bsdish/){
> + return undef if($line =~ /^Filesystem.*Mounted on/i);
> + ($device,$btotal,$bused,$bavail,undef,$iused,$iavail,undef,$mount)=
> + split(' ',$line);
> + if($self->{'MODE'} eq 'blocks'){
> + $total=$btotal*512;
> + $used=$bused*512;
> + $avail=$bavail*512;
> + } elsif($self->{'MODE'} eq 'inodes'){
> + $total=undef;
> + $used=$iused*512;
> + $avail=$iavail*512;
> + }
> + } elsif(/irixish/){
> + return undef if($line =~ /^Filesystem.*Mounted on/i);
> + if($self->{'MODE'} eq 'blocks'){
> + ($device,undef,$btotal,$bused,$bavail,undef,$mount)=split(' ',$line);
> + $total=$btotal*512;
> + $used=$bused*512;
> + $avail=$bavail*512;
> + } elsif($self->{'MODE'} eq 'inodes'){
> + ($device,undef,$btotal,$bused,$bavail,undef,$iused,$iavail,undef,$mount)=
> + split(' ',$line);
> + return undef if $iused =~ /[A-Za-z]+/ or $iused == 0;
> + $total = ($iused + $iavail) * 512;
> + $used=$iused*512;
> + $avail=$iavail*512;
> + }
> + } elsif(/hpuxish/){
> + return undef if($line =~ /^Filesystem.*Mounted on/i);
> + ($device,$btotal,$bused,$bavail,undef,$iused,$iavail,undef,$mount)=
> + split(' ',$line);
> + if($self->{'MODE'} eq 'blocks'){
> + $total=$btotal*1024;
> + $used=$bused*1024;
> + $avail=$bavail*1024;
> + } elsif($self->{'MODE'} eq 'inodes'){
> + $total=($iused + $iavail);
> + $used=$iused;
> + $avail=$iavail;
> + }
> + } else {
> + croak "Unknown encoding ".$Df{"\L".$self->{'FORMAT'}."\E"}{'format'}.
> + " for format ".$self->{'FORMAT'};
> + }
> + $self->{'MOUNTS'}{$mount}=$device;
> + $self->{'DEVICES'}{$device}={};
> + $self->{'DEVICES'}{$device}{'device'}=$device;
> + $self->{'DEVICES'}{$device}{'total'} =$total;
> + $self->{'DEVICES'}{$device}{'used'} =$used;
> + $self->{'DEVICES'}{$device}{'avail'} =$avail;
> + $self->{'DEVICES'}{$device}{'mount'} =$mount;
> +}
> +
> +sub device() { return extract(@_,'device'); }
> +sub total() { return extract(@_,'total'); }
> +sub used() { return extract(@_,'used'); }
> +sub avail() { return extract(@_,'avail'); }
> +sub mount() { return extract(@_,'mount'); }
> +
> +sub extract () {
> + my $self=shift;
> + my $device;
> + if(@_) {
> + my $thingy=shift;
> + if(defined($self->{'DEVICES'}{$thingy})){
> + $device=$thingy;
> + } else {
> + return undef unless(defined($self->{'MOUNTS'}));
> + while(not defined($self->{'MOUNTS'}{$thingy})){
> + return undef if($thingy eq '/');
> + $thingy =~ s!/[^/]*?$!! unless($thingy =~ s!/$!!);
> + $thingy = "/" unless($thingy =~ "/");
> + }
> + $device=$self->{'MOUNTS'}{$thingy}
> + }
> + return $self->{'DEVICES'}{$device}{$_[0]};
> + }
> + return undef;
> +}
> +
> +sub disks () {
> + my $self=shift;
> + return undef unless(defined($self->{'MOUNTS'}));
> + return keys %{$self->{'MOUNTS'}};
> +}
> +
> +1;
> +__END__
> +
> +
> +=head1 NAME
> +
> +Filesys::DiskFree -- perform the Unix command 'df' in a portable fashion
> +
> +=head1 SYNOPSIS
> +
> + use Filesys::DiskFree;
> +
> + $handle = new Filesys::DiskFree;
> + $handle->df();
> + print "The root device is ".$handle->device("/")."\n";
> + print "It has ".$handle->avail("/")." bytes available\n";
> + print "It has ".$handle->total("/")." bytes total\n";
> + print "It has ".$handle->used("/")." bytes used\n";
> +
> +=head1 DESCRIPTION
> +
> +Filesys::DiskFree does about what the unix command df(1) does, listing
> +the mounted disks, and the amount of free space used & available.
> +
> +=head2 Functions
> +
> +=over 4
> +
> +=item Filesys::DiskFree->set('option' => 'value')
> +
> +Sets various options within the module.
> +
> +The most common option to change is the mode, which can be either
> +blocks or inodes. By default, blocks is used.
> +
> +If reading a file from a 'foreign' OS using the load() function,
> +format may be used, which takes the name of an OS as set in the $^O
> +variable.
> +
> +Returns the previous values of the options.
> +
> +=item Filesys::DiskFree->df()
> +
> +Perfoms a 'df' command, and stores the values for later use.
> +
> +=item Filesys::DiskFree->command()
> +
> +Returns the appropriate command to do a 'df' command, for the current
> +format. This is used when you wish to call a df on a remote system.
> +Use the df() method for local df's.
> +
> +Returns undef if there isn't an appropriate command.
> +
> +=item Filesys::DiskFree->load($line)
> +
> +Reads in the output of a 'df', $line can be either a scalar or a filehandle.
> +If $line is a filehandle, then the filehandle is read until EOF.
> +
> +Returns undef on failure
> +
> +=item Filesys::DiskFree->disks()
> +
> +Returns all the disks known about
> +
> +=item Filesys::DiskFree->device($id)
> +
> +Returns the device for $id, which is a scalar containing the device name of
> +a disk or a filename, in which case the disk that filename in stored upon
> +is used. If a filename doesn't begin with '/', then it is treated as
> +if is '/'.
> +
> +=item Filesys::DiskFree->mount($id)
> +
> +Returns the mount point for $id, which is a scalar containing the device
> +name of a disk or a filename, in which case the disk that filename in
> +stored upon is used.
> +
> +=item Filesys::DiskFree->avail($id)
> +
> +Returns the amount of available space in bytes for $id, which is a scalar
> +containing the device name of a disk or a filename, in which case the
> +disk that filename in stored upon is used.
> +
> +=item Filesys::DiskFree->total($id)
> +
> +Returns the amount of total space in bytes for $id, which is a scalar
> +containing the device name of a disk or a filename, in which case the
> +disk that filename in stored upon is used.
> +
> +=item Filesys::DiskFree->used($id)
> +
> +Returns the amount of used space in bytes for $id, which is a scalar
> +containing the device name of a disk or a filename, in which case the
> +disk that filename in stored upon is used.
> +
> +=head1 BUGS
> +
> +It should support more formats, currently only Linux, Irix, Solaris &
> +BSD are supported. Other formats will be added as available. Please sent
> +your OS Name & version, the 'best' df options to use, and the output of
> +df with those options, and the contents of $^O if you have access to a
> +non-supported format.
> +
> +=head1 AUTHOR
> +
> +Alan R. Barclay <gorilla_at_[hidden]>
>
> Added: trunk/lib/Filesys/MANIFEST
> ==============================================================================
> --- (empty file)
> +++ trunk/lib/Filesys/MANIFEST 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -0,0 +1,8 @@
> +Changes
> +DiskFree.pm
> +MANIFEST
> +Makefile.PL
> +README
> +eg/perldf
> +eg/silly
> +test.pl
>
> Added: trunk/lib/Filesys/Makefile.PL
> ==============================================================================
> --- (empty file)
> +++ trunk/lib/Filesys/Makefile.PL 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -0,0 +1,7 @@
> +use ExtUtils::MakeMaker;
> +# See lib/ExtUtils/MakeMaker.pm for details of how to influence
> +# the contents of the Makefile that is written.
> +WriteMakefile(
> + 'NAME' => 'Filesys::DiskFree',
> + 'VERSION_FROM' => 'DiskFree.pm', # finds $VERSION
> +);
>
> Added: trunk/lib/Filesys/README
> ==============================================================================
> --- (empty file)
> +++ trunk/lib/Filesys/README 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -0,0 +1,86 @@
> +NAME
> + Filesys::DiskFree -- perform the Unix command 'df' in a portable fashion
> +
> +SYNOPSIS
> + use Filesys::DiskFree;
> +
> + $handle = new Filesys::DiskFree;
> + $handle->df();
> + print "The root device is ".$handle->device("/")."\n";
> + print "It has ".$handle->avail("/")." bytes available\n";
> + print "It has ".$handle->total("/")." bytes total\n";
> + print "It has ".$handle->used("/")." bytes used\n";
> +
> +DESCRIPTION
> + Filesys::DiskFree does about what the unix command df(1) does, listing
> + the mounted disks, and the amount of free space used & available.
> +
> + Functions
> +
> + Filesys::DiskFree->set('option' => 'value')
> + Sets various options within the module.
> +
> + The most common option to change is the mode, which can be either
> + blocks or inodes. By default, blocks is used.
> +
> + If reading a file from a 'foreign' OS using the load() function,
> + format may be used, which takes the name of an OS as set in the $^O
> + variable.
> +
> + Returns the previous values of the options.
> +
> + Filesys::DiskFree->df()
> + Perfoms a 'df' command, and stores the values for later use.
> +
> + Filesys::DiskFree->command()
> + Returns the appropriate command to do a 'df' command, for the
> + current format. This is used when you wish to call a df on a remote
> + system. Use the df() method for local df's.
> +
> + Returns undef if there isn't an appropriate command.
> +
> + Filesys::DiskFree->load($line)
> + Reads in the output of a 'df', $line can be either a scalar or a
> + filehandle. If $line is a filehandle, then the filehandle is read
> + until EOF.
> +
> + Returns undef on failure
> +
> + Filesys::DiskFree->disks()
> + Returns all the disks known about
> +
> + Filesys::DiskFree->device($id)
> + Returns the device for $id, which is a scalar containing the device
> + name of a disk or a filename, in which case the disk that filename
> + in stored upon is used.
> +
> + Filesys::DiskFree->mount($id)
> + Returns the mount point for $id, which is a scalar containing the
> + device name of a disk or a filename, in which case the disk that
> + filename in stored upon is used.
> +
> + Filesys::DiskFree->avail($id)
> + Returns the amount of available space in bytes for $id, which is a
> + scalar containing the device name of a disk or a filename, in which
> + case the disk that filename in stored upon is used.
> +
> + Filesys::DiskFree->total($id)
> + Returns the amount of total space in bytes for $id, which is a
> + scalar containing the device name of a disk or a filename, in which
> + case the disk that filename in stored upon is used.
> +
> + Filesys::DiskFree->used($id)
> + Returns the amount of used space in bytes for $id, which is a scalar
> + containing the device name of a disk or a filename, in which case
> + the disk that filename in stored upon is used.
> +
> +BUGS
> + It should support more formats, currently only Linux, Irix, Solaris
> + & BSD are supported. Other formats will be added as available.
> + Please sent your OS Name & version, the 'best' df options to use,
> + and the output of df with those options, and the contents of $^O if
> + you have access to a non-supported format.
> +
> +AUTHOR
> + Alan R. Barclay <gorilla_at_[hidden]>
> +
>
> Added: trunk/lib/Filesys/README.mtt
> ==============================================================================
> --- (empty file)
> +++ trunk/lib/Filesys/README.mtt 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -0,0 +1,4 @@
> +All the files in this directory are the Filesys::DiskFree distribution
> +from search.cpan.org:
> +
> +http://search.cpan.org/CPAN/authors/id/A/AB/ABARCLAY/Filesys-DiskFree-0.06.tar.gz
>
> Added: trunk/lib/Filesys/eg/perldf
> ==============================================================================
> --- (empty file)
> +++ trunk/lib/Filesys/eg/perldf 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -0,0 +1,50 @@
> +#!/usr/local/bin/perl -w
> +use strict;
> +
> +#
> +# A version of 'df' which produces the same output on any system
> +#
> +
> +use Filesys::DiskFree;
> +
> +#
> +# Create a df handle
> +#
> +my $df = new Filesys::DiskFree;
> +
> +#
> +# Call the actual df command
> +#
> +$df->df();
> +
> +
> +my $disk;
> +#
> +# Output the information
> +#
> +my $percent;
> +foreach $disk(sort($df->disks)){
> + my $total=($df->used($disk)+$df->avail($disk));
> + $percent=0;
> + if($total != 0){
> + $percent=sprintf("%2.0f",($df->used($disk)/$total)*100);
> + }
> + write;
> +}
> +
> +#
> +# Format for the header
> +#
> +format STDOUT_TOP =
> +Filesystem 1024-blocks Used Available Capacity Mounted on
> +.
> +
> +#
> +# Format for each data item, notice the /1024's, all sizes are stored in bytes
> +# for portablity
> +#
> +format STDOUT =
> +@<<<<<<<<<<<<<<<<<< @>>>>>>> @>>>>>> @>>>>>>> @>>% @<<<<<<<<<<<<<<<<<<<<<<<
> +$df->device($disk), $df->total($disk)/1024, $df->used($disk)/1024,$df->avail($disk)/1024, $percent,$df->mount($disk)
> +.
> +
>
> Added: trunk/lib/Filesys/eg/silly
> ==============================================================================
> --- (empty file)
> +++ trunk/lib/Filesys/eg/silly 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -0,0 +1,72 @@
> +#!/usr/local/bin/perl -w
> +#
> +# Silly program which shows using this module
> +#
> +use strict;
> +
> +use Filesys::DiskFree;
> +
> +# Create a new handle
> +my $df = new Filesys::DiskFree;
> +
> +# Set the modes
> +$df->set('-mode'=>'blocks');
> +$df->set('-format'=>'solaris');
> +
> +# Remember what format we're using
> +print $df->set('format'),"\n";
> +
> +# Load a scalar with the right values.
> +my $line= <<EOL;
> +/dev/hdc1 366312 345605 1788 99% /home
> +/dev/hdd1 366312 345605 1788 99% /usr
> +EOL
> +
> +# And load the scalar into the class
> +$df->load($line);
> +
> +# Some prints of info
> +print $df->device('/dev/hdc1')." is mounted on ".$df->mount('/dev/hdc1')."\n";
> +
> +$df = new Filesys::DiskFree;
> +$df->set('-mode'=>'blocks');
> +$df->set('-format'=>'bsdos');
> +
> +$line= <<EOL;
> +Filesystem 512-blocks Used Avail Capacity iused ifree %iused Mounted on
> +/dev/sd0a 396670 191816 185020 51% 1611 48307 3% /
> +/dev/sd0h 6816728 2251342 4224548 35% 12738 840380 1% /home
> +EOL
> +
> +# And load the scalar into the class
> +$df->load($line);
> +
> +print $df->device('/home')." is mounted on ".$df->mount('/home')."\n";
> +
> +# Start again, create another new handle
> +$df=new Filesys::DiskFree;
> +
> +# This time we're using a file handle. This is a silly example,
> +# because you could do the same thing with just the df() method,
> +# but you could use rsh or some similar method to do this on a
> +# remote machine
> +my $cmd=$df->command();
> +open(DF,"$cmd|") or die "Cannot $cmd $!\n";
> +
> +$df->load(\*DF);
> +
> +close(DF) or die "Cannot $cmd $! $?\n";
> +
> +# Now output the disks
> +my @disks=$df->disks();
> +
> +print join(" ",@disks);
> +
> +print "\n";
> +
> +# Finally, output the # of free inodes on /
> +$df=new Filesys::DiskFree;
> +
> +$df->set('-mode'=>'inodes');
> +$df->df();
> +print "Disk ".$df->device('/')." has ",$df->avail('/')," inodes available\n";
>
> Added: trunk/lib/Filesys/test.pl
> ==============================================================================
> --- (empty file)
> +++ trunk/lib/Filesys/test.pl 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -0,0 +1,20 @@
> +# Before `make install' is performed this script should be runnable with
> +# `make test'. After `make install' it should work as `perl test.pl'
> +
> +######################### We start with some black magic to print on failure.
> +
> +# Change 1..1 below to 1..last_test_to_print .
> +# (It may become useful if the test is moved to ./t subdirectory.)
> +
> +BEGIN { $| = 1; print "1..1\n"; }
> +END {print "not ok 1\n" unless $loaded;}
> +use Filesys::DiskFree;
> +$loaded = 1;
> +print "ok 1\n";
> +
> +######################### End of black magic.
> +
> +# Insert your test code below (better if it prints "ok 13"
> +# (correspondingly "not ok 13") depending on the success of chunk 13
> +# of the test code):
> +
>
> Modified: trunk/lib/MTT/Globals.pm
> ==============================================================================
> --- trunk/lib/MTT/Globals.pm (original)
> +++ trunk/lib/MTT/Globals.pm 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -64,6 +64,9 @@
> after_all_exec => undef,
> after_all_exec_timeout => 10,
> after_all_exec_pass => "&and(&cmd_wifexited(), &eq(&cmd_wexitstatus(), 0))",
> +
> + min_disk_free => "5%",
> + min_disk_free_wait => "60",
> };
>
> #--------------------------------------------------------------------------
> @@ -111,7 +114,7 @@
>
> # Simple parameters
>
> - my @names = qw/max_np textwrap drain_timeout trim_save_successful trim_save_failed trial http_proxy https_proxy ftp_proxy terminate_files pause_files/;
> + my @names = qw/max_np textwrap drain_timeout trim_save_successful trim_save_failed trial http_proxy https_proxy ftp_proxy terminate_files pause_files min_disk_free min_disk_free_wait/;
> foreach my $t (qw/before after/) {
> foreach my $a (qw/all each/) {
> push(@names, $t . "_" . $a . "_exec");
>
> Modified: trunk/lib/MTT/MPI/Get.pm
> ==============================================================================
> --- trunk/lib/MTT/MPI/Get.pm (original)
> +++ trunk/lib/MTT/MPI/Get.pm 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -67,7 +67,7 @@
> foreach my $section ($ini->Sections()) {
> # See if we're supposed to terminate
> last
> - if (MTT::Util::find_terminate_file());
> + if (MTT::Util::time_to_terminate());
>
> if ($section =~ /^\s*mpi get:/) {
> # Make the active INI section name known
>
> Modified: trunk/lib/MTT/MPI/Install.pm
> ==============================================================================
> --- trunk/lib/MTT/MPI/Install.pm (original)
> +++ trunk/lib/MTT/MPI/Install.pm 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -152,7 +152,7 @@
> # outtermost and innermost loops (even though we *could* check
> # at every loop level); that's good enough.
> last
> - if (MTT::Util::find_terminate_file());
> + if (MTT::Util::time_to_terminate());
>
> if ($section =~ /^\s*mpi install:/) {
> Verbose(">> $phase_name [$section]\n");
> @@ -224,7 +224,7 @@
> # check at every loop level); that's good
> # enough.
> last
> - if (MTT::Util::find_terminate_file());
> + if (MTT::Util::time_to_terminate());
>
> my $mpi_version = $mpi_get->{$mpi_version_key};
>
>
> Modified: trunk/lib/MTT/Test/Build.pm
> ==============================================================================
> --- trunk/lib/MTT/Test/Build.pm (original)
> +++ trunk/lib/MTT/Test/Build.pm 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -85,7 +85,7 @@
> # outtermost and innermost loops (even though we *could* check
> # at every loop level); that's good enough.
> last
> - if (MTT::Util::find_terminate_file());
> + if (MTT::Util::time_to_terminate());
>
> if ($section =~ /^\s*test build:/) {
> Verbose(">> $phase_name [$section]\n");
> @@ -152,7 +152,7 @@
> # every loop level); that's good
> # enough.
> last
> - if (MTT::Util::find_terminate_file());
> + if (MTT::Util::time_to_terminate());
>
> my $mpi_install = $mpi_version->{$mpi_install_key};
> # Only take sucessful MPI installs
>
> Modified: trunk/lib/MTT/Test/Get.pm
> ==============================================================================
> --- trunk/lib/MTT/Test/Get.pm (original)
> +++ trunk/lib/MTT/Test/Get.pm 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -47,7 +47,7 @@
> foreach my $section ($ini->Sections()) {
> # See if we're supposed to terminate
> last
> - if (MTT::Util::find_terminate_file());
> + if (MTT::Util::time_to_terminate());
>
> if ($section =~ /^\s*test get:/) {
> # Make the active INI section name known
>
> Modified: trunk/lib/MTT/Test/Run.pm
> ==============================================================================
> --- trunk/lib/MTT/Test/Run.pm (original)
> +++ trunk/lib/MTT/Test/Run.pm 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -78,7 +78,7 @@
> # outtermost and innermost loops (even though we *could* check
> # at every loop level); that's good enough.
> last
> - if (MTT::Util::find_terminate_file());
> + if (MTT::Util::time_to_terminate());
>
> if ($section =~ /^\s*test run:/) {
>
> @@ -130,7 +130,7 @@
> # *could* check at every loop level);
> # that's good enough.
> last
> - if (MTT::Util::find_terminate_file());
> + if (MTT::Util::time_to_terminate());
>
> if ($test_build_name eq "all" ||
> $test_build_key eq $test_build_name) {
>
> Modified: trunk/lib/MTT/Test/RunEngine.pm
> ==============================================================================
> --- trunk/lib/MTT/Test/RunEngine.pm (original)
> +++ trunk/lib/MTT/Test/RunEngine.pm 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -143,7 +143,7 @@
>
> # See if we're supposed to terminate.
> last
> - if (MTT::Util::find_terminate_file());
> + if (MTT::Util::time_to_terminate());
>
> last
> if (MTT::Util::check_break_threshold(
> @@ -183,7 +183,7 @@
> foreach my $this_np (@$all_np) {
> # See if we're supposed to terminate.
> last
> - if (MTT::Util::find_terminate_file());
> + if (MTT::Util::time_to_terminate());
>
> $test_results->{$this_np} =
> _run_one_np($install_dir, $run, $mpi_details, $this_np,
> @@ -247,7 +247,7 @@
> foreach my $e (@$execs) {
> # See if we're supposed to terminate.
> last
> - if (MTT::Util::find_terminate_file());
> + if (MTT::Util::time_to_terminate());
> _run_one_test($install_dir, $run, $mpi_details, $e, $name,
> $variant++, $force);
> }
>
> Modified: trunk/lib/MTT/Util.pm
> ==============================================================================
> --- trunk/lib/MTT/Util.pm (original)
> +++ trunk/lib/MTT/Util.pm 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -29,10 +29,12 @@
> get_array_ref
> );
>
> +use Cwd;
> use MTT::Globals;
> use MTT::Messages;
> use MTT::Values;
> use Data::Dumper;
> +use Filesys::DiskFree;
>
> #--------------------------------------------------------------------------
>
> @@ -69,7 +71,8 @@
>
> my @_terminate_files;
> my @_pause_files;
> -sub find_terminate_file {
> +my $df_handle;
> +sub time_to_terminate {
> # If we previously found a terminate file, just return
> return 1
> if ($MTT::Globals::Values->{time_to_terminate});
> @@ -90,6 +93,17 @@
> push(@_pause_files, MTT::Values::EvaluateString($f));
> }
> }
> +
> + # Setup min_disk_free to be a number of bytes
> + $df_handle = new Filesys::DiskFree;
> + if ($MTT::Globals::Values->{min_disk_free} =~ m/([0-9]{1,2})\%/) {
> + $df_handle->df();
> + my $val = $1;
> + $val /= 100.0;
> + $val *= $df_handle->total(cwd());
> + $val = int($val);
> + $MTT::Globals::Values->{min_disk_free} = $val;
> + }
> }
>
> # Check to see if any of the files exist
> @@ -124,7 +138,39 @@
> }
> } while ($found == 1);
>
> - # We didn't find any, so return false
> + # Check the disk space remaining
> + if ($MTT::Globals::Values->{min_disk_free} > 0) {
> + my $c = getcwd();
> + $df_handle->df();
> + if ($df_handle->avail($c) <
> + $MTT::Globals::Values->{min_disk_free}) {
> + Warning("Disk free is less than minimum (" .
> + $df_handle->avail($c) .
> + " bytes < $MTT::Globals::Values->{min_disk_free} bytes)\n");
> + Warning("Waiting for up to $MTT::Globals::Values->{min_disk_free_wait} minutes to see if the situation resolves itself\n")
> + if ($MTT::Globals::Values->{min_disk_free_wait} > 0);
> +
> + my $i = 0;
> + while ($i < 2 * $MTT::Globals::Values->{min_disk_free_wait}) {
> + sleep(30);
> + $df_handle->df();
> + if ($df_handle->avail($c) >
> + $MTT::Globals::Values->{min_disk_free}) {
> + last;
> + }
> + ++$i;
> + }
> + # If we reach an hour without more disk, then abort
> + if ($i >= 2 * $MTT::Globals::Values->{min_disk_free_wait}) {
> + Warning("Still not enough disk space available\n");
> + Warning("Exiting...\n");
> + $MTT::Globals::Values->{time_to_terminate} = 1;
> + return 1;
> + }
> + }
> + }
> +
> + # Ok to keep running; return false
> return 0;
> }
>
>
> Modified: trunk/samples/ompi-core-template.ini
> ==============================================================================
> --- trunk/samples/ompi-core-template.ini (original)
> +++ trunk/samples/ompi-core-template.ini 2008-07-22 21:27:04 EDT (Tue, 22 Jul 2008)
> @@ -152,6 +152,23 @@
> # in the MTT section.
> # funclet_files = /path/to/file1.pm, /path/to/file2.pm
>
> +# OMPI Core: To ensure that MTT doesn't fill up your disk, you can
> +# tell MTT to stop when disk space gets too low. You can specify a
> +# raw number of bytes or a percentage of overall disk space. For
> +# example (default value is "5%"):
> +#
> +# min_disk_free = 5% # stop when there's less than 5% disk free
> +# min_disk_free = 500000 # stop when there's less than 500,000 bytes free
> +
> +# OMPI Core: When MTT detects a low-disk situation, it can wait a
> +# little while before reporting whatever results it has accumulated
> +# and exiting. The min_disk_free_wait field specifies a number of
> +# minutes to wait for there to be enough disk space to be free. If
> +# there is still not enough disk space at the end of that time, MTT
> +# will report accumulated results and quit.
> +#
> +# min_disk_free_wait = 60
> +
> #----------------------------------------------------------------------
>
> [Lock]
> _______________________________________________
> mtt-svn mailing list
> mtt-svn_at_[hidden]
> http://www.open-mpi.org/mailman/listinfo.cgi/mtt-svn