From 52843195dbd91efb822e4b2419a442f942673d59 Mon Sep 17 00:00:00 2001 From: Graham Christensen Date: Wed, 17 Nov 2021 12:34:50 -0500 Subject: [PATCH] RunCommandLogs: init table --- src/lib/Hydra/Schema/Result/Builds.pm | 19 ++- src/lib/Hydra/Schema/Result/RunCommandLogs.pm | 157 ++++++++++++++++++ src/sql/hydra.sql | 49 ++++++ src/sql/update-dbix.pl | 1 + 4 files changed, 224 insertions(+), 2 deletions(-) create mode 100644 src/lib/Hydra/Schema/Result/RunCommandLogs.pm diff --git a/src/lib/Hydra/Schema/Result/Builds.pm b/src/lib/Hydra/Schema/Result/Builds.pm index 081e6238..9f25ff7a 100644 --- a/src/lib/Hydra/Schema/Result/Builds.pm +++ b/src/lib/Hydra/Schema/Result/Builds.pm @@ -499,6 +499,21 @@ __PACKAGE__->belongs_to( { is_deferrable => 0, on_delete => "NO ACTION", on_update => "CASCADE" }, ); +=head2 runcommandlogs + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "runcommandlogs", + "Hydra::Schema::Result::RunCommandLogs", + { "foreign.build_id" => "self.id" }, + undef, +); + =head2 aggregates Type: many_to_many @@ -528,8 +543,8 @@ __PACKAGE__->many_to_many( ); -# Created by DBIx::Class::Schema::Loader v0.07049 @ 2021-08-26 12:02:36 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:WHdSVHhQykmUz0tR/TExVg +# Created by DBIx::Class::Schema::Loader v0.07049 @ 2021-11-17 12:42:34 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ylttv/NTMDcSZumBXRCOCw __PACKAGE__->has_many( "dependents", diff --git a/src/lib/Hydra/Schema/Result/RunCommandLogs.pm b/src/lib/Hydra/Schema/Result/RunCommandLogs.pm new file mode 100644 index 00000000..94bb0ec4 --- /dev/null +++ b/src/lib/Hydra/Schema/Result/RunCommandLogs.pm @@ -0,0 +1,157 @@ +use utf8; +package Hydra::Schema::Result::RunCommandLogs; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +=head1 NAME + +Hydra::Schema::Result::RunCommandLogs + +=cut + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + +=head1 COMPONENTS LOADED + +=over 4 + +=item * L + +=back + +=cut + +__PACKAGE__->load_components("+Hydra::Component::ToJSON"); + +=head1 TABLE: C + +=cut + +__PACKAGE__->table("runcommandlogs"); + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + sequence: 'runcommandlogs_id_seq' + +=head2 job_matcher + + data_type: 'text' + is_nullable: 0 + +=head2 build_id + + data_type: 'integer' + is_foreign_key: 1 + is_nullable: 0 + +=head2 command + + data_type: 'text' + is_nullable: 0 + +=head2 start_time + + data_type: 'integer' + is_nullable: 1 + +=head2 end_time + + data_type: 'integer' + is_nullable: 1 + +=head2 error_number + + data_type: 'integer' + is_nullable: 1 + +=head2 exit_code + + data_type: 'integer' + is_nullable: 1 + +=head2 signal + + data_type: 'integer' + is_nullable: 1 + +=head2 core_dumped + + data_type: 'boolean' + is_nullable: 1 + +=cut + +__PACKAGE__->add_columns( + "id", + { + data_type => "integer", + is_auto_increment => 1, + is_nullable => 0, + sequence => "runcommandlogs_id_seq", + }, + "job_matcher", + { data_type => "text", is_nullable => 0 }, + "build_id", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "command", + { data_type => "text", is_nullable => 0 }, + "start_time", + { data_type => "integer", is_nullable => 1 }, + "end_time", + { data_type => "integer", is_nullable => 1 }, + "error_number", + { data_type => "integer", is_nullable => 1 }, + "exit_code", + { data_type => "integer", is_nullable => 1 }, + "signal", + { data_type => "integer", is_nullable => 1 }, + "core_dumped", + { data_type => "boolean", is_nullable => 1 }, +); + +=head1 PRIMARY KEY + +=over 4 + +=item * L + +=back + +=cut + +__PACKAGE__->set_primary_key("id"); + +=head1 RELATIONS + +=head2 build + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "build", + "Hydra::Schema::Result::Builds", + { id => "build_id" }, + { is_deferrable => 0, on_delete => "CASCADE", on_update => "NO ACTION" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07049 @ 2021-11-18 12:35:52 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:N0G71diB8DNDgkYgaSQrFA + + + +# You can replace this text with custom code or comments, and it will be preserved on regeneration +1; diff --git a/src/sql/hydra.sql b/src/sql/hydra.sql index e172302b..bbb0b097 100644 --- a/src/sql/hydra.sql +++ b/src/sql/hydra.sql @@ -562,6 +562,55 @@ create table TaskRetries ( ); create index IndexTaskRetriesOrdered on TaskRetries(retry_at asc); + +-- Records of RunCommand executions +-- +-- The intended flow is: +-- +-- 1. Create a RunCommandLogs entry when the task is "queued" to run +-- 2. Update the start_time when it begins +-- 3. Update the end_time and exit_code when it completes +create table RunCommandLogs ( + id serial primary key not null, + job_matcher text not null, + build_id integer not null, + -- TODO: evaluation_id integer not null, + -- can we do this in a principled way? a build can be part of many evaluations + -- but a "bug" of RunCommand, imho, is that it should probably run per evaluation? + command text not null, + start_time integer, + end_time integer, + error_number integer, + exit_code integer, + signal integer, + core_dumped boolean, + + foreign key (build_id) references Builds(id) on delete cascade, + -- foreign key (evaluation_id) references Builds(id) on delete cascade, + + + constraint RunCommandLogs_not_started_no_exit_time_no_code check ( + -- If start time is null, then end_time, exit_code, signal, and core_dumped should be null. + -- A logical implication operator would be nice :). + (start_time is not null) or ( + end_time is null + and error_number is null + and exit_code is null + and signal is null + and core_dumped is null + ) + ), + constraint RunCommandLogs_end_time_has_start_time check ( + -- If end time is not null, then end_time, exit_code, and core_dumped should not be null + (end_time is null) or (start_time is not null) + ) + + -- Note: if exit_code is not null then signal and core_dumped must be null. + -- Similarly, if signal is not null then exit_code must be null and + -- core_dumped must not be null. However, these semantics are tricky + -- to encode as constraints and probably provide limited actual value. +); + -- The output paths that have permanently failed. create table FailedPaths ( path text primary key not null diff --git a/src/sql/update-dbix.pl b/src/sql/update-dbix.pl index 1cbdef21..695a4464 100644 --- a/src/sql/update-dbix.pl +++ b/src/sql/update-dbix.pl @@ -38,6 +38,7 @@ make_schema_at("Hydra::Schema", { "nrbuilds" => "NrBuilds", "projectmembers" => "ProjectMembers", "projects" => "Projects", + "runcommandlogs" => "RunCommandLogs", "schemaversion" => "SchemaVersion", "starredjobs" => "StarredJobs", "systemstatus" => "SystemStatus",