[pve-devel] r5726 - pve-access-control/trunk/PVE
svn-commits at proxmox.com
svn-commits at proxmox.com
Fri Mar 18 11:20:36 CET 2011
Author: dietmar
Date: 2011-03-18 11:20:36 +0100 (Fri, 18 Mar 2011)
New Revision: 5726
Modified:
pve-access-control/trunk/PVE/RPCEnvironment.pm
Log:
archive finished tasks
Modified: pve-access-control/trunk/PVE/RPCEnvironment.pm
===================================================================
--- pve-access-control/trunk/PVE/RPCEnvironment.pm 2011-03-18 10:19:09 UTC (rev 5725)
+++ pve-access-control/trunk/PVE/RPCEnvironment.pm 2011-03-18 10:20:36 UTC (rev 5726)
@@ -38,7 +38,7 @@
$pri = 'err';
}
PVE::Cluster::log_msg($pri, $user, "end task $upid $msg");
- PVE::Cluster::broadcast_tasklist(active_workers());
+ PVE::Cluster::broadcast_tasklist(active_workers($upid));
};
my $worker_reaper = sub {
@@ -302,52 +302,86 @@
my $tasklist = PVE::INotify::read_file('active');
- if ($new_upid) {
- my $task = PVE::Tools::upid_decode($new_upid);
- $task->{upid} = $new_upid;
- push @$tasklist, $task;
- }
-
my @ta;
my $tlist = [];
my $thash = {}; # only list task once
- foreach my $task (@$tasklist) {
- my $upid = $task->{upid};
- next if $thash->{$upid};
- $thash->{$upid} = 1;
+ my $check_task = sub {
+ my ($task) = @_;
- if (-d "/proc/$task->{pid}") {
- my $pstart = PVE::ProcFSTools::read_proc_starttime($task->{pid});
- if ($pstart && ($pstart == $task->{pstart})) {
- push @$tlist, $task;
- } else {
- delete $task->{pid};
- push @ta, $task;
- }
+ my $pstart = PVE::ProcFSTools::read_proc_starttime($task->{pid});
+ if ($pstart && ($pstart == $task->{pstart})) {
+ print "RUNNING $task->{upid}\n";
+ push @$tlist, $task;
} else {
delete $task->{pid};
push @ta, $task;
}
delete $task->{pstart};
+ };
+
+ foreach my $task (@$tasklist) {
+ my $upid = $task->{upid};
+ next if $thash->{$upid};
+ $thash->{$upid} = $task;
+ &$check_task($task);
}
+ if ($new_upid) {
+ my $task = $thash->{$new_upid};
+ if (!$task) {
+ $task = PVE::Tools::upid_decode($new_upid);
+ $task->{upid} = $new_upid;
+ &$check_task($task);
+ }
+ }
+
@ta = sort { $b->{starttime} cmp $a->{starttime} } @ta;
+ my $save = defined($new_upid);
+
+ foreach my $task (@ta) {
+ next if $task->{endtime};
+ $task->{endtime} = time();
+ $task->{status} = PVE::Tools::upid_read_status($task->{upid});
+ $save = 1;
+ }
+
# we try to reduce the amount of data
# only list running tasks and task not older than 5 minutes
# try to limit to 25 tasks
my $ctime = time();
my $max = 25 - scalar(@$tlist);
- for (my $i = 0; $i < $max; $i++) {
- my $task = $ta[$i];
- last if !$task;
- next if ($ctime - $task->{starttime}) > 60*5;
- push @$tlist, $task;
+
+ my $archive = '';
+ foreach my $task (@ta) {
+ if (($max <= 0) || (($ctime - $task->{starttime}) > 60*5)) {
+ $archive .= sprintf("$task->{upid} %08X $task->{status}\n",
+ $task->{endtime});
+ $save = 1;
+ } else {
+ push @$tlist, $task;
+ $max--;
+ }
}
-
- PVE::INotify::write_file('active', $tlist) if $new_upid;
+ if ($archive) {
+ eval {
+ my $filename = "/var/log/pve/tasks/index";
+ my $fh = IO::File->new($filename, '>>', 0644) ||
+ die "unable to open file '$filename' - $!\n";
+ PVE::Tools::safe_print($filename, $fh, $archive);
+ close($fh) ||
+ die "unable to close file '$filename' - $!\n";
+ };
+ my $err = $@;
+ if ($err) {
+ syslog('err', $err);
+ $save = 0; # don't write changes
+ }
+ }
+ PVE::INotify::write_file('active', $tlist) if $save;
+
return $tlist;
};
@@ -377,9 +411,6 @@
local $SIG{PIPE} =
local $SIG{TERM} = 'IGNORE';
- my $wwwid = getpwnam('www-data') ||
- die "getpwnam failed";
-
my $starttime = time ();
my @psync = POSIX::pipe();
@@ -434,7 +465,7 @@
die "unable to redirect STDIN - $!"
if !open(STDIN, "</dev/null");
- $outfh = PVE::Tools::upid_open($upid, $wwwid) if !$sync;
+ $outfh = PVE::Tools::upid_open($upid) if !$sync;
# redirect STDOUT
$fd = fileno(STDOUT);
@@ -520,7 +551,7 @@
}
if ($sync) {
- $outfh = PVE::Tools::upid_open($upid, $wwwid);
+ $outfh = PVE::Tools::upid_open($upid);
}
};
my $err = $@;
@@ -593,6 +624,8 @@
kill (9, $cpid); # make sure it gets killed
}
+ close($outfh);
+
waitpid ($cpid, 0);
$res = $?;
&$log_task_result($upid, $user, $res);
More information about the pve-devel
mailing list