]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test-sd-device: limit the number of iterations when testing device parent/child functions 37083/head
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 10 Apr 2025 11:51:21 +0000 (13:51 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 10 Apr 2025 11:59:27 +0000 (13:59 +0200)
The test "hangs" and times out on some arm64 machines. It actually works as
expected, but the machine has 2016 children under /sys/devices/system/memory/,
and the tests do a double loop over this, which is slow enough to hit the 120 s
limit. Add a limit on the number of iterations.

Another option would be to exclude "memory" subsystem. But we may have other
subsystems which have the same problem in the future, so I think it'll be more
robust to not try to limit the fix to a specific subsystem.

src/libsystemd/sd-device/test-sd-device.c

index d08e5914a29cc18c4b206def3b4494c3b3929b7a..85c3beb04fbb824bb9d28db697444732adb09b23 100644 (file)
@@ -480,12 +480,16 @@ static void check_parent_match(sd_device_enumerator *e, sd_device *dev) {
 
 TEST(sd_device_enumerator_add_match_parent) {
         _cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
+        /* Some devices have thousands of children. Avoid spending too much time in the double loop below. */
+        unsigned iterations = 200;
         int r;
 
         ASSERT_OK(sd_device_enumerator_new(&e));
         ASSERT_OK(sd_device_enumerator_allow_uninitialized(e));
         exclude_problematic_devices(e);
 
+        ASSERT_OK(sd_device_enumerator_add_match_subsystem(e, "memory", false));
+
         if (!slow_tests_enabled())
                 ASSERT_OK(sd_device_enumerator_add_match_subsystem(e, "block", true));
 
@@ -494,6 +498,9 @@ TEST(sd_device_enumerator_add_match_parent) {
                 const char *syspath;
                 sd_device *parent;
 
+                if (iterations-- == 0)
+                        break;
+
                 ASSERT_OK(sd_device_get_syspath(dev, &syspath));
 
                 r = sd_device_get_parent(dev, &parent);
@@ -559,6 +566,8 @@ TEST(sd_device_enumerator_add_all_parents) {
 
 TEST(sd_device_get_child) {
         _cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
+        /* Some devices have thousands of children. Avoid spending too much time in the double loop below. */
+        unsigned iterations = 3000;
         int r;
 
         ASSERT_OK(sd_device_enumerator_new(&e));
@@ -589,6 +598,9 @@ TEST(sd_device_get_child) {
                 FOREACH_DEVICE_CHILD_WITH_SUFFIX(parent, child, suffix) {
                         const char *s;
 
+                        if (iterations-- == 0)
+                                return;
+
                         ASSERT_NOT_NULL(child);
                         ASSERT_NOT_NULL(suffix);