mirror of
https://github.com/open-webui/open-webui.git
synced 2026-09-16 23:43:03 +00:00
- chatEventHandler queue now stores {event, cb} pairs. Live frames
buffered during a replay fence used to lose their Socket.IO ack
callback because we only pushed the event. When replayed, callback-
style events (confirmation / execute / input) would silently never
respond. Now we preserve cb and pass it through to chatEventHandler
on flush.
- resume_stream ownership check is now fail-CLOSED on DB exception.
Previous fail-open skipped the check precisely when infra was
unstable. Client still gets a deterministic reply (empty envelopes)
so the fence clears; it just can't resume in that specific failure
mode. Absent chat_id still falls through to the user-scoped key
guarantee.
- Added per-message asyncio.Lock via a WeakValueDictionary keyed by
(user_id, message_id). Serializes seq-alloc + log-append + emit so
concurrent emitters for the same message_id within a worker can't
interleave and produce out-of-seq live frames. WeakValueDictionary
cleans up automatically once no coroutine holds the lock.
Cross-worker concurrency is still unprotected (would need a
distributed lock) but that's an even rarer scenario.
|
||
|---|---|---|
| .. | ||
| data | ||
| internal | ||
| migrations | ||
| models | ||
| retrieval | ||
| routers | ||
| socket | ||
| static | ||
| storage | ||
| test | ||
| tools | ||
| utils | ||
| __init__.py | ||
| alembic.ini | ||
| config.py | ||
| constants.py | ||
| env.py | ||
| functions.py | ||
| main.py | ||
| tasks.py | ||