Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package openQA for openSUSE:Factory checked in at 2025-12-17 17:34:20 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/openQA (Old) and /work/SRC/openSUSE:Factory/.openQA.new.1939 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openQA" Wed Dec 17 17:34:20 2025 rev:786 rq:1323169 version:5.1765887110.8fc02990 Changes: -------- --- /work/SRC/openSUSE:Factory/openQA/openQA.changes 2025-12-16 16:00:51.474469853 +0100 +++ /work/SRC/openSUSE:Factory/.openQA.new.1939/openQA.changes 2025-12-17 17:38:40.345458661 +0100 @@ -1,0 +2,7 @@ +Tue Dec 16 15:12:03 UTC 2025 - [email protected] + +- Update to version 5.1765887110.8fc02990: + * Avoid partial deletion of a screenshot if Minion job is aborted + * Add `SignalBlocker` to delay signal handling during critical sections + +------------------------------------------------------------------- Old: ---- openQA-5.1765805960.2112d43d.obscpio New: ---- openQA-5.1765887110.8fc02990.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ openQA-client-test.spec ++++++ --- /var/tmp/diff_new_pack.QM7l8Z/_old 2025-12-17 17:38:42.977569280 +0100 +++ /var/tmp/diff_new_pack.QM7l8Z/_new 2025-12-17 17:38:42.977569280 +0100 @@ -1,7 +1,7 @@ # # spec file for package openQA-client-test # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %define short_name openQA-client Name: %{short_name}-test -Version: 5.1765805960.2112d43d +Version: 5.1765887110.8fc02990 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-devel-test.spec ++++++ --- /var/tmp/diff_new_pack.QM7l8Z/_old 2025-12-17 17:38:43.041571970 +0100 +++ /var/tmp/diff_new_pack.QM7l8Z/_new 2025-12-17 17:38:43.045572137 +0100 @@ -1,7 +1,7 @@ # # spec file for package openQA-devel-test # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %define short_name openQA-devel Name: %{short_name}-test -Version: 5.1765805960.2112d43d +Version: 5.1765887110.8fc02990 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-test.spec ++++++ --- /var/tmp/diff_new_pack.QM7l8Z/_old 2025-12-17 17:38:43.113574996 +0100 +++ /var/tmp/diff_new_pack.QM7l8Z/_new 2025-12-17 17:38:43.125575500 +0100 @@ -1,7 +1,7 @@ # # spec file for package openQA-test # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %define short_name openQA Name: %{short_name}-test -Version: 5.1765805960.2112d43d +Version: 5.1765887110.8fc02990 Release: 0 Summary: Test package for openQA License: GPL-2.0-or-later ++++++ openQA-worker-test.spec ++++++ --- /var/tmp/diff_new_pack.QM7l8Z/_old 2025-12-17 17:38:43.173577517 +0100 +++ /var/tmp/diff_new_pack.QM7l8Z/_new 2025-12-17 17:38:43.181577853 +0100 @@ -1,7 +1,7 @@ # # spec file for package openQA-worker-test # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %define short_name openQA-worker Name: %{short_name}-test -Version: 5.1765805960.2112d43d +Version: 5.1765887110.8fc02990 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA.spec ++++++ --- /var/tmp/diff_new_pack.QM7l8Z/_old 2025-12-17 17:38:43.225579702 +0100 +++ /var/tmp/diff_new_pack.QM7l8Z/_new 2025-12-17 17:38:43.233580039 +0100 @@ -1,7 +1,7 @@ # # spec file for package openQA # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright 2018-2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -12,10 +12,10 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via https://bugs.opensuse.org/ +# Please submit bugfixes or comments via http://bugs.opensuse.org/ # - +# can't use linebreaks here! %define openqa_main_service openqa-webui.service %define openqa_extra_services openqa-gru.service openqa-websockets.service openqa-scheduler.service openqa-enqueue-audit-event-cleanup.service openqa-enqueue-audit-event-cleanup.timer openqa-enqueue-asset-cleanup.service openqa-enqueue-git-auto-update.service openqa-enqueue-asset-cleanup.timer openqa-enqueue-result-cleanup.service openqa-enqueue-result-cleanup.timer openqa-enqueue-bug-cleanup.service openqa-enqueue-bug-cleanup.timer openqa-enqueue-git-auto-update.timer openqa-enqueue-needle-ref-cleanup.service openqa-enqueue-needle-ref-cleanup.timer openqa-enqueue-scheduled-product-cleanup.service openqa-enqueue-scheduled-product-cleanup.timer %define openqa_services %{openqa_main_service} %{openqa_extra_services} @@ -99,11 +99,11 @@ %define devel_requires %devel_no_selenium_requires chromedriver Name: openQA -Version: 5.1765805960.2112d43d +Version: 5.1765887110.8fc02990 Release: 0 Summary: The openQA web-frontend, scheduler and tools License: GPL-2.0-or-later -URL: http://os-autoinst.github.io/openQA/ +Url: http://os-autoinst.github.io/openQA/ Source0: %{name}-%{version}.tar.xz Source2: node_modules.spec.inc %include %{_sourcedir}/node_modules.spec.inc @@ -113,10 +113,10 @@ BuildRequires: %{build_requires} BuildRequires: apparmor-rpm-macros BuildRequires: local-npm-registry +Requires: perl(Minion) >= 10.0 Requires: %{main_requires} Requires: openQA-client = %{version} Requires: openQA-common = %{version} -Requires: perl(Minion) >= 10.0 # we need to have the same sha1 as expected %requires_eq perl-Mojolicious-Plugin-AssetPack Recommends: %{name}-local-db @@ -225,8 +225,8 @@ %package client Summary: Client tools for remote openQA management -Requires: %client_requires Requires: openQA-common = %{version} +Requires: %client_requires %description client Tools and support files for openQA client script. Client script is @@ -256,8 +256,8 @@ Summary: Convenience package for a single-instance setup using apache proxy Provides: %{name}-single-instance-apache Provides: %{name}-single-instance-apache2 -Requires: %{name} = %{version} Requires: %{name}-local-db +Requires: %{name} = %{version} Requires: %{name}-worker = %{version} Requires: apache2 @@ -266,8 +266,8 @@ %package single-instance-nginx Summary: Convenience package for a single-instance setup using nginx proxy -Requires: %{name} = %{version} Requires: %{name}-local-db +Requires: %{name} = %{version} Requires: %{name}-worker = %{version} Requires: nginx @@ -315,9 +315,9 @@ %if %{with munin_package} %package munin Summary: Munin scripts -Requires: curl Requires: munin Requires: munin-node +Requires: curl Requires: perl %description munin @@ -325,6 +325,7 @@ statistics. %endif + %prep %setup -q sed -e 's,/bin/env python,/bin/python,' -i script/openqa-label-all @@ -440,7 +441,6 @@ %if 0%{?suse_version} > 1500 %pre -f %{name}.pre %else - %pre if ! getent passwd geekotest > /dev/null; then %{_sbindir}/useradd -r -g nogroup -c "openQA user" \ @@ -467,7 +467,6 @@ %if 0%{?suse_version} > 1500 %pre worker -f openQA-worker.pre %else - %pre worker if ! getent passwd _openqa-worker > /dev/null; then %{_sbindir}/useradd -r -g nogroup -c "openQA worker" \ ++++++ openQA-5.1765805960.2112d43d.obscpio -> openQA-5.1765887110.8fc02990.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1765805960.2112d43d/lib/OpenQA/ScreenshotDeletion.pm new/openQA-5.1765887110.8fc02990/lib/OpenQA/ScreenshotDeletion.pm --- old/openQA-5.1765805960.2112d43d/lib/OpenQA/ScreenshotDeletion.pm 2025-12-15 14:39:20.000000000 +0100 +++ new/openQA-5.1765887110.8fc02990/lib/OpenQA/ScreenshotDeletion.pm 2025-12-16 13:11:50.000000000 +0100 @@ -7,6 +7,7 @@ use File::Basename qw(basename dirname); use File::Spec::Functions qw(catfile); use OpenQA::Log qw(log_debug); +use OpenQA::SignalBlocker; use OpenQA::Utils qw(imagesdir); use Feature::Compat::Try; @@ -30,6 +31,9 @@ # note: This might fail due to foreign key violation because a new screenshot link might # have just been created. In this case the screenshot should not be deleted in the # database or the file system. + # Using OpenQA::SignalBlocker to delay handling cancellation signals to avoid doing + # only some of the deletions if the Minion job is aborted. + my $signal_blocker = OpenQA::SignalBlocker->new; try { $self->{_deletion_query}->execute($screenshot_id) } catch ($e) { return undef } # keep track of the deleted size diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1765805960.2112d43d/lib/OpenQA/SignalBlocker.pm new/openQA-5.1765887110.8fc02990/lib/OpenQA/SignalBlocker.pm --- old/openQA-5.1765805960.2112d43d/lib/OpenQA/SignalBlocker.pm 1970-01-01 01:00:00.000000000 +0100 +++ new/openQA-5.1765887110.8fc02990/lib/OpenQA/SignalBlocker.pm 2025-12-16 13:11:50.000000000 +0100 @@ -0,0 +1,35 @@ +# Copyright SUSE LLC +# SPDX-License-Identifier: GPL-2.0-or-later + +package OpenQA::SignalBlocker; +use Mojo::Base -base, -signatures; +use Scalar::Util qw(weaken); + +my @SIGNALS = qw(TERM INT QUIT); + +# delays execution of signal handlers while an instance exists +sub new ($class, @attributes) { + my $self = $class->SUPER::new(@attributes); + $self->{_fired_signals} = []; + $self->{_blocked_handlers} = {map { ($_ => $SIG{$_}) } @SIGNALS}; + + # assign closure to global signal handlers using a weak reference to $self so DESTROY will still run + my $self_weak = $self; + weaken $self_weak; + my $handler = sub ($signal) { push @{$self_weak->{_fired_signals}}, $signal }; + $SIG{$_} = $handler for @SIGNALS; + return $self; +} + +sub DESTROY ($self) { + my $blocked_handlers = $self->{_blocked_handlers}; + $SIG{$_} = $blocked_handlers->{$_} for @SIGNALS; + + # execute signals that have fired while the blocker was present + for my $signal (@{$self->{_fired_signals}}) { + next unless my $handler = $blocked_handlers->{$signal}; + $handler->($signal) unless $handler eq 'IGNORE'; + } +} + +1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1765805960.2112d43d/lib/OpenQA/Task/SignalGuard.pm new/openQA-5.1765887110.8fc02990/lib/OpenQA/Task/SignalGuard.pm --- old/openQA-5.1765805960.2112d43d/lib/OpenQA/Task/SignalGuard.pm 2025-12-15 14:39:20.000000000 +0100 +++ new/openQA-5.1765887110.8fc02990/lib/OpenQA/Task/SignalGuard.pm 2025-12-16 13:11:50.000000000 +0100 @@ -34,6 +34,7 @@ sub _handle_signal ($self_weak, $signal) { # abort job if the corresponding flag is set + return undef unless $self_weak; my $job = $self_weak->{_job}; if ($self_weak->abort) { $job->note(signal_handler => "Received signal $signal, aborting"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1765805960.2112d43d/t/16-utils.t new/openQA-5.1765887110.8fc02990/t/16-utils.t --- old/openQA-5.1765805960.2112d43d/t/16-utils.t 2025-12-15 14:39:20.000000000 +0100 +++ new/openQA-5.1765887110.8fc02990/t/16-utils.t 2025-12-16 13:11:50.000000000 +0100 @@ -23,12 +23,14 @@ use lib "$FindBin::Bin/lib", "$FindBin::Bin/../external/os-autoinst-common/lib"; use OpenQA::Utils (qw(:DEFAULT prjdir sharedir resultdir assetdir imagesdir base_host random_string random_hex), qw(download_rate download_speed usleep_backoff)); +use OpenQA::SignalBlocker; use OpenQA::Task::SignalGuard; use OpenQA::Test::TimeLimit '10'; use Scalar::Util 'reftype'; use Test::MockObject; use Test::MockModule; use Mojo::File qw(path tempdir tempfile); +use Mojo::Util qw(scope_guard); subtest 'service ports' => sub { local $ENV{OPENQA_BASE_PORT} = undef; @@ -495,6 +497,32 @@ is $SIG{TERM}, $current_term_handler, 'SIGTERM handler restored after signal guard goes out of scope'; is $SIG{INT}, $current_int_handler, 'SIGINT handler restored after signal guard goes out of scope'; +subtest 'signal blocker' => sub { + my $restore_signals = scope_guard sub { + $SIG{TERM} = $current_term_handler; + $SIG{TERM} = $current_int_handler; + }; + + my $sigterm_handled = 0; + my $sigint_handled = 0; + my $sigterm_handler = sub { ++$sigterm_handled }; + my $sigint_handler = sub { ++$sigint_handled }; + $SIG{TERM} = $sigterm_handler; + $SIG{INT} = $sigint_handler; + + my $blocker = OpenQA::SignalBlocker->new; + kill $_ => $$ for qw(INT TERM); + is $sigterm_handled, 0, 'SIGTERM handler has not been called while $blocker still present'; + is $sigint_handled, 0, 'SIGINT handler has not been called while $blocker still present'; + + undef $blocker; + is $sigterm_handled, 1, 'SIGTERM handler has been called after $blocker was destroyed'; + is $sigint_handled, 1, 'SIGINT handler has been called after $blocker was destroyed'; + + is $SIG{TERM}, $sigterm_handler, 'SIGTERM handler was restored after $blocker was destroyed'; + is $SIG{INT}, $sigint_handler, 'SIGINT handler was restored after $blocker was destroyed'; +}; + subtest 'human readable size' => sub { is(human_readable_size(0), '0 Byte', 'zero'); is(human_readable_size(1), '1 Byte', 'one'); ++++++ openQA.obsinfo ++++++ --- /var/tmp/diff_new_pack.QM7l8Z/_old 2025-12-17 17:39:07.014579476 +0100 +++ /var/tmp/diff_new_pack.QM7l8Z/_new 2025-12-17 17:39:07.054581157 +0100 @@ -1,5 +1,5 @@ name: openQA -version: 5.1765805960.2112d43d -mtime: 1765805960 -commit: 2112d43d5f5e9f9bb32e20b6468f6275daefa250 +version: 5.1765887110.8fc02990 +mtime: 1765887110 +commit: 8fc02990d191051d7fd201ea553ee3112c911efd
