fix(generator): исключено смешение миров при запуске

- Зачем:
  - старый state и ручной live-генератор могли тихо писать события в новый мир данных.
- Что:
  - добавлена общая проверка чистого стенда для Airflow и host-путей.
  - защищены backfill, import, continue и clean-start сценарии live-generator.
  - описан миграционный отказ старого state.
- Проверка:
  - make generator-test; docker compose config --quiet; py_compile; bash -n.
This commit is contained in:
2026-07-05 20:21:13 +03:00
parent 525bd8cabf
commit 080d5ae313
17 changed files with 464 additions and 45 deletions
@@ -11,6 +11,19 @@ logger = logging.getLogger("generator")
STATE_VERSION = "3.0"
KNOWN_OLD_STATE_VERSIONS = {"2.0"}
class UnsupportedStateVersionError(ValueError):
"""State записан в старом формате и требует явного решения оператора."""
def __init__(self, found_version: str, expected_version: str = STATE_VERSION):
self.found_version = found_version
self.expected_version = expected_version
super().__init__(
f"unsupported state version {found_version}; "
f"current version is {expected_version}"
)
def _nested_list_to_tuple(obj):
@@ -234,6 +247,8 @@ class GeneratorState:
raise ValueError("state must be an object")
version = data.get("version", "1.0")
if version != STATE_VERSION:
if str(version) in KNOWN_OLD_STATE_VERSIONS:
raise UnsupportedStateVersionError(str(version))
logger.warning(
"Unsupported generator state version %s, will start fresh",
version,
@@ -283,6 +298,8 @@ class GeneratorState:
active_visits=data.get("active_visits", []),
pending_visit_births=data.get("pending_visit_births", 0.0),
)
except UnsupportedStateVersionError:
raise
except Exception as e:
logger.warning(f"Invalid state format, will start fresh: {e}")
raise ValueError(f"Invalid state: {e}")