tokio::select! сожрал нам данные в проде — cancellation safety это мина

Теги: #Rust
Рейтинг: 45.7% · 101 голосов
Python, Rust, Go, C++, C#, Java, Kotlin: синтаксис, паттерны проектирования, производительность, многопоточность и сравнение языков.
Аватара пользователя
qcdeed
Сообщения: 57
Зарегистрирован: 11 май 2026, 20:16

tokio::select! сожрал нам данные в проде — cancellation safety это мина

Сообщение qcdeed »

Поймали жёсткий баг: select! отменил ветку с buf.read() на середине, часть байт уже была вычитана из сокета и просто потерялась. Сообщения бились раз в пару часов под нагрузкой. Rust safe, ага, память не текла — данные текли.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
rburr
Сообщения: 77
Зарегистрирован: 12 май 2026, 17:53

Re: tokio::select! сожрал нам данные в проде — cancellation safety это мина

Сообщение rburr »

Классика. read() в tokio cancellation-safe, а вот read_exact и многие комбинаторы — нет. Если фьюча отменяется между await-точками, всё что она держала в стеке (промежуточный буфер) уходит в небытие. В доке tokio про это есть, но кто её читает.
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
Bowden
Сообщения: 80
Зарегистрирован: 12 май 2026, 09:21

Re: tokio::select! сожрал нам данные в проде — cancellation safety это мина

Сообщение Bowden »

alex_dev в том и дело что read() сам по себе safe, а у нас был кастомный декодер поверх, который копил в свой буфер и await-ил внутри. Вот он и не safe оказался.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
secret7260
Сообщения: 13
Зарегистрирован: 19 май 2026, 22:58

Re: tokio::select! сожрал нам данные в проде — cancellation safety это мина

Сообщение secret7260 »

Вот за это я и недолюбливаю async Rust. "Безопасность" компилятора заканчивается ровно там где начинается логика отмены, и тут ты сам по себе как в C. Никакой borrow checker тебе тут не друг.
👍1 ❤️1 🔥 😄1 🤔
Аватара пользователя
tsav
Сообщения: 52
Зарегистрирован: 11 май 2026, 01:00

Re: tokio::select! сожрал нам данные в проде — cancellation safety это мина

Сообщение tsav »

Решение — не держать состояние в локалках фьючи которая может быть отменена. Всё что должно пережить отмену выносишь наружу select!, либо используешь tokio_util::codec::Framed который cancellation-safe by design. Мы так и сделали, баг ушёл.
👍 ❤️ 🔥1 😄 🤔
Аватара пользователя
m3power
Сообщения: 42
Зарегистрирован: 16 май 2026, 21:33

Re: tokio::select! сожрал нам данные в проде — cancellation safety это мина

Сообщение m3power »

Дмитрий_К да, в итоге переехали на Framed + LinesCodec и забыли как страшный сон. Но осадочек что наступил на это в проде, а не в тестах, остался.
👍1 ❤️ 🔥 😄 🤔2
Аватара пользователя
haskellmain
Сообщения: 11
Зарегистрирован: 12 май 2026, 10:47

Re: tokio::select! сожрал нам данные в проде — cancellation safety это мина

Сообщение haskellmain »

А воспроизвести в тестах такое почти нереально, это же гонка по таймингу отмены. Нужен loom или ручной детерминированный планировщик. Кто-нибудь реально тестит cancellation safety автоматически?
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
mstrbates
Сообщения: 88
Зарегистрирован: 11 май 2026, 00:45

Re: tokio::select! сожрал нам данные в проде — cancellation safety это мина

Сообщение mstrbates »

perf_freak loom для этого и есть, но он про потоки/atomics, а не про async cancellation напрямую. Для отмены народ пишет руками тесты с tokio::time + abort в конкретный момент. Боль.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
rbacker
Сообщения: 28
Зарегистрирован: 11 май 2026, 19:56

Re: tokio::select! сожрал нам данные в проде — cancellation safety это мина

Сообщение rbacker »

Кстати это ещё и вектор атаки в некоторых протоколах — если злоумышленник может спровоцировать таймаут-отмену в нужный момент, рассинхрон стрима бывает эксплуатируемым. Видел CVE по похожему паттерну.
👍1 ❤️ 🔥2 😄 🤔
Аватара пользователя
TerraformSmith
Сообщения: 9
Зарегистрирован: 17 май 2026, 06:39

Re: tokio::select! сожрал нам данные в проде — cancellation safety это мина

Сообщение TerraformSmith »

А в Go контекст отменяется, горутина видит ctx.Done() и сама решает докатать чтение или нет. Никто за тебя стек не дропает. Иногда явность это и есть безопасность.
👍1 ❤️ 🔥 😄 🤔
Ответить
Поделиться темой: ✈ Telegram VK
Похожие запросы: как работает borrow checker в rust

Вернуться в «Языки программирования»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость