Skip to content

Commit 9a0c8b4

Browse files
committed
1 parent 20f899c commit 9a0c8b4

40 files changed

+363
-288
lines changed

lib/OpenQA/Assets.pm

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use Mojo::File qw(path);
1111
use Mojo::Home;
1212
use Mojolicious::Plugin::AssetPack;
1313
use YAML::PP qw(LoadFile);
14+
use Feature::Compat::Try;
1415

1516
sub setup ($server) {
1617
# setup asset pack, note that the config file is shared with tools/generate-packed-assets
@@ -21,14 +22,14 @@ sub setup ($server) {
2122

2223
# -> read assets/assetpack.def
2324
local $SIG{CHLD};
24-
eval { $server->asset->process };
25-
if (my $assetpack_error = $@) { # uncoverable statement
26-
$assetpack_error # uncoverable statement
25+
try { $server->asset->process }
26+
catch ($e) {
27+
$e # uncoverable statement
2728
.= 'If you invoked this service for development (from a Git checkout) you probably just need to'
2829
. ' invoke "make node_modules" before running this service. If you invoked this service via a packaged binary/service'
2930
. " then there is probably a problem with the packaging.\n"
30-
if $assetpack_error =~ qr/could not find input asset.*node_modules/i; # uncoverable statement
31-
die $assetpack_error; # uncoverable statement
31+
if $e =~ qr/could not find input asset.*node_modules/i; # uncoverable statement
32+
die $e; # uncoverable statement
3233
}
3334
}
3435

lib/OpenQA/CacheService/Model/Cache.pm

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
package OpenQA::CacheService::Model::Cache;
55
use Mojo::Base -base, -signatures;
6+
use Feature::Compat::Try;
67

78
use Carp 'croak';
89
use Capture::Tiny 'capture_merged';
@@ -13,6 +14,7 @@ use OpenQA::Downloader;
1314
use Mojo::File 'path';
1415
use Mojo::Util 'scope_guard';
1516
use Time::HiRes qw(gettimeofday);
17+
use Feature::Compat::Try;
1618

1719
# Only consider files larger than 250 MB for metrics (rates for smaller files are unrealistic)
1820
use constant METRICS_DOWNLOAD_SIZE => $ENV{OPENQA_METRICS_DOWNLOAD_SIZE} // 262144000;
@@ -46,14 +48,14 @@ sub repair_database ($self, $db_file = $self->_locate_db_file) {
4648
# perform integrity check and test migration; try to provoke an error
4749
my $log = $self->log;
4850
$log->debug("Testing sqlite database ($db_file)");
49-
eval {
51+
try {
5052
die "database integrity check failed\n" if $self->_check_database_integrity;
5153
$self->sqlite->migrations->migrate;
52-
};
54+
}
5355

5456
# remove broken database
55-
if (my $err = $@) {
56-
$log->error("Database has been corrupted: $err");
57+
catch ($e) {
58+
$log->error("Database has been corrupted: $e");
5759
$log->error('Killing processes accessing the database file handles and removing database');
5860
$self->_kill_db_accessing_processes("'$db_file'*");
5961
}
@@ -158,15 +160,15 @@ sub asset ($self, $asset) {
158160
}
159161

160162
sub track_asset ($self, $asset) {
161-
eval {
163+
try {
162164
my $db = $self->sqlite->db;
163165
my $tx = $db->begin('exclusive');
164166
my $sql = "INSERT INTO assets (filename, size, last_use) VALUES (?, 0, strftime('%s','now'))"
165167
. 'ON CONFLICT (filename) DO UPDATE SET pending=1';
166168
$db->query($sql, $asset);
167169
$tx->commit;
168-
};
169-
if (my $err = $@) { $self->log->error("Tracking asset failed: $err") }
170+
}
171+
catch ($e) { $self->log->error("Tracking asset failed: $e") }
170172
}
171173

172174
sub metrics ($self) {
@@ -270,8 +272,9 @@ sub _exceeds_limit ($self, $needed) {
270272
return 1 if $self->{cache_real_size} + $needed > $limit;
271273
}
272274
if (my $min_free_percentage = $self->min_free_percentage) {
273-
my ($available_bytes, $total_bytes) = eval { check_df $self->location };
274-
if (my $error = $@) { chomp $error; $self->log->error($error); return 0 }
275+
my ($available_bytes, $total_bytes);
276+
try { ($available_bytes, $total_bytes) = check_df $self->location }
277+
catch ($e) { chomp $e; $self->log->error($e); return 0 }
275278
return 1 if ($available_bytes - $needed) / $total_bytes * 100 < $min_free_percentage;
276279
}
277280
return 0;
@@ -287,7 +290,7 @@ sub _check_limits ($self, $needed, $to_preserve = undef) {
287290
my $limit_size = human_readable_size($limit);
288291
$log->info(
289292
"Cache size $cache_size + needed $needed_size exceeds limit of $limit_size, purging least used assets");
290-
eval {
293+
try {
291294
my $results
292295
= $self->sqlite->db->select('assets', [qw(filename size last_use)], {pending => '0'},
293296
{-asc => 'last_use'});
@@ -300,22 +303,22 @@ sub _check_limits ($self, $needed, $to_preserve = undef) {
300303
$self->_decrease($asset_size) if $self->purge_asset($filename);
301304
last if !$self->_exceeds_limit($needed);
302305
}
303-
};
304-
if (my $err = $@) { $log->error("Checking cache limit failed: $err") }
306+
}
307+
catch ($e) { $log->error("Checking cache limit failed: $e") }
305308
}
306309
}
307310

308311
sub _delete_pending_assets ($self) {
309312
my $log = $self->log;
310-
eval {
313+
try {
311314
my $results = $self->sqlite->db->select('assets', [qw(filename pending)], {pending => '1'});
312315
for my $asset ($results->hashes->each) {
313316
my $filename = $asset->{filename};
314317
$log->info(qq{Purging "$filename" because it appears pending after service startup});
315318
$self->purge_asset($filename);
316319
}
317-
};
318-
if (my $err = $@) { $log->error("Checking for pending leftovers failed: $err") }
320+
}
321+
catch ($e) { $log->error("Checking for pending leftovers failed: $e") }
319322
}
320323

321324
1;

lib/OpenQA/CacheService/Model/Downloads.pm

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
package OpenQA::CacheService::Model::Downloads;
55
use Mojo::Base -base, -signatures;
6-
6+
use Feature::Compat::Try;
77
use Carp 'croak';
88

99
# Two days
@@ -12,7 +12,7 @@ use constant CLEANUP_AFTER => 172800;
1212
has 'cache';
1313

1414
sub add ($self, $lock, $job_id) {
15-
eval {
15+
try {
1616
my $db = $self->cache->sqlite->db;
1717
my $tx = $db->begin('exclusive');
1818

@@ -21,8 +21,8 @@ sub add ($self, $lock, $job_id) {
2121
$db->insert('downloads', {lock => $lock, job_id => $job_id});
2222

2323
$tx->commit;
24-
};
25-
if (my $err = $@) { croak "Couldn't add download: $err" }
24+
}
25+
catch ($e) { croak "Couldn't add download: $e" }
2626
}
2727

2828
sub find ($self, $lock) {

lib/OpenQA/Client/Upload.pm

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use OpenQA::File;
88
use Carp qw(croak);
99
use Mojo::Asset::Memory;
1010
use Mojo::File qw(path);
11+
use Feature::Compat::Try;
1112

1213
sub _upload_asset_fail ($self, $uri, $form) {
1314
$form->{state} = 'fail';
@@ -57,7 +58,7 @@ sub asset ($self, $job_id, $opts) {
5758
do {
5859
$retries-- if $retries > 0;
5960
my $tx;
60-
eval {
61+
try {
6162
my $form = {
6263
file => {filename => $file_name, file => Mojo::Asset::Memory->new->add_chunk($part->serialize)},
6364
asset => $opts->{asset},
@@ -69,10 +70,10 @@ sub asset ($self, $job_id, $opts) {
6970
my $json = $tx->res->json;
7071
$done = 1 if $json && $json->{status} && $json->{status} eq 'ok';
7172
}
72-
};
73-
if (my $error = $@) {
74-
$self->emit('upload_chunk.request_err', $tx, $error);
75-
$final_error = $error;
73+
}
74+
catch ($e) {
75+
$self->emit('upload_chunk.request_err', $tx, $e);
76+
$final_error = $e;
7677
}
7778

7879
unless ($done) {

lib/OpenQA/Downloader.pm

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use Mojo::URL;
1010
use OpenQA::UserAgent;
1111
use OpenQA::Utils 'human_readable_size';
1212
use Time::HiRes 'sleep';
13+
use Feature::Compat::Try;
1314

1415
has attempts => 5;
1516
has [qw(log tmpdir)];
@@ -48,7 +49,8 @@ sub _extract_asset ($self, $to_extract, $target) {
4849
my $cmd;
4950
if ($to_extract =~ qr/\.tar(\..*)?/) {
5051
# invoke bsdtar to extract (compressed) tar archives
51-
eval { $target->make_path } or return $@;
52+
try { $target->make_path }
53+
catch ($e) { return $e }
5254
$cmd = "bsdtar -x --directory '$target' -f '$to_extract' 2>&1";
5355
}
5456
else {
@@ -113,7 +115,8 @@ sub _get ($self, $url, $target, $options) {
113115
if ($err) {
114116
$ret = $code;
115117
$log->error(qq{Extracting "$tempfile" failed: $err});
116-
eval { $target->remove_tree } or $log->error("Unable to remove leftovers after failed extraction: $@");
118+
try { $target->remove_tree }
119+
catch ($e) { $log->error("Unable to remove leftovers after failed extraction: $e") }
117120
}
118121
}
119122
else { $asset->move_to($target) }

lib/OpenQA/Git.pm

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use Cwd 'abs_path';
99
use Mojo::File 'path';
1010
use OpenQA::Utils qw(run_cmd_with_log_return_error run_cmd_with_log);
1111
use OpenQA::App;
12+
use Feature::Compat::Try;
1213

1314
has 'app';
1415
has 'dir';
@@ -180,8 +181,11 @@ sub cache_ref ($self, $ref, $url, $relative_path, $output_file, $allow_arbitrary
180181
# checkout git versioned file <$relative_path> of from repo at version <$ref> and write it to <$output_file>
181182
# returns undef on success - else the error message
182183
if (-f $output_file) {
183-
eval { path($output_file)->touch };
184-
return $@ ? $@ : undef;
184+
try {
185+
path($output_file)->touch;
186+
return undef;
187+
}
188+
catch ($e) { return $e }
185189
}
186190

187191
$self->app->log->debug(

lib/OpenQA/JobSettings.pm

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use Mojo::URL;
1010
use Mojo::Util 'url_unescape';
1111
use OpenQA::Log 'log_debug';
1212
use OpenQA::Utils qw(asset_type_from_setting get_url_short);
13+
use Feature::Compat::Try;
1314

1415
sub generate_settings ($params) {
1516
my $settings = $params->{settings};
@@ -56,10 +57,10 @@ sub expand_placeholders ($settings, $on_web_ui = 1) {
5657
for my $value (values %$settings) {
5758
next unless defined $value;
5859
my %visited_placeholders;
59-
eval {
60+
try {
6061
$value =~ s/(%+)(\w+)(%+)/_expand_placeholder($settings, $2, $1, $3, \%visited_placeholders, $on_web_ui)/eg;
61-
};
62-
return "Error: $@" if $@;
62+
}
63+
catch ($e) { return "Error: $e" }
6364
}
6465
return undef;
6566
}

lib/OpenQA/Log.pm

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use OpenQA::App;
1515
use Time::Moment;
1616
use File::Spec::Functions 'catfile';
1717
use Sys::Hostname;
18+
use Feature::Compat::Try;
1819

1920
our $VERSION = '0.0.1';
2021
our @EXPORT_OK = qw(
@@ -116,8 +117,11 @@ sub _log_via_mojo_app ($level, $msg) {
116117
}
117118

118119
sub _try_logging_to_channel ($level, $msg, $channel) {
119-
eval { $channel->$level($msg); };
120-
return ($@ ? 0 : 1);
120+
try {
121+
$channel->$level($msg);
122+
return 1
123+
}
124+
catch ($e) { return 0 }
121125
}
122126

123127
sub _log_to_stderr_or_stdout ($level, $msg) {

lib/OpenQA/Parser.pm

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use constant DATA_FIELD => '__data__';
1919
use constant TYPE_FIELD => '__type__';
2020
use OpenQA::Utils 'walker';
2121
use Exporter 'import';
22+
use Feature::Compat::Try;
2223

2324
our @EXPORT_OK = qw(parser p);
2425

@@ -40,8 +41,8 @@ sub _build_parser {
4041
if (my $e = load_class $parser_name) {
4142
croak ref $e ? "Exception: $e" : 'Parser not found!';
4243
}
43-
eval { $p_instance = $parser_name->new(@args); };
44-
croak "Invalid parser supplied: $@" if $@;
44+
try { $p_instance = $parser_name->new(@args); }
45+
catch ($e) { croak "Invalid parser supplied: $e" }
4546
}
4647
$p_instance;
4748
}
@@ -141,7 +142,7 @@ sub restore_el {
141142

142143
sub restore_tree_section {
143144
my $ref = shift;
144-
eval {
145+
try {
145146
walker $ref => sub {
146147
my ($key, $value, $keys) = @_;
147148
my $hash = $ref;
@@ -155,8 +156,8 @@ sub restore_tree_section {
155156
$hash->{$key} = restore_el($value) if reftype $hash eq 'HASH';
156157
$hash->[$key] = restore_el($value) if reftype $hash eq 'ARRAY';
157158
};
158-
};
159-
confess $@ if $@;
159+
}
160+
catch ($e) { confess $e }
160161
}
161162

162163
sub _load_tree {
@@ -165,21 +166,17 @@ sub _load_tree {
165166
my $tree = shift;
166167
my @coll = sort keys %{$tree};
167168

168-
{
169-
local $@;
170-
eval {
171-
foreach my $collection (@coll) {
172-
if (ref $tree->{$collection} eq 'ARRAY') {
173-
$self->$collection->add(restore_el($_)) for @{$tree->{$collection}};
174-
}
175-
else {
176-
$self->{$collection} = restore_el($tree->{$collection});
177-
}
169+
try {
170+
foreach my $collection (@coll) {
171+
if (ref $tree->{$collection} eq 'ARRAY') {
172+
$self->$collection->add(restore_el($_)) for @{$tree->{$collection}};
178173
}
179-
};
180-
confess "Failed parsing tree: $@" if $@;
174+
else {
175+
$self->{$collection} = restore_el($tree->{$collection});
176+
}
177+
}
181178
}
182-
179+
catch ($e) { confess "Failed parsing tree: $e" }
183180
return $self;
184181
}
185182

lib/OpenQA/Resource/Locks.pm

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use Mojo::Base -strict, -signatures;
66

77
use OpenQA::Jobs::Constants;
88
use OpenQA::Schema;
9+
use Feature::Compat::Try;
910

1011
my %final_states = map { $_ => 1 } OpenQA::Jobs::Constants::NOT_OK_RESULTS();
1112

@@ -94,8 +95,8 @@ sub barrier_create ($name = undef, $jobid = undef, $expected_jobs = undef) {
9495
return 0 if $barriers && $barriers->single;
9596
my $dbh = OpenQA::Schema->singleton->storage->dbh;
9697
my $sth = $dbh->prepare('INSERT INTO job_locks (name, owner, count) VALUES (?, ?, ?) ON CONFLICT DO NOTHING');
97-
eval { $sth->execute($name, $jobid, $expected_jobs) };
98-
die "Unable to create barrier for job $jobid with name '$name': $@" if $@;
98+
try { $sth->execute($name, $jobid, $expected_jobs) }
99+
catch ($e) { die "Unable to create barrier for job $jobid with name '$name': $e" }
99100
return $sth->rows > 0;
100101
}
101102

0 commit comments

Comments
 (0)