"""Capture from an active writer and compare a restored instance with its generation.""" from concurrent.futures import ThreadPoolExecutor from pathlib import Path import sys from tempfile import TemporaryDirectory import threading from service_fixture import cli, serving, RatDBError exe = Path(sys.argv[1]).resolve() with TemporaryDirectory() as tmp: folder = Path(tmp) source = folder / "live.ratdb" restored = folder / "restored.ratdb" cli(exe, "init", source) with serving(exe, source, "--backup-dir", folder) as connect, connect() as reader: reader.select_warren("app") reader._request("create", kind="den", name="empty") reader.select_den("entries") reader.put("seq", {"n": 0}) base = reader._request("stats")["generation"] first = threading.Event() def write(): with connect() as writer: writer.select_warren("app") writer.select_den("entries") for n in range(1, 65): writer.put("seq", {"n": n}) first.set() with ThreadPoolExecutor(max_workers=1) as pool: future = pool.submit(write) assert first.wait(15) result = reader._request("online_backup") future.result(timeout=60) generation = result["generation"] assert base < generation <= base + 64 assert reader.get("seq")["n"] == 64 reader.put("seq", {"n": 65}) reader._request("online_backup") try: reader._request("online_backup") except RatDBError as error: assert error.code == "operation_failed" else: raise AssertionError("existing backup was overwritten") assert not list(folder.glob(".ratdb-online-*")) archive = folder / f"generation-{generation}.ratdb" assert result["backup"] == archive.name cli(exe, "restore", archive, restored) with serving(exe, restored) as connect, connect() as db: db.select_warren("app") assert "empty" in db._request("dens")["names"] db.select_den("entries") assert db.get("seq")["n"] == generation - base assert db._request("stats")["generation"] == generation assert db._request("check")["valid"] try: db._request("online_backup") except RatDBError as error: assert "backup-dir" in str(error) else: raise AssertionError("unconfigured backup was enabled") print(f"Restored generation {generation}, writer pause {result['writer_pause_us']} us")