From 40911b66d441d473b6e4419b1d324f3a4b4ead34 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Fri, 20 Sep 2013 19:11:02 +0100 Subject: [PATCH] Remove existing OOM test impl The current OOM test impl is too inefficient to be used on the large test suites. It loops running 'main' multiple times, once for each alloc in the 'main' method. This has complexity 'n * (n + 1) / 2' in terms of total alloc count. It will be replaced by a more efficient impl whicih runs individual test cases instead. This will have same complexity but the values of 'n' will be much smaller, so a net win. Signed-off-by: Daniel P. Berrange --- tests/testutils.c | 188 ++++++---------------------------------------- 1 file changed, 22 insertions(+), 166 deletions(-) diff --git a/tests/testutils.c b/tests/testutils.c index 45882c5288..da69d53ab7 100644 --- a/tests/testutils.c +++ b/tests/testutils.c @@ -47,10 +47,6 @@ #include "virprocess.h" #include "virstring.h" -#if TEST_OOM_TRACE -# include -#endif - #ifdef HAVE_PATHS_H # include #endif @@ -68,7 +64,6 @@ static unsigned int testDebug = -1; static unsigned int testVerbose = -1; static unsigned int testExpensive = -1; -static unsigned int testOOM = 0; static size_t testCounter = 0; static size_t testStart = 0; static size_t testEnd = 0; @@ -151,10 +146,8 @@ virtTestRun(const char *title, int nloops, int (*body)(const void *data), const testCounter > testEnd)) return 0; - if (testOOM < 2) { - if (virTestGetVerbose()) - fprintf(stderr, "%2zu) %-65s ... ", testCounter, title); - } + if (virTestGetVerbose()) + fprintf(stderr, "%2zu) %-65s ... ", testCounter, title); if (nloops > 1 && (VIR_ALLOC_N(ts, nloops) < 0)) return -1; @@ -182,30 +175,28 @@ virtTestRun(const char *title, int nloops, int (*body)(const void *data), const ts[i] = DIFF_MSEC(&after, &before); } } - if (testOOM < 2) { - if (virTestGetVerbose()) { - if (ret == 0 && ts) - fprintf(stderr, "OK [%.5f ms]\n", - virtTestCountAverage(ts, nloops)); - else if (ret == 0) - fprintf(stderr, "OK\n"); - else if (ret == EXIT_AM_SKIP) - fprintf(stderr, "SKIP\n"); - else - fprintf(stderr, "FAILED\n"); - } else { - if (testCounter != 1 && - !((testCounter-1) % 40)) { - fprintf(stderr, " %-3zu\n", (testCounter-1)); - fprintf(stderr, " "); + if (virTestGetVerbose()) { + if (ret == 0 && ts) + fprintf(stderr, "OK [%.5f ms]\n", + virtTestCountAverage(ts, nloops)); + else if (ret == 0) + fprintf(stderr, "OK\n"); + else if (ret == EXIT_AM_SKIP) + fprintf(stderr, "SKIP\n"); + else + fprintf(stderr, "FAILED\n"); + } else { + if (testCounter != 1 && + !((testCounter-1) % 40)) { + fprintf(stderr, " %-3zu\n", (testCounter-1)); + fprintf(stderr, " "); } - if (ret == 0) + if (ret == 0) fprintf(stderr, "."); - else if (ret == EXIT_AM_SKIP) - fprintf(stderr, "_"); - else - fprintf(stderr, "!"); - } + else if (ret == EXIT_AM_SKIP) + fprintf(stderr, "_"); + else + fprintf(stderr, "!"); } VIR_FREE(ts); @@ -539,27 +530,6 @@ virtTestLogContentAndReset(void) return ret; } -#if TEST_OOM_TRACE -static void -virtTestErrorHook(int n, void *data ATTRIBUTE_UNUSED) -{ - void *trace[30]; - int ntrace = ARRAY_CARDINALITY(trace); - size_t i; - char **symbols = NULL; - - ntrace = backtrace(trace, ntrace); - symbols = backtrace_symbols(trace, ntrace); - if (symbols) { - fprintf(stderr, "Failing allocation %d at:\n", n); - for (i = 0; i < ntrace; i++) { - if (symbols[i]) - fprintf(stderr, " TRACE: %s\n", symbols[i]); - } - VIR_FREE(symbols); - } -} -#endif static unsigned int virTestGetFlag(const char *name) { @@ -603,15 +573,6 @@ int virtTestMain(int argc, int ret; bool abs_srcdir_cleanup = false; char *testRange = NULL; -#if TEST_OOM - int approxAlloc = 0; - int n; - char *oomStr = NULL; - int oomCount; - int mp = 0; - pid_t *workers; - int worker = 0; -#endif abs_srcdir = getenv("abs_srcdir"); if (!abs_srcdir) { @@ -672,112 +633,7 @@ int virtTestMain(int argc, } } -#if TEST_OOM - if ((oomStr = getenv("VIR_TEST_OOM")) != NULL) { - if (virStrToLong_i(oomStr, NULL, 10, &oomCount) < 0) - oomCount = 0; - - if (oomCount < 0) - oomCount = 0; - if (oomCount) - testOOM = 1; - } - - if (getenv("VIR_TEST_MP") != NULL) { - mp = sysconf(_SC_NPROCESSORS_ONLN); - fprintf(stderr, "Using %d worker processes\n", mp); - if (VIR_ALLOC_N(workers, mp) < 0) { - ret = EXIT_FAILURE; - goto cleanup; - } - } - - /* Run once to prime any static allocations & ensure it passes */ ret = (func)(); - if (ret != EXIT_SUCCESS) - goto cleanup; - -# if TEST_OOM_TRACE - if (virTestGetDebug()) - virAllocTestHook(virtTestErrorHook, NULL); -# endif - - if (testOOM) { - /* Makes next test runs quiet... */ - testOOM++; - virtTestQuiesceLibvirtErrors(true); - - virAllocTestInit(); - - /* Run again to count allocs, and ensure it passes :-) */ - ret = (func)(); - if (ret != EXIT_SUCCESS) - goto cleanup; - - approxAlloc = virAllocTestCount(); - testCounter++; - if (virTestGetDebug()) - fprintf(stderr, "%zu) OOM...\n", testCounter); - else - fprintf(stderr, "%zu) OOM of %d allocs ", testCounter, approxAlloc); - - if (mp) { - size_t i; - for (i = 0; i < mp; i++) { - workers[i] = fork(); - if (workers[i] == 0) { - worker = i + 1; - break; - } - } - } - - /* Run once for each alloc, failing a different one - and validating that the test case failed */ - for (n = 0; n < approxAlloc && (!mp || worker); n++) { - if (mp && - (n % mp) != (worker - 1)) - continue; - if (!virTestGetDebug()) { - if (mp) - fprintf(stderr, "%d", worker); - else - fprintf(stderr, "."); - fflush(stderr); - } - virAllocTestOOM(n+1, oomCount); - - if (((func)()) != EXIT_FAILURE) { - ret = EXIT_FAILURE; - break; - } - } - - if (mp) { - if (worker) { - _exit(ret); - } else { - size_t i; - for (i = 0; i < mp; i++) { - if (virProcessWait(workers[i], NULL) < 0) - ret = EXIT_FAILURE; - } - VIR_FREE(workers); - } - } - - if (virTestGetDebug()) - fprintf(stderr, " ... OOM of %d allocs", approxAlloc); - - if (ret == EXIT_SUCCESS) - fprintf(stderr, " OK\n"); - else - fprintf(stderr, " FAILED\n"); - } -cleanup: -#else - ret = (func)(); -#endif if (abs_srcdir_cleanup) VIR_FREE(abs_srcdir); -- GitLab