Skip to content

Race condition для callback'ов #482

@AlexDevOp

Description

@AlexDevOp

Возможна ситуация, когда после отправки direct notification на backend, callback на действие уже пришел на fastapi, но управление ещё не вернулось в корутину ожидания callback'a. Из-за этого в memory_repo ещё не хранится соответствующий sync_id. Это приводит к тому, что callback ещё не ожидается, но ответ на него уже пришёл.

Такая ситуация может наступить, если event loop перегружен или в него затесалась CPU-bounded задача.

     async def heavy_task():
          time.sleep(0.5) # Симуляция работы через заморозку потока
          await asyncio.sleep(0.5) # Передача управления в event loop с последующим возвращением
          await asyncio.sleep(0.2) # И ещё разок

     async def test_race():
          coro_list = [heavy_task() in range(20)]
          coro_list.append(bot.send_message(bot_id=some_bot_id, chat_id=some_chat_id, body='some text'))
          await asyncio.gather(*coro_list)

Индикатором проблемы будет следующая последовательность ошибок в логе:

pybotx.bot.exceptions.BotXMethodCallbackNotFoundError: Callback ccbf5a16-fb25-5589-85a5-3cce9a58356c doesn't exist or already waited or timed out
pybotx.client.exceptions.callbacks.CallbackNotReceivedError: Callback for sync_id ccbf5a16-fb25-5589-85a5-3cce9a58356c hasn't been received

Sub-issues

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions