mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
Parallelize src/test/test into chunks.
First, we introduce a flag to teach src/test/test to split its work into chunks. Then we replace our invocation of src/test/test in our "make check" target with a set of 8 scripts that invoke the first 8th of the tests, the second 8th, and so on. This change makes our "make -kj4 check" target in our hardened gitlab build more than twice as fast, since src/test/test was taking the longest to finish. Closes 40098.
This commit is contained in:
committed by
George Kadianakis
parent
f5b9471547
commit
974abdf632
@@ -278,6 +278,8 @@ main(int c, const char **v)
|
||||
control_initialize_event_queue();
|
||||
configure_backtrace_handler(get_version());
|
||||
|
||||
unsigned num=1, den=1;
|
||||
|
||||
for (i_out = i = 1; i < c; ++i) {
|
||||
if (!strcmp(v[i], "--warn")) {
|
||||
loglevel = LOG_WARN;
|
||||
@@ -289,6 +291,19 @@ main(int c, const char **v)
|
||||
loglevel = LOG_DEBUG;
|
||||
} else if (!strcmp(v[i], "--accel")) {
|
||||
accel_crypto = 1;
|
||||
} else if (!strcmp(v[i], "--fraction")) {
|
||||
if (i+1 == c) {
|
||||
printf("--fraction needs an argument.\n");
|
||||
return 1;
|
||||
}
|
||||
const char *fracstr = v[++i];
|
||||
char ch;
|
||||
if (sscanf(fracstr, "%u/%u%c", &num, &den, &ch) != 2) {
|
||||
printf("--fraction expects a fraction as an input.\n");
|
||||
}
|
||||
if (den == 0 || num == 0 || num > den) {
|
||||
printf("--fraction expects a valid fraction as an input.\n");
|
||||
}
|
||||
} else {
|
||||
v[i_out++] = v[i];
|
||||
}
|
||||
@@ -363,6 +378,33 @@ main(int c, const char **v)
|
||||
smartlist_free(skip);
|
||||
}
|
||||
|
||||
if (den != 1) {
|
||||
// count the tests. Linear but fast.
|
||||
unsigned n_tests = 0;
|
||||
struct testgroup_t *tg;
|
||||
struct testcase_t *tc;
|
||||
for (tg = testgroups; tg->prefix != NULL; ++tg) {
|
||||
for (tc = tg->cases; tc->name != NULL; ++tc) {
|
||||
++n_tests;
|
||||
}
|
||||
}
|
||||
// Which tests should we run? This can give iffy results if den is huge
|
||||
// but it doesn't actually matter in practice.
|
||||
unsigned tests_per_chunk = CEIL_DIV(n_tests, den);
|
||||
unsigned start_at = (num-1) * tests_per_chunk;
|
||||
|
||||
// Skip the tests that are outside of the range.
|
||||
unsigned idx = 0;
|
||||
for (tg = testgroups; tg->prefix != NULL; ++tg) {
|
||||
for (tc = tg->cases; tc->name != NULL; ++tc) {
|
||||
if (idx < start_at || idx >= start_at + tests_per_chunk) {
|
||||
tc->flags |= TT_SKIP;
|
||||
}
|
||||
++idx;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int have_failed = (tinytest_main(c, v, testgroups) != 0);
|
||||
|
||||
free_pregenerated_keys();
|
||||
|
||||
Reference in New Issue
Block a user