Fix sporadic callout test failures

Related: rhbz#1999686
This commit is contained in:
Eduardo Lima (Etrunko) 2021-12-01 23:28:20 -03:00
parent 0eba0eba01
commit 247d91f682
3 changed files with 105 additions and 1 deletions

View File

@ -0,0 +1,43 @@
From ff69f6c64b14282172716d4e97b4b81da7606483 Mon Sep 17 00:00:00 2001
From: Jonathon Jongsma <jjongsma@redhat.com>
Date: Wed, 1 Dec 2021 16:37:36 -0600
Subject: [PATCH 1/2] Report root error when a callout can't be executed
We were ignoring the error result when a callout script failed to
execute. In order to debug issues more easily, handle the error and
print it to the debug output.
Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
---
src/callouts.rs | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/callouts.rs b/src/callouts.rs
index 1c92d85..17b733b 100644
--- a/src/callouts.rs
+++ b/src/callouts.rs
@@ -240,8 +240,8 @@ impl Callout {
for s in dir.as_ref().read_dir().ok()? {
let path = s.ok()?.path();
- match self.invoke_script(dev, &path, event, action).ok() {
- Some(res) => {
+ match self.invoke_script(dev, &path, event, action) {
+ Ok(res) => {
if res.status.code().is_none() {
warn!("callout script {:?} was terminated by a signal", path);
continue;
@@ -255,8 +255,8 @@ impl Callout {
);
}
}
- _ => {
- debug!("failed to execute callout script {:?}", path);
+ Err(e) => {
+ debug!("failed to execute callout script {:?}: {:?}", path, e);
continue;
}
}
--
2.33.1

View File

@ -0,0 +1,57 @@
From 70ba0298a49ccffc085da051ad553a1242f0bfe1 Mon Sep 17 00:00:00 2001
From: Jonathon Jongsma <jjongsma@redhat.com>
Date: Wed, 1 Dec 2021 16:39:06 -0600
Subject: [PATCH 2/2] tests: read stdin in callout test scripts
Callout scripts are intended to be passed a JSON device configuration
string on stdin. For our simple callout tests, we used single-line
test scripts that unconditionally returned a constant response code
(either error or success). This sometimes causes the tests to fail due
to the following error:
[2021-12-01T20:33:25Z DEBUG mdevctl::callouts] failed to execute callout script "/tmp/mdevctl-testZg8CPd/etc/mdevctl.d/scripts.d/callouts/rc1.sh": Failed to write to stdin of command
Caused by:
Broken pipe (os error 32)
What seems to be happening is that mdevctl spawns the callout script and
then attempts to write the JSON device configuration to its stdin pipe.
However, the test scripts are so short that they may have exited before
mdevctl can finish writing to stdin, which results in the command
failing with a broken pipe error. In order to avoid this, make sure that
the test scripts read from stdin before exiting.
Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
---
tests/callouts/rc0.sh | 1 +
tests/callouts/rc1.sh | 1 +
tests/callouts/rc2.sh | 1 +
3 files changed, 3 insertions(+)
diff --git a/tests/callouts/rc0.sh b/tests/callouts/rc0.sh
index 039e4d0..669d0ec 100755
--- a/tests/callouts/rc0.sh
+++ b/tests/callouts/rc0.sh
@@ -1,2 +1,3 @@
#!/usr/bin/env bash
+json=$(</dev/stdin)
exit 0
diff --git a/tests/callouts/rc1.sh b/tests/callouts/rc1.sh
index ecdbef9..3863171 100755
--- a/tests/callouts/rc1.sh
+++ b/tests/callouts/rc1.sh
@@ -1,2 +1,3 @@
#!/usr/bin/env bash
+json=$(</dev/stdin)
exit 1
diff --git a/tests/callouts/rc2.sh b/tests/callouts/rc2.sh
index 5c66540..f2ec274 100755
--- a/tests/callouts/rc2.sh
+++ b/tests/callouts/rc2.sh
@@ -1,2 +1,3 @@
#!/usr/bin/env bash
+json=$(</dev/stdin)
exit 2
--
2.33.1

View File

@ -13,11 +13,15 @@ Source1: https://github.com/mdevctl/mdevctl/archive/%{version}/%{name}-%{version
ExclusiveArch: %{rust_arches}
BuildRequires: bash
BuildRequires: git
BuildRequires: make
BuildRequires: systemd
BuildRequires: rust-toolset
Requires(post,postun): %{_sbindir}/udevadm
Patch0: 0001-Report-root-error-when-a-callout-can-t-be-executed.patch
Patch1: 0002-tests-read-stdin-in-callout-test-scripts.patch
%description
mdevctl is a utility for managing and persisting devices in the
mediated device device framework of the Linux kernel. Mediated
@ -26,7 +30,7 @@ can be dynamically created and potentially used by drivers like
vfio-mdev for assignment to virtual machines.
%prep
%setup -q -n %{name}-%{version}
%autosetup -S git_am -n %{name}-%{version}
%cargo_prep -V 1
%build