bot.bot_created_channels и channel_creators мутируются из асинхронных обработчиков событий, а save_*() делает read-modify-write словаря в памяти, а затем асинхронную запись файла без блокировки.
атомарная замена (mkstemp -> fsync -> os.replace) защищает сам файл, но не окно dict -> write. два голосовых события подряд могут молча затереть обновление друг друга (last-writer-wins).
что чинить
обернуть последовательность read-modify-write-then-persist в asyncio.Lock для каналов и для таргетов.
где
cogs/voice.py
bot.py (save_channels / save_targets)
services/storage.py
bot.bot_created_channelsиchannel_creatorsмутируются из асинхронных обработчиков событий, аsave_*()делает read-modify-write словаря в памяти, а затем асинхронную запись файла без блокировки.атомарная замена (
mkstemp->fsync->os.replace) защищает сам файл, но не окноdict -> write. два голосовых события подряд могут молча затереть обновление друг друга (last-writer-wins).что чинить
обернуть последовательность read-modify-write-then-persist в
asyncio.Lockдля каналов и для таргетов.где
cogs/voice.pybot.py(save_channels/save_targets)services/storage.py