Send notifications when evaluations start/finish/fail

* 'eval_started' has the format '<tmpId>\t<project>\t<jobset>'.

* 'eval_failed' has the format '<tmpId>'. (The cause of the error can
  be found in the database.)

* 'eval_added' has the format '<tmpId>:<evalId>'.
This commit is contained in:
Eelco Dolstra 2019-08-12 15:26:35 +02:00
parent 7114d2aceb
commit 976d88d675
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE

View file

@ -568,7 +568,7 @@ sub permute {
sub checkJobsetWrapped { sub checkJobsetWrapped {
my ($jobset) = @_; my ($jobset, $tmpId) = @_;
my $project = $jobset->project; my $project = $jobset->project;
my $jobsetsJobset = length($project->declfile) && $jobset->name eq ".jobsets"; my $jobsetsJobset = length($project->declfile) && $jobset->name eq ".jobsets";
my $inputInfo = {}; my $inputInfo = {};
@ -607,6 +607,7 @@ sub checkJobsetWrapped {
print STDERR $fetchError; print STDERR $fetchError;
txn_do($db, sub { txn_do($db, sub {
$jobset->update({ lastcheckedtime => time, fetcherrormsg => $fetchError }) if !$dryRun; $jobset->update({ lastcheckedtime => time, fetcherrormsg => $fetchError }) if !$dryRun;
$db->storage->dbh->do("notify eval_failed, ?", undef, join('\t', $tmpId));
}); });
return; return;
} }
@ -622,6 +623,7 @@ sub checkJobsetWrapped {
Net::Statsd::increment("hydra.evaluator.unchanged_checkouts"); Net::Statsd::increment("hydra.evaluator.unchanged_checkouts");
txn_do($db, sub { txn_do($db, sub {
$jobset->update({ lastcheckedtime => time, fetcherrormsg => undef }); $jobset->update({ lastcheckedtime => time, fetcherrormsg => undef });
$db->storage->dbh->do("notify eval_cached, ?", undef, join('\t', $tmpId));
}); });
return; return;
} }
@ -690,6 +692,9 @@ sub checkJobsetWrapped {
, nrbuilds => $jobsetChanged ? scalar(keys %buildMap) : undef , nrbuilds => $jobsetChanged ? scalar(keys %buildMap) : undef
}); });
$db->storage->dbh->do("notify eval_added, ?", undef,
join('\t', $tmpId, $ev->id));
if ($jobsetChanged) { if ($jobsetChanged) {
# Create JobsetEvalMembers mappings. # Create JobsetEvalMembers mappings.
while (my ($id, $x) = each %buildMap) { while (my ($id, $x) = each %buildMap) {
@ -767,10 +772,6 @@ sub checkJobsetWrapped {
Net::Statsd::increment("hydra.evaluator.evals"); Net::Statsd::increment("hydra.evaluator.evals");
Net::Statsd::increment("hydra.evaluator.cached_evals") unless $jobsetChanged; Net::Statsd::increment("hydra.evaluator.cached_evals") unless $jobsetChanged;
#while (my ($id, $x) = each %buildMap) {
# system("hydra-notify build-queued $id") if $x->{new};
#}
# Store the error messages for jobs that failed to evaluate. # Store the error messages for jobs that failed to evaluate.
my $msg = ""; my $msg = "";
foreach my $job (values %{$jobs}) { foreach my $job (values %{$jobs}) {
@ -788,8 +789,15 @@ sub checkJobset {
my $startTime = clock_gettime(CLOCK_MONOTONIC); my $startTime = clock_gettime(CLOCK_MONOTONIC);
# Add an ID to eval_* notifications so receivers can correlate
# them.
my $tmpId = "${startTime}.$$";
$db->storage->dbh->do("notify eval_started, ?", undef,
join('\t', $tmpId, $jobset->get_column('project'), $jobset->name));
eval { eval {
checkJobsetWrapped($jobset); checkJobsetWrapped($jobset, $tmpId);
}; };
my $checkError = $@; my $checkError = $@;
@ -802,6 +810,7 @@ sub checkJobset {
txn_do($db, sub { txn_do($db, sub {
$jobset->update({lastcheckedtime => time}); $jobset->update({lastcheckedtime => time});
setJobsetError($jobset, $checkError); setJobsetError($jobset, $checkError);
$db->storage->dbh->do("notify eval_failed, ?", undef, join('\t', $tmpId));
}) if !$dryRun; }) if !$dryRun;
$failed = 1; $failed = 1;
} }