Files
postgrest/test/io/test_replica.py
T

59 lines
2.0 KiB
Python

"IO tests for PostgREST started on replicas"
import os
import time
from postgrest import run
from util import Thread
def test_sanity_replica(replicaenv):
"Test that primary and replica are working as intended"
with run(env=replicaenv["primary"]) as postgrest:
response = postgrest.session.get("/rpc/is_replica")
assert response.text == "false"
response = postgrest.session.get("/rpc/get_replica_slot")
assert response.text == '"' + replicaenv["replica"]["PGREPLICASLOT"] + '"'
response = postgrest.session.get("/items?select=count")
assert response.text == '[{"count":10}]'
with run(env=replicaenv["replica"]) as postgrest:
response = postgrest.session.get("/rpc/is_replica")
assert response.text == "true"
response = postgrest.session.get("/items?select=count")
assert response.text == '[{"count":10}]'
def test_conflict_replica(replicaenv):
"Test that PostgREST does not retry the transaction on conflict with recovery (PG error code 40001)"
with run(env=replicaenv["replica"]) as postgrest:
def conflict():
response = postgrest.session.get("/conflict_view")
# Checks that the transaction stops and returns the 40001 error instead of retrying
assert response.json()["code"] == "40001"
assert response.status_code == 500
t = Thread(target=conflict)
t.start()
# make sure the request has started
time.sleep(0.1)
prienv = replicaenv["primary"]
connopts = f'-d {prienv["PGDATABASE"]} -U postgres -h {prienv["PGHOST"]}'
# Delete the table data while the request with the lock is running to trigger the recovery conflict
os.system(
f'psql {connopts} --set ON_ERROR_STOP=1 -a -c "DELETE FROM replica.conflict;"'
)
# Vacuum the table to accelerate the process
os.system(f"vacuumdb {connopts} -t replica.conflict")
t.join()