--- globus_2_4_3_adv2003_fix892_fix956_more/gram/jobmanager/setup/condor/condor.in Tue Jun 17 22:10:02 2003 +++ globus_2_4_3_adv2003_fix892_fix956_plus/gram/jobmanager/setup/condor/condor.in Sun Jan 4 20:26:54 2004 @@ -2,17 +2,19 @@ # # CVS Information: # $Source: /home/globdev/CVS/globus-packages/gram/jobmanager/setup/condor/condor.in,v $ -# $Date: 2003/06/17 20:10:02 $ -# $Revision: 1.5.6.1 $ -# $Author: bester $ +# $Date: 2003/09/19 16:32:48 $ +# $Revision: 1.7 $ +# $Author: smartin $ use Globus::GRAM::Error; use Globus::GRAM::JobState; use Globus::GRAM::JobManager; +use Globus::GRAM::StdioMerger; use Globus::Core::Paths; use Config; +# NOTE: This package name must match the name of the .pm file!! package Globus::GRAM::JobManager::condor; @ISA = qw(Globus::GRAM::JobManager); @@ -31,6 +33,10 @@ my $class = ref($proto) || $proto; my $self = $class->SUPER::new(@_); my $log_dir; + my $description = $self->{JobDescription}; + my $tag = $description->cache_tag() or $tag = $ENV{GLOBUS_GRAM_JOB_CONTACT}; + my $stdout = $description->stdout(); + my $stderr = $description->stderr(); if(! exists($ENV{GLOBUS_SPOOL_DIR})) { @@ -41,6 +47,17 @@ $log_dir = $ENV{GLOBUS_SPOOL_DIR}; } + if($description->jobtype() eq 'multiple' && $description->count > 1) + { + $self->{STDIO_MERGER} = + new Globus::GRAM::StdioMerger($tag, $stdout, $stderr); + } + else + { + $self->{STDIO_MERGER} = 0; + } + + $self->{condor_logfile} = "$log_dir/gram_condor_log." . $self->{JobDescription}->uniq_id(); @@ -59,19 +76,25 @@ my $script_url; my $script_filename; my $script_file; - my $requirements = ""; - my $rank = ""; + my $requirements = ''; + my $rank = ''; my @arguments; my $argument_string; my %library_vars; my @response_text; my @submit_attrs; my $submit_attrs_string; + my $multi_output = 0; if($description->jobtype() eq 'single' || $description->jobtype() eq 'multiple') { $universe = 'vanilla'; + + if ($description->jobtype() eq 'multiple' + && ($description->count() > 1)) { + $multi_output = 1; + } } elsif($description->jobtype() eq 'condor') { @@ -87,7 +110,7 @@ { return Globus::GRAM::Error::RSL_DIRECTORY; } - elsif( $description->stdin() eq "") + elsif( $description->stdin() eq '') { return Globus::GRAM::Error::RSL_STDIN; } @@ -96,7 +119,7 @@ { return Globus::GRAM::Error::INVALID_COUNT(); } - elsif( $description->executable eq "") + elsif( $description->executable eq '') { return Globus::GRAM::Error::RSL_EXECUTABLE(); } @@ -167,8 +190,8 @@ { $_ =~ s/\\/\\\\/g; $_ =~ s/\$/\\\$/g; - $_ =~ s/"/\\\"/g; - $_ =~ s/`/\\\`/g; + $_ =~ s/"/\\\"/g; #" + $_ =~ s/`/\\\`/g; #` $_; } @arguments); @@ -193,22 +216,26 @@ } else { - $submit_attrs_string = ""; + $submit_attrs_string = ''; } # Create script for condor submission $script_url = "$tag/condor_script.$$"; - system("$cache_pgm -add -t $tag -n $script_url file:/dev/null >/dev/null"); - $script_filename = `$cache_pgm -query -t $tag $script_url 2>/dev/null`; + $self->fork_and_exec_cmd($cache_pgm, '-add', '-t', $tag, '-n', + $script_url, 'file:/dev/null' ); + $script_filename = $self->pipe_out_cmd($cache_pgm, '-query', '-t', $tag, + $script_url); chomp($script_filename); - if($script_filename eq "") + if($script_filename eq '') { return Globus::GRAM::::Error::TEMP_SCRIPT_FILE_FAILED; } local(*SCRIPT_FILE); - open(SCRIPT_FILE, ">$script_filename"); + + open(SCRIPT_FILE, ">$script_filename") + or return Globus::GRAM::Error::TEMP_SCRIPT_FILE_FAILED; print SCRIPT_FILE "#\n# description file for condor submission\n#\n"; print SCRIPT_FILE "Universe = $universe\n"; @@ -228,35 +255,62 @@ { print SCRIPT_FILE "$rank\n"; } + print SCRIPT_FILE "Environment = $environment_string\n"; print SCRIPT_FILE "Arguments = $argument_string\n"; print SCRIPT_FILE "InitialDir = " . $description->directory() . "\n"; print SCRIPT_FILE "Input = " . $description->stdin() . "\n"; - print SCRIPT_FILE "Output = " . $description->stdout() . "\n"; - print SCRIPT_FILE "Error = " . $description->stderr() . "\n"; print SCRIPT_FILE "Log = " . $self->{condor_logfile} . "\n"; print SCRIPT_FILE "#Extra attributes specified by client\n"; print SCRIPT_FILE "$submit_attrs_string\n"; - print SCRIPT_FILE "queue " . $description->count() . "\n"; - - close(SCRIPT_FILE); - - $log = "2> " . $description->stderr(); - local(*SCRIPT_RESPONSE); + for (my $i = 0; $i < $description->count(); $i++) { + if ($multi_output) { + print SCRIPT_FILE "Output = " . + $self->{STDIO_MERGER}->add_file('out') . "\n"; + print SCRIPT_FILE "Error = " . + $self->{STDIO_MERGER}->add_file('err') . "\n"; + } else { + print SCRIPT_FILE "Output = " . $description->stdout() . "\n"; + print SCRIPT_FILE "Error = " . $description->stderr() . "\n"; + } + print SCRIPT_FILE "queue 1\n"; + } - open(SCRIPT_RESPONSE, "$condor_submit $script_filename $log|") - || return Globus::GRAM::Error::JOB_EXECUTION_FAILED; + close(SCRIPT_FILE); - @response_text = ; - close SCRIPT_RESPONSE; + local(*FH); + my $pid = open(FH, "-|"); + if( !defined($pid)) + { + # failure to fork + @response_text = (); + } + elsif ($pid) + { + # parent + @response_text = ; + close(FH); + } + else + { + # child + open (STDERR, '>' . $description->stderr()); + select(STDERR); $| = 1; + select(STDOUT); $| = 1; + + if (! exec { $condor_submit } $condor_submit, $script_filename) + { + exit(127); + } + } if(@response_text) { $response_line =(grep(/submitted to cluster/, @response_text))[0]; $job_id = (split(/\./, (split(/\s+/, $response_line))[5]))[0]; - if($job_id ne "") + if($job_id ne '') { $status = Globus::GRAM::JobState::PENDING; @@ -280,10 +334,9 @@ $self->log("polling job " . $description->jobid()); - local(*CONDOR_LOG_FILE); open(CONDOR_LOG_FILE, "<".$self->{condor_logfile}) - || return $state = Globus::GRAM::JobState::DONE;; + || return { Globus::GRAM::JobState::DONE }; @status = grep(/^[0-9]* \(0*${job_id}/, ); close(CONDOR_LOG_FILE); @@ -300,6 +353,11 @@ } elsif($num_done == $description->count()) { + $self->nfssync( $description->stdout(), 0 ) + if $description->stdout() ne ''; + $self->nfssync( $description->stderr(), 0 ) + if $description->stderr() ne ''; + $state = Globus::GRAM::JobState::DONE; unlink($self->{condor_logfile}); } @@ -316,6 +374,10 @@ $state = Globus::GRAM::JobState::SUSPENDED; } + if($self->{STDIO_MERGER}) { + $self->{STDIO_MERGER}->poll($state == Globus::GRAM::JobState::DONE); + } + return { JOB_STATE => $state }; } @@ -327,7 +389,7 @@ my $count = 0; $self->log("cancel job " . $description->jobid()); - + # we do not need to be too efficient here $self->log(`$condor_rm $job_id 2>&1`); if($? == 0)