mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-09 06:22:57 +00:00
Support is done via pytest-xdist plugin. To use the feature add -n<concurrency> to pytest invocation e.g. pytest -n8 to run 8 tests in parallel. Changes in code are mostly about ports assigning. Previously port for pageserver was hardcoded without the ability to override through zenith cli and ports for started compute nodes were calculated twice, in zenith cli and in test code. Now zenith cli supports port arguments for pageserver and compute nodes to be passed explicitly. Tests are modified in such a way that each worker gets a non overlapping port range which can be configured and now contains 100 ports. These ports are distributed to test services (pageserver, wal acceptors, compute nodes) so they can work independently.
60 lines
2.2 KiB
Python
60 lines
2.2 KiB
Python
import os
|
|
|
|
from fixtures.utils import mkdir_if_needed
|
|
from fixtures.zenith_fixtures import PageserverPort, PostgresFactory, check_restored_datadir_content
|
|
|
|
pytest_plugins = ("fixtures.zenith_fixtures")
|
|
|
|
|
|
def test_zenith_regress(postgres: PostgresFactory, pg_bin, zenith_cli, test_output_dir, pg_distrib_dir,
|
|
base_dir, capsys, pageserver_port: PageserverPort):
|
|
|
|
# Create a branch for us
|
|
zenith_cli.run(["branch", "test_zenith_regress", "empty"])
|
|
|
|
# Connect to postgres and create a database called "regression".
|
|
pg = postgres.create_start('test_zenith_regress')
|
|
pg.safe_psql('CREATE DATABASE regression')
|
|
|
|
# Create some local directories for pg_regress to run in.
|
|
runpath = os.path.join(test_output_dir, 'regress')
|
|
mkdir_if_needed(runpath)
|
|
mkdir_if_needed(os.path.join(runpath, 'testtablespace'))
|
|
|
|
# Compute all the file locations that pg_regress will need.
|
|
# This test runs zenith specific tests
|
|
build_path = os.path.join(pg_distrib_dir, 'build/src/test/regress')
|
|
src_path = os.path.join(base_dir, 'test_runner/zenith_regress')
|
|
bindir = os.path.join(pg_distrib_dir, 'bin')
|
|
schedule = os.path.join(src_path, 'parallel_schedule')
|
|
pg_regress = os.path.join(build_path, 'pg_regress')
|
|
|
|
pg_regress_command = [
|
|
pg_regress,
|
|
'--use-existing',
|
|
'--bindir={}'.format(bindir),
|
|
'--dlpath={}'.format(build_path),
|
|
'--schedule={}'.format(schedule),
|
|
'--inputdir={}'.format(src_path),
|
|
]
|
|
|
|
print(pg_regress_command)
|
|
env = {
|
|
'PGPORT': str(pg.port),
|
|
'PGUSER': pg.username,
|
|
'PGHOST': pg.host,
|
|
}
|
|
|
|
# Run the command.
|
|
# We don't capture the output. It's not too chatty, and it always
|
|
# logs the exact same data to `regression.out` anyway.
|
|
with capsys.disabled():
|
|
pg_bin.run(pg_regress_command, env=env, cwd=runpath)
|
|
|
|
# checkpoint one more time to ensure that the lsn we get is the latest one
|
|
pg.safe_psql('CHECKPOINT')
|
|
lsn = pg.safe_psql('select pg_current_wal_insert_lsn()')[0][0]
|
|
|
|
# Check that we restore the content of the datadir correctly
|
|
check_restored_datadir_content(zenith_cli, test_output_dir, pg, pageserver_port.pg)
|