Compare commits

...

4 Commits

Author SHA1 Message Date
Bojan Serafimov
0705c99fdb Try larger sleep 2022-08-12 09:52:40 -04:00
Bojan Serafimov
21089d5217 Wait for pid death 2022-08-12 09:21:44 -04:00
Bojan Serafimov
bd33ea9fae Add hacky solution 2022-08-12 09:05:51 -04:00
Bojan Serafimov
414279726d Reproduce pageserver.pid lock on restart issue 2022-08-12 09:01:17 -04:00
2 changed files with 33 additions and 0 deletions

View File

@@ -2,6 +2,16 @@ from fixtures.neon_fixtures import NeonEnvBuilder
from fixtures.log_helper import log
# Test that the pageserver fixture is implemented correctly, allowing quick restarts.
# This is a regression test, see https://github.com/neondatabase/neon/issues/2247
def test_fixture_restart(neon_env_builder: NeonEnvBuilder):
env = neon_env_builder.init_start()
for i in range(3):
env.pageserver.stop()
env.pageserver.start()
# Test restarting page server, while safekeeper and compute node keep
# running.
def test_pageserver_restart(neon_env_builder: NeonEnvBuilder):

View File

@@ -1488,6 +1488,17 @@ class NeonPageserver(PgProtocol):
self.running = True
return self
def _wait_for_death(self):
"""Wait for pageserver to die. Assumes kill signal is sent."""
pid_path = pathlib.Path(self.env.repo_dir) / "pageserver.pid"
pid = read_pid(pid_path)
retries_left = 20
while check_pid(pid):
time.sleep(0.2)
retries_left -= 1
if retries_left == 0:
raise AssertionError("Pageserver failed to die")
def stop(self, immediate=False) -> 'NeonPageserver':
"""
Stop the page server.
@@ -1495,6 +1506,7 @@ class NeonPageserver(PgProtocol):
"""
if self.running:
self.env.neon_cli.pageserver_stop(immediate)
self._wait_for_death()
self.running = False
return self
@@ -2004,6 +2016,17 @@ def read_pid(path: Path) -> int:
return int(path.read_text())
def check_pid(pid):
"""Check whether pid is running."""
try:
# If sig is 0, then no signal is sent, but error checking is still performed.
os.kill(pid, 0)
except OSError:
return False
else:
return True
@dataclass
class SafekeeperPort:
pg: int