cogs/voice.py вызывает is_ready(), а потом consume() двумя отдельными шагами. два быстрых джойна могут оба пройти проверку.
эффект мягкий (cleanup потом подберёт лишние каналы), но проверку и расход лимита стоит сделать атомарными.
что чинить
объединить в один атомарный check_cooldown() (check-and-consume) либо явно задокументировать, что гонка допустима.
где
services/cooldown.py
cogs/voice.py
cogs/voice.pyвызываетis_ready(), а потомconsume()двумя отдельными шагами. два быстрых джойна могут оба пройти проверку.эффект мягкий (cleanup потом подберёт лишние каналы), но проверку и расход лимита стоит сделать атомарными.
что чинить
объединить в один атомарный
check_cooldown()(check-and-consume) либо явно задокументировать, что гонка допустима.где
services/cooldown.pycogs/voice.py