From 3447f2da85c207ce0edd6e35bb9f85494c2b10e7 Mon Sep 17 00:00:00 2001 From: Ole Tange Date: Sat, 15 Feb 2014 14:10:52 +0100 Subject: [PATCH] parallel: Fixed bug #41565: Print happens in block - not after each job complete. Passes test suite. --- src/parallel | 22 +++++++++------- testsuite/tests-to-run/parallel-local150.sh | 4 ++- testsuite/tests-to-run/parallel-local6.sh | 5 ++-- testsuite/wanted-results/parallel-local150 | 29 +++++++++++++++++++++ testsuite/wanted-results/test30 | 1 + 5 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/parallel b/src/parallel index 7e91a616..d49704e7 100755 --- a/src/parallel +++ b/src/parallel @@ -2226,15 +2226,16 @@ sub reaper { $Private::job_end_sequence ||= 1; debug("Looking for: $Private::job_end_sequence ". "Current: ".$job->seq()."\n"); - while($Private::print_later{$Private::job_end_sequence} - or - vec($Global::job_already_run,$Private::job_end_sequence,1)) { + for(my $j = $Private::print_later{$Private::job_end_sequence}; + $j or vec($Global::job_already_run,$Private::job_end_sequence,1); + $Private::job_end_sequence++, + $j = $Private::print_later{$Private::job_end_sequence}) { debug("Found job end $Private::job_end_sequence"); - defined $Private::print_later{$Private::job_end_sequence} and - $Private::print_later{$Private::job_end_sequence}->print(); - delete $Private::print_later{$Private::job_end_sequence}; - $Private::job_end_sequence++; - } + if($j) { + $j->print(); + delete $Private::print_later{$Private::job_end_sequence}; + } + } } else { $job->print(); } @@ -2266,6 +2267,7 @@ sub reaper { $sshlogin->inc_jobs_completed(); $Global::total_running--; delete $Global::running{$stiff}; + start_more_jobs(); } debug("done "); return $children_reaped; @@ -4864,12 +4866,12 @@ sub print { unlink $self->fd_file_name(1); } - # Check for disk full - exit_if_disk_full(); if($Global::joblog) { $self->print_joblog() } # Printing is only relevant for grouped output. $Global::grouped or return; + # Check for disk full + exit_if_disk_full(); my $command = $self->sshlogin_wrap(); if(($opt::dryrun or $Global::verbose) and $Global::grouped diff --git a/testsuite/tests-to-run/parallel-local150.sh b/testsuite/tests-to-run/parallel-local150.sh index e1d1b187..af17a54f 100644 --- a/testsuite/tests-to-run/parallel-local150.sh +++ b/testsuite/tests-to-run/parallel-local150.sh @@ -7,7 +7,9 @@ cd tmp cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -j0 -k -L1 echo '### bug #41565: Print happens in blocks - not after each job complete' echo 'The timing here is important: 2 3 4 5 6' - ping -c 7 lo | parallel -j3 --delay 0.1 'echo {#}' | timestamp | head -n5 | cut -f 1 -d . + ping -c 7 lo | parallel -j3 'echo {#}' | timestamp -dd | perl -pe '$_=int($_+0.2)."\n"' +echo '300 ms jobs:' + ping -i .3 -c 10 lo | parallel -j3 --delay 0.3 echo | timestamp -d -d | perl -pe 's/(...).*/$1/' | tail -n +2 echo '### Test --tagstring' nice parallel -j1 -X -v --tagstring a{}b echo ::: 3 4 diff --git a/testsuite/tests-to-run/parallel-local6.sh b/testsuite/tests-to-run/parallel-local6.sh index 835c4788..1b79ca3f 100755 --- a/testsuite/tests-to-run/parallel-local6.sh +++ b/testsuite/tests-to-run/parallel-local6.sh @@ -1,8 +1,7 @@ #!/bin/bash echo '### Test --joblog with exitval and Test --joblog with signal -- timing dependent' -rm /tmp/parallel_sleep -#parallel --joblog /tmp/parallel_joblog_signal 'echo foo >/tmp/parallel_sleep; sleep {}' ::: 30 2>/dev/null & +rm -f /tmp/parallel_sleep parallel --joblog /tmp/parallel_joblog_signal 'sleep {}' ::: 30 2>/dev/null & parallel --joblog /tmp/parallel_joblog_exitval 'echo foo >/tmp/parallel_sleep; sleep {} && echo sleep was not killed=BAD' ::: 30 2>/dev/null & while [ ! -e /tmp/parallel_sleep ] ; do @@ -14,5 +13,5 @@ wait grep -q 134 /tmp/parallel_joblog_exitval && echo exitval=128+6 OK grep -q '[^0-9]6[^0-9]' /tmp/parallel_joblog_signal && echo signal OK -#rm /tmp/parallel_joblog_exitval /tmp/parallel_joblog_signal +rm -f /tmp/parallel_joblog_exitval /tmp/parallel_joblog_signal diff --git a/testsuite/wanted-results/parallel-local150 b/testsuite/wanted-results/parallel-local150 index 0ebc784d..18a726de 100644 --- a/testsuite/wanted-results/parallel-local150 +++ b/testsuite/wanted-results/parallel-local150 @@ -1,3 +1,32 @@ +### bug #41565: Print happens in blocks - not after each job complete +The timing here is important: 2 3 4 5 6 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +300 ms jobs: +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 ### Test --tagstring echo 3 4 a3b a4b 3 4 diff --git a/testsuite/wanted-results/test30 b/testsuite/wanted-results/test30 index d8500251..67316aa7 100644 --- a/testsuite/wanted-results/test30 +++ b/testsuite/wanted-results/test30 @@ -19,6 +19,7 @@ Computers / CPU cores / Max jobs to run Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete local:1/0/100%/0.0s 1 2 + ETA: 0s Left: 0 AVG: 0.00s local:0/1/100%/1.0s ### --timeout --onall on remote machines: 2*slept 1, 2 jobs failed slept 1 slept 1