From bc431d9b640b89b049cd16992f1fce636f27c09b Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Mon, 29 Sep 2025 15:02:57 +0100 Subject: [PATCH] tests/regressions/rhbz790721.c: Remove this test This was a test for a 13 year old problem to do with problems launching libguestfs appliances in parallel. That problem does not affect current code. Testing build/launch of libguestfs appliances is a valuable thing to test. However we start libguestfs in parallel in both the current test suite and in higher level tools, and this test was dubious (and breaks with recent changes). Therefore remove the test. --- tests/Makefile.am | 16 --- tests/regressions/rhbz790721.c | 194 --------------------------------- 2 files changed, 210 deletions(-) delete mode 100644 tests/regressions/rhbz790721.c diff --git a/tests/Makefile.am b/tests/Makefile.am index 147c08ec8..f3c773cc8 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -617,7 +617,6 @@ TESTS += \ regressions/rhbz602997.sh \ regressions/rhbz690819.sh \ regressions/rhbz789960.sh \ - regressions/rhbz790721 \ regressions/rhbz811649.sh \ regressions/rhbz895904.sh \ regressions/rhbz914931 \ @@ -676,7 +675,6 @@ EXTRA_DIST += regressions/rhbz727178.sh check_PROGRAMS += \ regressions/rhbz501893 \ - regressions/rhbz790721 \ regressions/rhbz914931 \ regressions/rhbz1055452 \ regressions/test-big-heap @@ -693,20 +691,6 @@ regressions_rhbz501893_LDADD = \ $(top_builddir)/common/utils/libutils.la \ $(top_builddir)/lib/libguestfs.la -regressions_rhbz790721_SOURCES = regressions/rhbz790721.c -regressions_rhbz790721_CPPFLAGS = \ - -I$(top_srcdir)/gnulib/lib -I$(top_builddir)/gnulib/lib \ - -I$(top_srcdir)/common/utils -I$(top_builddir)/common/utils \ - -I$(top_srcdir)/lib -I$(top_builddir)/lib \ - -I$(top_srcdir)/include -regressions_rhbz790721_CFLAGS = \ - -pthread \ - $(WARN_CFLAGS) $(WERROR_CFLAGS) -regressions_rhbz790721_LDADD = \ - $(top_builddir)/common/utils/libutils.la \ - $(top_builddir)/lib/libguestfs.la \ - $(top_builddir)/gnulib/lib/libgnu.la - regressions_rhbz914931_SOURCES = regressions/rhbz914931.c regressions_rhbz914931_CPPFLAGS = \ -I$(top_srcdir)/gnulib/lib -I$(top_builddir)/gnulib/lib \ diff --git a/tests/regressions/rhbz790721.c b/tests/regressions/rhbz790721.c deleted file mode 100644 index bc69269fe..000000000 --- a/tests/regressions/rhbz790721.c +++ /dev/null @@ -1,194 +0,0 @@ -/* libguestfs - * Copyright (C) 2012 Red Hat Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -/* Regression test for RHBZ#790721. - * - * This bug involves locking issues when building the appliance in - * parallel from multiple threads in the same process. We use a read - * lock on the 'checksum' file, and it turns out this causes two - * problems: (1) locks don't have any effect on threads in the same - * process, and (2) because the PID is identical in different threads, - * the file we are trying to overwrite has the same name. - * - * To test this we want to create the appliance repeatedly from - * multiple threads, but we don't really care about launching the full - * qemu (a waste of time and memory for this test). Therefore replace - * qemu with a fake process and just look for the linking error. - */ - -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include "guestfs.h" -#include "guestfs-utils.h" - -#include "getprogname.h" - -/* Number of worker threads running the test. */ -#define NR_THREADS 20 - -static pthread_barrier_t barrier; -static void *start_thread (void *); - -int -main (int argc, char *argv[]) -{ - pthread_t thread[NR_THREADS]; - int data[NR_THREADS]; - int i, r, errors; - guestfs_h *g; - char *backend; - - /* Test is only meaningful if the backend "direct" is used. */ - g = guestfs_create (); - if (!g) - error (EXIT_FAILURE, errno, "guestfs_create"); - backend = guestfs_get_backend (g); - if (backend == NULL) { - guestfs_close (g); - exit (EXIT_FAILURE); - } - if (STRNEQ (backend, "direct")) { - fprintf (stderr, "%s: test skipped because backend isn't 'direct'.\n", - getprogname ()); - free (backend); - guestfs_close (g); - exit (77); - } - free (backend); - guestfs_close (g); - - /* Ensure error messages are not translated. */ - setenv ("LC_ALL", "C", 1); - - pthread_barrier_init (&barrier, NULL, NR_THREADS); - - /* Create the other threads which will set up their own libguestfs - * handle then wait at a barrier before launching. - */ - for (i = 0; i < NR_THREADS; ++i) { - data[i] = i; - r = pthread_create (&thread[i], NULL, start_thread, &data[i]); - if (r != 0) - error (EXIT_FAILURE, r, "pthread_create"); - } - - /* Wait for the threads to exit. */ - errors = 0; - - for (i = 0; i < NR_THREADS; ++i) { - int *ret; - - r = pthread_join (thread[i], (void **) &ret); - if (r != 0) - error (EXIT_FAILURE, r, "pthread_join"); - if (*ret == -1) - errors++; - } - - exit (errors == 0 ? EXIT_SUCCESS : EXIT_FAILURE); -} - -static void * -start_thread (void *vi) -{ - guestfs_h *g; - int r, thread_id = *(int *)vi; - const char *error; - - g = guestfs_create (); - if (g == NULL) { - perror ("guestfs_create"); - *(int *)vi = -1; - pthread_exit (vi); - } - - if (guestfs_add_drive_opts (g, "/dev/null", - GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", - GUESTFS_ADD_DRIVE_OPTS_READONLY, 1, - -1) == -1) { - *(int *)vi = -1; - pthread_exit (vi); - } - - /* Fake out hypervisor. */ - if (guestfs_set_hv (g, TOOL_TRUE) == -1) { - *(int *)vi = -1; - pthread_exit (vi); - } - - /* Wait for the other threads to finish starting up. */ - r = pthread_barrier_wait (&barrier); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) { - fprintf (stderr, "pthread_barrier_wait: [thread %d]: %s\n", - thread_id, strerror (r)); - *(int *)vi = -1; - pthread_exit (vi); - } - - /* Launch the handle. Because of the faked out qemu, we expect this - * will fail with "child process died unexpectedly". We are - * interested in other failures. - */ - guestfs_push_error_handler (g, NULL, NULL); - r = guestfs_launch (g); - error = guestfs_last_error (g); - - if (r == 0) { /* This should NOT happen. */ - fprintf (stderr, "rhbz790721: [thread %d]: " - "strangeness in test: expected launch to fail, but it didn't!\n", - thread_id); - *(int *)vi = -1; - pthread_exit (vi); - } - - if (error == NULL) { /* This also should NOT happen. */ - fprintf (stderr, "rhbz790721: [thread %d]: " - "strangeness in test: no error message!\n", - thread_id); - *(int *)vi = -1; - pthread_exit (vi); - } - - /* The error message should match the one printed by - * guestfs_int_launch_failed_error. If not, it indicates a bug/race - * in the appliance building code which is what this regression test - * is designed to spot. - */ - if (strstr (error, "guestfs_launch failed") == NULL) { - fprintf (stderr, "rhbz790721: [thread %d]: error: %s\n", thread_id, error); - *(int *)vi = -1; - pthread_exit (vi); - } - - guestfs_pop_error_handler (g); - - /* Close the handle. */ - guestfs_close (g); - - *(int *)vi = 0; - pthread_exit (vi); -}