Allow for tests to run in parallel (simultaneously from multiple checkouts)
authorPeter Rabbitson <ribasushi@cpan.org>
Fri, 3 Feb 2012 09:46:06 +0000 (10:46 +0100)
committerPeter Rabbitson <ribasushi@cpan.org>
Mon, 9 Apr 2012 10:54:19 +0000 (12:54 +0200)
commit8d6b1478d8fa6f7c76e313ee72a72d5eb4c24d03
treee17a5128afa86013730391b321667b1a0a44f8ee
parentd9bd51956470404b3960871d3413fa98f16961d2
Allow for tests to run in parallel (simultaneously from multiple checkouts)

This is an interim solution and is by no means the final thing. It simply
was possible to do in a short timeframe and cuts the test run time in half.

If you have DSN envvars set, use at least -s -j8 for best results (the
shuffling un-bunches similar tests, see discussion below)

Two things are at play:

First of all every SQLite database and every temp work directory is created
separately using the pid of the *main* test process (there can be children)
for disambiguation. Extra cleanup passes have been added to ensure t/var
remains clean between runs.

All other DSNs are reduced to their ->sqlt_type form and the result is used
for a global lockfile. Said lockfile is kept in /tmp so that multiple
testruns from multiple directories can be run against the same set of
databases with no conflicts.

Some of the tests are explicitly exempt from any locking and will run
regardless of environment, for example t/storage/dbi_env.t

The lockfiles are deliberately placed in File::Spec->tmpdir. This is done
so that multiple dbic checkouts can run against the same set of DSNs without
stepping on each other's toes.

Some notes on why this is not a great idea, even though it works flawlessly
under continuous test cycling: The problem is that our tests are not yet
ordered in a spwecific way. This means that multiple tests competing for
the same resource will inevitably lock all available test threads forming
several bottlenecks along the path of execution. This issue will be adressed
in a later patch, with the following considerations:
  - prove -l t/... must continue to work as is
  - test aggregation is something the test suite should try to avoid in
    general - after all DBIC is intended to be usable in CGI (yes, pure CGI)
    environments, so if the tests are getting heavy to run - this is an
    actual problem in need of fixing. Aggregation will instead sweep it under
    the rug
  - general reorganization of test groups / various path changes should only
    be attempted once we have a solid base for multi-db test runs
37 files changed:
Changes
Makefile.PL
t/05components.t
t/102load_classes.t
t/103many_to_many_warning.t
t/20setuperrors.t
t/40resultsetmanager.t
t/50fork.t
t/51threads.t
t/51threadtxn.t
t/52leaks.t
t/54taint.t
t/55namespaces_cleaned.t
t/73oracle_hq.t
t/94versioning.t
t/admin/01load.t
t/admin/02ddl.t
t/admin/10script.t
t/cdbi/DeepAbstractSearch/01_search.t
t/cdbi/testlib/DBIC/Test/SQLite.pm
t/cdbi/testlib/MyBase.pm
t/lib/DBICTest.pm
t/lib/DBICTest/Schema.pm
t/lib/DBICTest/Util.pm
t/lib/DBICVersion_v1.pm
t/lib/DBICVersion_v2.pm
t/lib/DBICVersion_v3.pm
t/row/inflate_result.t
t/sqlmaker/oracle.t
t/storage/dbi_env.t
t/storage/debug.t
t/storage/deploy.t
t/storage/on_connect_do.t
t/storage/quote_names.t
t/storage/reconnect.t
t/zzzzzzz_perl_perf_bug.t
t/zzzzzzz_sqlite_deadlock.t