Build 060.28: implement Persistent Checkpoint and Startup Recovery

This commit is contained in:
2026-08-01 20:55:32 +03:00
parent 58e5a12a4d
commit 8c485e32b1
63 changed files with 12430 additions and 92 deletions

View File

@@ -105,6 +105,7 @@ def test_default_migrations_have_stable_order_and_names() -> None:
(5, "add_trade_observation_sources"),
(6, "add_quote_and_candle_observation_sources"),
(7, "create_market_data_partition_registry"),
(8, "create_trade_stream_checkpoints"),
)
@@ -119,8 +120,8 @@ def test_default_schema_defines_partitions_identities_and_constraints() -> None:
assert "CREATE TABLE market_data.trades" in sql
assert "PRIMARY KEY (venue, symbol, trade_id, executed_at)" in sql
assert "trade_id BETWEEN -2147483648 AND 2147483647" in sql
assert sql.count("CHECK (BTRIM(venue) <> '')") == 3
assert sql.count("CHECK (BTRIM(symbol) <> '')") == 3
assert sql.count("CHECK (BTRIM(venue) <> '')") == 4
assert sql.count("CHECK (BTRIM(symbol) <> '')") == 4
assert sql.count("CHECK (BTRIM(source) <> '')") == 3
assert "PARTITION BY RANGE (executed_at)" in sql
assert "CREATE TABLE market_data.quotes" in sql
@@ -143,6 +144,18 @@ def test_default_schema_defines_partitions_identities_and_constraints() -> None:
assert "partition_bound TEXT NOT NULL" in sql
assert "BTRIM(partition_bound) <> ''" in sql
assert "range_end > range_start" in sql
assert "CREATE TABLE market_data.trade_stream_checkpoints" in sql
assert "PRIMARY KEY (venue, symbol)" in sql
assert "revision BIGINT NOT NULL" in sql
assert "checkpoint_schema_version INTEGER NOT NULL DEFAULT 1" in sql
assert "CONSTRAINT trade_stream_checkpoints_trade_fk" in sql
assert "FOREIGN KEY (" in sql
assert ") REFERENCES market_data.trades (" in sql
assert "ON UPDATE NO ACTION" in sql
assert "ON DELETE NO ACTION" in sql
assert "DEFERRABLE INITIALLY DEFERRED" in sql
assert "CHECK (revision > 0)" in sql
assert "CHECK (checkpoint_schema_version > 0)" in sql
def test_run_locks_and_applies_every_pending_migration_in_order() -> None:
@@ -150,7 +163,7 @@ def test_run_locks_and_applies_every_pending_migration_in_order() -> None:
result = runner.run()
assert result == (1, 2, 3, 4, 5, 6, 7)
assert result == (1, 2, 3, 4, 5, 6, 7, 8)
assert provider.calls == 1
assert connection.entered == 1
assert connection.exited == 1
@@ -167,7 +180,7 @@ def test_run_locks_and_applies_every_pending_migration_in_order() -> None:
)
and isinstance(parameters, tuple)
)
assert inserted_versions == (1, 2, 3, 4, 5, 6, 7)
assert inserted_versions == (1, 2, 3, 4, 5, 6, 7, 8)
def test_run_skips_already_applied_migrations() -> None:
@@ -196,7 +209,7 @@ def test_run_applies_only_migrations_after_existing_prefix() -> None:
result = runner.run()
assert result == (3, 4, 5, 6, 7)
assert result == (3, 4, 5, 6, 7, 8)
inserted_versions = tuple(
parameters[0]
for statement, parameters in cursor.calls
@@ -205,7 +218,7 @@ def test_run_applies_only_migrations_after_existing_prefix() -> None:
)
and isinstance(parameters, tuple)
)
assert inserted_versions == (3, 4, 5, 6, 7)
assert inserted_versions == (3, 4, 5, 6, 7, 8)
def test_run_rejects_unknown_applied_version() -> None: