mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-07 13:32: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.
103 lines
3.1 KiB
Python
103 lines
3.1 KiB
Python
import os
|
|
import pathlib
|
|
|
|
from contextlib import closing
|
|
from fixtures.zenith_fixtures import ZenithPageserver, PostgresFactory, ZenithCli, check_restored_datadir_content
|
|
|
|
pytest_plugins = ("fixtures.zenith_fixtures")
|
|
|
|
|
|
#
|
|
# Test CREATE DATABASE when there have been relmapper changes
|
|
#
|
|
def test_createdb(
|
|
zenith_cli: ZenithCli,
|
|
pageserver: ZenithPageserver,
|
|
postgres: PostgresFactory,
|
|
pg_bin,
|
|
):
|
|
zenith_cli.run(["branch", "test_createdb", "empty"])
|
|
|
|
pg = postgres.create_start('test_createdb')
|
|
print("postgres is running on 'test_createdb' branch")
|
|
|
|
with closing(pg.connect()) as conn:
|
|
with conn.cursor() as cur:
|
|
# Cause a 'relmapper' change in the original branch
|
|
cur.execute('VACUUM FULL pg_class')
|
|
|
|
cur.execute('CREATE DATABASE foodb')
|
|
|
|
cur.execute('SELECT pg_current_wal_insert_lsn()')
|
|
lsn = cur.fetchone()[0]
|
|
|
|
# Create a branch
|
|
zenith_cli.run(["branch", "test_createdb2", "test_createdb@" + lsn])
|
|
|
|
pg2 = postgres.create_start('test_createdb2')
|
|
|
|
# Test that you can connect to the new database on both branches
|
|
for db in (pg, pg2):
|
|
db.connect(dbname='foodb').close()
|
|
|
|
#
|
|
# Test DROP DATABASE
|
|
#
|
|
def test_dropdb(
|
|
zenith_cli: ZenithCli,
|
|
pageserver: ZenithPageserver,
|
|
postgres: PostgresFactory,
|
|
pg_bin,
|
|
test_output_dir
|
|
):
|
|
zenith_cli.run(["branch", "test_dropdb", "empty"])
|
|
|
|
pg = postgres.create_start('test_dropdb')
|
|
print("postgres is running on 'test_dropdb' branch")
|
|
|
|
with closing(pg.connect()) as conn:
|
|
with conn.cursor() as cur:
|
|
cur.execute('CREATE DATABASE foodb')
|
|
|
|
cur.execute('SELECT pg_current_wal_insert_lsn()')
|
|
lsn_before_drop = cur.fetchone()[0]
|
|
|
|
cur.execute("SELECT oid FROM pg_database WHERE datname='foodb';")
|
|
dboid = cur.fetchone()[0]
|
|
|
|
|
|
with closing(pg.connect()) as conn:
|
|
with conn.cursor() as cur:
|
|
cur.execute('DROP DATABASE foodb')
|
|
|
|
cur.execute('CHECKPOINT')
|
|
|
|
cur.execute('SELECT pg_current_wal_insert_lsn()')
|
|
lsn_after_drop = cur.fetchone()[0]
|
|
|
|
|
|
# Create two branches before and after database drop.
|
|
zenith_cli.run(["branch", "test_before_dropdb", "test_dropdb@" + lsn_before_drop])
|
|
pg_before = postgres.create_start('test_before_dropdb')
|
|
|
|
zenith_cli.run(["branch", "test_after_dropdb", "test_dropdb@" + lsn_after_drop])
|
|
pg_after = postgres.create_start('test_after_dropdb')
|
|
|
|
# Test that database exists on the branch before drop
|
|
pg_before.connect(dbname='foodb').close()
|
|
|
|
# Test that database subdir exists on the branch before drop
|
|
dbpath = pathlib.Path(pg_before.pgdata_dir) / 'base' / str(dboid)
|
|
print(dbpath)
|
|
|
|
assert os.path.isdir(dbpath) == True
|
|
|
|
# Test that database subdir doesn't exist on the branch after drop
|
|
dbpath = pathlib.Path(pg_after.pgdata_dir) / 'base' / str(dboid)
|
|
print(dbpath)
|
|
|
|
assert os.path.isdir(dbpath) == False
|
|
|
|
# Check that we restore the content of the datadir correctly
|
|
check_restored_datadir_content(zenith_cli, test_output_dir, pg, pageserver.service_port.pg)
|