mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-08 05:52:55 +00:00
## Problem Currently our testing environment only supports running a single pageserver at a time. This is insufficient for testing failover and migrations. - Dependency of writing tests for #5207 ## Summary of changes - `neon_local` and `neon_fixture` now handle multiple pageservers - This is a breaking change to the `.neon/config` format: any local environments will need recreating - Existing tests continue to work unchanged: - The default number of pageservers is 1 - `NeonEnv.pageserver` is now a helper property that retrieves the first pageserver if there is only one, else throws. - Pageserver data directories are now at `.neon/pageserver_{n}` where n is 1,2,3... - Compatibility tests get some special casing to migrate neon_local configs: these are not meant to be backward/forward compatible, but they were treated that way by the test.
54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
import os.path
|
|
import shutil
|
|
import subprocess
|
|
import threading
|
|
import time
|
|
from contextlib import closing
|
|
|
|
from fixtures.log_helper import log
|
|
from fixtures.neon_fixtures import NeonEnv
|
|
|
|
|
|
def lsof_path() -> str:
|
|
path_output = shutil.which("lsof")
|
|
if path_output is None:
|
|
raise RuntimeError("lsof not found in PATH")
|
|
else:
|
|
return path_output
|
|
|
|
|
|
# Makes sure that `pageserver.pid` is only held by `pageserve` command, not other commands.
|
|
# This is to test the changes in https://github.com/neondatabase/neon/pull/1834.
|
|
def test_lsof_pageserver_pid(neon_simple_env: NeonEnv):
|
|
env = neon_simple_env
|
|
|
|
def start_workload():
|
|
env.neon_cli.create_branch("test_lsof_pageserver_pid")
|
|
endpoint = env.endpoints.create_start("test_lsof_pageserver_pid")
|
|
with closing(endpoint.connect()) as conn:
|
|
with conn.cursor() as cur:
|
|
cur.execute("CREATE TABLE foo as SELECT x FROM generate_series(1,100000) x")
|
|
cur.execute("update foo set x=x+1")
|
|
|
|
workload_thread = threading.Thread(target=start_workload, args=(), daemon=True)
|
|
workload_thread.start()
|
|
|
|
path = os.path.join(env.pageserver.workdir, "pageserver.pid")
|
|
lsof = lsof_path()
|
|
while workload_thread.is_alive():
|
|
res = subprocess.run(
|
|
[lsof, path],
|
|
check=False,
|
|
universal_newlines=True,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
)
|
|
|
|
# parse the `lsof` command's output to get only the list of commands
|
|
commands = [line.split(" ")[0] for line in res.stdout.strip().split("\n")[1:]]
|
|
if len(commands) > 0:
|
|
log.info(f"lsof commands: {commands}")
|
|
assert commands == ["pageserve"]
|
|
|
|
time.sleep(1.0)
|