diff --git a/test_runner/batch_others/test_createdb.py b/test_runner/batch_others/test_createdb.py deleted file mode 100644 index 7e582ccb3d..0000000000 --- a/test_runner/batch_others/test_createdb.py +++ /dev/null @@ -1,38 +0,0 @@ -from contextlib import closing -from fixtures.zenith_fixtures import ZenithPageserver, PostgresFactory, ZenithCli - -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() diff --git a/test_runner/batch_others/test_createdropdb.py b/test_runner/batch_others/test_createdropdb.py new file mode 100644 index 0000000000..25ab2e8111 --- /dev/null +++ b/test_runner/batch_others/test_createdropdb.py @@ -0,0 +1,96 @@ +import os +import pathlib + +from contextlib import closing +from fixtures.zenith_fixtures import ZenithPageserver, PostgresFactory, ZenithCli + +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, +): + 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('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 diff --git a/test_runner/fixtures/zenith_fixtures.py b/test_runner/fixtures/zenith_fixtures.py index 4cd2ff351f..d8e0a79167 100644 --- a/test_runner/fixtures/zenith_fixtures.py +++ b/test_runner/fixtures/zenith_fixtures.py @@ -366,8 +366,8 @@ class Postgres(PgProtocol): self.running = False self.repo_dir = repo_dir self.branch: Optional[str] = None # dubious, see asserts below + self.pgdata_dir: Optional[str] = None # Path to computenode PGDATA self.tenant_id = tenant_id - # path to conf is /pgdatadirs/tenants///postgresql.conf def create( self, @@ -391,6 +391,9 @@ class Postgres(PgProtocol): else: self.zenith_cli.run(['pg', 'create', branch, f'--tenantid={self.tenant_id}']) self.branch = branch + path = pathlib.Path('pgdatadirs') / 'tenants' / self.tenant_id / self.branch + self.pgdata_dir = os.path.join(self.repo_dir, path) + if wal_acceptors is not None: self.adjust_for_wal_acceptors(wal_acceptors) if config_lines is None: @@ -413,8 +416,7 @@ class Postgres(PgProtocol): def pg_xact_dir_path(self) -> str: """ Path to pg_xact dir """ - path = pathlib.Path('pgdatadirs') / 'tenants' / self.tenant_id / self.branch / 'pg_xact' - return os.path.join(self.repo_dir, path) + return os.path.join(self.pgdata_dir, 'pg_xact') def pg_twophase_dir_path(self) -> str: """ Path to pg_twophase dir """ @@ -425,8 +427,7 @@ class Postgres(PgProtocol): def config_file_path(self) -> str: """ Path to postgresql.conf """ - filename = pathlib.Path('pgdatadirs') / 'tenants' / self.tenant_id / self.branch / 'postgresql.conf' - return os.path.join(self.repo_dir, filename) + return os.path.join(self.pgdata_dir, 'postgresql.conf') def adjust_for_wal_acceptors(self, wal_acceptors: str) -> 'Postgres': """