fix(#234): NSPD harvest ETA badge + SETNX dedupe (Sub-PR C) #250

Merged
lekss361 merged 3 commits from fix/234-nspd-harvest-eta-badge into main 2026-05-17 06:35:41 +00:00
Showing only changes of commit 81cf274e80 - Show all commits

View file

@ -1201,9 +1201,9 @@ def _acquire_harvest_lock(quarter: str) -> bool:
try:
import redis
from app.core.config import Settings
from app.core.config import settings
client = redis.Redis.from_url(Settings().redis_url)
client = redis.Redis.from_url(settings.redis_url)
# SET key value NX EX — атомарно: «установи если не существует, TTL N сек».
acquired = client.set(
f"nspd_harvest_lock:{quarter}",
@ -1223,10 +1223,13 @@ def _trigger_harvest(quarter: str) -> bool:
Ленивый импорт чтобы избежать circular import (tasks services tasks).
Issue #234: burst-from N concurrent analyze дедуплицируется через
Issue #234: burst N concurrent analyze дедуплицируется через
`_acquire_harvest_lock` только первый запрос ставит task, остальные
получают `False` (т.е. harvest_triggered=False) но видят в response
`harvest_eta_seconds` от первого запроса и не re-poll сразу.
получают `False` (т.е. harvest_triggered=False, harvest_eta_seconds=None).
FE при таком ответе показывает graceful no-data UI с ПКК fallback link
(не infinite spinner). Trade-off: Request B не видит countdown, но и не
сбивает работу Request A. Это намеренный design choice см. vault
fixes/Bug_NSPD_WMS_NotBulk_2026_May14.md.
"""
if not _acquire_harvest_lock(quarter):
logger.info("quarter=%s harvest skipped (lock held by another request)", quarter)