Ладно, план такой. Я попробую у автора вытребовать логи и посмотреть, что там происходит. Если не получится, то поднимем свой инстанс и изучим. Если проблема действительно в том, что боты кликают несколько кнопок подряд, то это в логах будет видно, и мы починим.
Minoru насколько я вижу, _usersStore используется только для принятия решения в первом if. Поэтому, во-первых, можно Get и Remove переместить в критическую секцию в начале кода, во-вторых, наверняка есть какой-нибудь метод Take, возвращающий Option — лучше переехать на него
Если ты будешь юзера сразу убирать из коллекции, а дальнейший код упадёт (например, не сможет его авторизовать), то на этом история юзера закончится. Он так и повиснет в непонятном состоянии.
Minoru о, а мы же когда-то обсуждали использование объектов как локов — нельзя ли тут после проверки на null использовать unauthorizedUser как лок? Или вы это и имели в виду, когда обсуждали шардинг по пользователям?
Minoru правда, локи наверняка не гарантируют порядок разблокировки, т.е. ответы пользователя будут обрабатываться в произвольном порядке. Но лучше таких пользователей сразу банить :)
Minoru о, а мы же когда-то обсуждали использование объектов как локов — нельзя ли тут после проверки на null использовать unauthorizedUser как лок? Или вы это и имели в виду, когда обсуждали шардинг по пользователям?
Тут нельзя, так не получится. Код очень асинхронный, а асинхронные локи — достаточно сложные конструкции, чтобы просто так на объекты не мапиться.