Uapg

Latest version: v0.2.12

Safety actively analyzes 1006753 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 1 of 2

0.2.12

Исправлено

- **`HistoryTimescaleV2._flush_event_batch` при `UAPG_EVENTS_STORAGE_MODE=v2`:** батч больше не пишет «пустой» ряд только в `events_ts` без `event_data`/`legacy_row_id`. Чтение HistoryRead (UAExpert, ovic) гидратирует поля из `events_history` — без payload события приходили с незаполненными полями. Режим `v2` теперь тоже вызывает `save_event_dual` / `uapg_save_event_v2` (как `dual` и одиночный `save_event`). Уже записанные в сломанном режиме строки без `legacy_row_id` не восстанавливаются — нужны новые события после обновления.

0.2.11

Исправлено

- **HistoryTimescaleV2 / pool is closed:** после `_force_reconnect` обновляются кэшированные ссылки на asyncpg pool в `EventStoreV2`, `ProcedureGateway` и `EventsBackfillWorker`. Раньше value history продолжала работать через `_fetch`/`_ensure_pool`, а чтение event history V2 ходило в уже закрытый pool. Lag-запросы в `read_event_history` и `refresh_history_settings_nodes` переведены на `_fetchval` (timeout + reconnect).

0.2.10

Изменено

- **`backfill_last_values`:** lookback (`history_lookback`) для chunk exclusion TimescaleDB; дефолтный `chunk_size=100`; возвращает `restored_items` как `(node_id_str, DataValue)`; опциональный callback `on_chunk_restored` для применения в address space по мере нахождения значений. Обновляет in-memory last-values cache. Кандидаты — только `is_seed` (строки без last_value создаёт `seed_last_values` при historize; orphan metadata без истории больше не гоняет LATERAL).

0.2.9

Добавлено

- **`read_last_values(..., allow_history_fallback=True)`:** при `False` читает только memory/`variables_last_value`, без LATERAL по `variables_history`. Для bulk-restore при старте сервера: иначе тысячи переменных без строк в кэше упираются в `db_query_timeout` (30 с) и рвут пул (`Fetch timed out, will reconnect`).

0.2.8

Добавлено

- **Инвариант `variables_last_value`:** у каждой зарегистрированной переменной должна быть строка последнего значения — тогда чтение последних значений никогда не обращается к таблице истории. Новая колонка `is_seed` (строка-дефолт, не сверенная с историей; миграция `ADD COLUMN IF NOT EXISTS` при init).
- **`seed_last_values(items)`:** батчевый засев дефолтных значений с `is_seed=TRUE` и `ON CONFLICT DO NOTHING` — существующие реальные значения не затрагиваются.
- **`backfill_last_values()`:** фоновая идемпотентная сверка с историей чанками — заполняет отсутствующие строки, замещает сиды реальными последними значениями, сиды без истории помечает сверенными. После первого полного прохода выполняется мгновенно.
- **`read_last_values(..., history_lookback=timedelta)`:** необязательное ограничение фоллбэк-чтения по времени. С условием `sourcetimestamp >= now() - lookback` TimescaleDB исключает старые чанки — переменные без данных больше не заставляют пробегать индексы всех чанков hypertable.
- **Самозалечивание `variables_last_value`:** значения, найденные фоллбэком по истории, батчево upsert'ятся в таблицу-кэш последних значений — при последующих чтениях и рестартах фоллбэк для этих переменных не выполняется.

Изменено

- **Все пути записи последнего значения** (буферный flush, одиночный upsert, самозалечивание фоллбэка) выставляют `is_seed=FALSE` и перекрывают строку-сид независимо от её timestamp (`WHERE is_seed OR sourcetimestamp <= EXCLUDED.sourcetimestamp`).

0.2.7

Исправлено

- **`HistoryTimescale.read_last_values`:** фоллбэк-чтение последних значений из `variables_history` переведён с `SELECT DISTINCT ON (variable_id) ... WHERE variable_id = ANY(...)` (на hypertable с большим числом чанков — секунды на вызов) на `unnest + CROSS JOIN LATERAL ... ORDER BY sourcetimestamp DESC LIMIT 1` — точечный top-1 проход по индексу `(variable_id, sourcetimestamp DESC)`; `variantbinary` читается тем же запросом, убран дополнительный роундтрип на каждую найденную строку.

Page 1 of 2

© 2026 Safety CLI Cybersecurity Inc. All Rights Reserved.