mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-05 20:42:54 +00:00
This patch aims to:
* Unify connection & querying logic of ZenithPagerserver and Postgres.
* Mitigate changes to transaction machinery introduced in `psycopg2 >= 2.9`.
Now it's possible to acquire db connection using the corresponding
method:
```python
pg = postgres.create_start('main')
conn = pg.connect()
...
conn.close()
```
This pattern can be further improved with the help of `closing`:
```python
from contextlib import closing
pg = postgres.create_start('main')
with closing(pg.connect()) as conn:
...
```
All connections produced by this method will have autocommit
enabled by default.
47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
pytest_plugins = ("fixtures.zenith_fixtures")
|
|
|
|
|
|
#
|
|
# Test branching, when a transaction is in prepared state
|
|
#
|
|
def test_twophase(zenith_cli, pageserver, postgres, pg_bin):
|
|
zenith_cli.run(["branch", "test_twophase", "empty"])
|
|
|
|
pg = postgres.create_start('test_twophase', config_lines=['max_prepared_transactions=5'])
|
|
print("postgres is running on 'test_twophase' branch")
|
|
|
|
conn = pg.connect()
|
|
cur = conn.cursor()
|
|
|
|
cur.execute('CREATE TABLE foo (t text)')
|
|
|
|
# Prepare a transaction that will insert a row
|
|
cur.execute('BEGIN')
|
|
cur.execute("INSERT INTO foo VALUES ('one')")
|
|
cur.execute("PREPARE TRANSACTION 'insert_one'")
|
|
|
|
# Prepare another transaction that will insert a row
|
|
cur.execute('BEGIN')
|
|
cur.execute("INSERT INTO foo VALUES ('two')")
|
|
cur.execute("PREPARE TRANSACTION 'insert_two'")
|
|
|
|
# Create a branch with the transaction in prepared state
|
|
zenith_cli.run(["branch", "test_twophase_prepared", "test_twophase"])
|
|
|
|
pg2 = postgres.create_start('test_twophase_prepared',
|
|
config_lines=['max_prepared_transactions=5'])
|
|
conn2 = pg2.connect()
|
|
cur2 = conn2.cursor()
|
|
|
|
# On the new branch, commit one of the prepared transactions, abort the other one.
|
|
cur2.execute("COMMIT PREPARED 'insert_one'")
|
|
cur2.execute("ROLLBACK PREPARED 'insert_two'")
|
|
|
|
cur2.execute('SELECT * FROM foo')
|
|
assert cur2.fetchall() == [('one', )]
|
|
|
|
# Neither insert is visible on the original branch, the transactions are still
|
|
# in prepared state there.
|
|
cur.execute('SELECT * FROM foo')
|
|
assert cur.fetchall() == []
|