src/parallel: Bugs conserning filehandles for sshlogin - passes unittest

This commit is contained in:
Ole Tange 2010-05-16 14:31:19 +02:00
parent e28d0baf98
commit c027f36ccf

View file

@ -1147,7 +1147,7 @@ drain_job_queue();
sub parse_options { sub parse_options {
# Defaults: # Defaults:
$Global::version = 20100428; $Global::version = 20100516;
$Global::progname = 'parallel'; $Global::progname = 'parallel';
$Global::debug = 0; $Global::debug = 0;
$Global::verbose = 0; $Global::verbose = 0;
@ -1644,6 +1644,7 @@ sub no_of_cores {
sub no_of_cpus { sub no_of_cpus {
if(not $Global::no_of_cpus) { if(not $Global::no_of_cpus) {
local $/="\n"; # If delimiter is set, then $/ will be wrong
my $no_of_cpus = (no_of_cpus_gnu_linux() my $no_of_cpus = (no_of_cpus_gnu_linux()
|| no_of_cpus_darwin() || no_of_cpus_darwin()
|| no_of_cpus_solaris()); || no_of_cpus_solaris());
@ -1766,12 +1767,17 @@ sub start_more_jobs {
my $jobs_started = 0; my $jobs_started = 0;
if(not $Global::StartNoNewJobs) { if(not $Global::StartNoNewJobs) {
for my $sshlogin (keys %Global::host) { for my $sshlogin (keys %Global::host) {
debug("Running jobs on $sshlogin: $Global::host{$sshlogin}{'no_of_running'}\n");
while ($Global::host{$sshlogin}{'no_of_running'} < while ($Global::host{$sshlogin}{'no_of_running'} <
$Global::host{$sshlogin}{'max_no_of_running'}) { $Global::host{$sshlogin}{'max_no_of_running'}) {
start_another_job($sshlogin); if(start_another_job($sshlogin) == 0) {
# No more jobs to start
last;
}
$Global::host{$sshlogin}{'no_of_running'}++; $Global::host{$sshlogin}{'no_of_running'}++;
$jobs_started++; $jobs_started++;
} }
debug("Running jobs on $sshlogin: $Global::host{$sshlogin}{'no_of_running'}\n");
} }
} }
return $jobs_started; return $jobs_started;
@ -1780,21 +1786,29 @@ sub start_more_jobs {
sub start_another_job { sub start_another_job {
# Grab a job from @Global::command, start it # Grab a job from @Global::command, start it
# and remember the pid, the STDOUT and the STDERR handles # and remember the pid, the STDOUT and the STDERR handles
# If no more jobs: do nothing # Return 1.
# If no more jobs: do nothing and return 0
# Do we have enough file handles to start another job? # Do we have enough file handles to start another job?
my $sshlogin = shift; my $sshlogin = shift;
if(enough_file_handles()) { if(enough_file_handles()) {
my $command = next_command_line(); my $command = next_command_line();
if(defined $command) { if(defined $command) {
debug("Command to run on '$sshlogin': $command\n");
my %jobinfo = start_job($command,$sshlogin); my %jobinfo = start_job($command,$sshlogin);
if(%jobinfo) { if(%jobinfo) {
$Global::running{$jobinfo{"pid"}} = \%jobinfo; $Global::running{$jobinfo{"pid"}} = \%jobinfo;
return 1;
} else {
# If interactive says: Dont run the job, then skip it and run the next
return start_another_job($sshlogin);
} }
return 1;
} else { } else {
# No more commands to run
return 0; return 0;
} }
} else { } else {
# No more file handles
warn("Not enough file handles to start another job");
return 0; return 0;
} }
} }
@ -1939,12 +1953,10 @@ sub parse_sshlogin {
if($ssh eq ":") { if($ssh eq ":") {
$ncpu = no_of_cpus(); $ncpu = no_of_cpus();
} else { } else {
$ncpu = qx(ssh $ssh parallel --number-of-cpus); $ncpu = qx(echo|ssh $ssh parallel --number-of-cpus);
chomp($ncpu); chomp($ncpu);
} }
} }
# Save the $ssh and $ncpu in a data structure
$Global::sshlogin{$ssh} = $ncpu;
$Global::host{$ssh}{'no_of_running'} = 0; $Global::host{$ssh}{'no_of_running'} = 0;
$Global::host{$ssh}{'ncpus'} = $ncpu; $Global::host{$ssh}{'ncpus'} = $ncpu;
$Global::host{$ssh}{'maxlength'} = max_length_of_command_line(); $Global::host{$ssh}{'maxlength'} = max_length_of_command_line();