-
Notifications
You must be signed in to change notification settings - Fork 335
IdleTimeout from ProxyOpts is not wired into Telegram relay #417
Description
В процессе анализа #378 обнаружил, что ProxyOpts.IdleTimeout нигде не подключён — ни к domain fronting relay (пофикшено в #416), ни к Telegram relay.
Суть проблемы
Поле IdleTimeout в ProxyOpts задокументировано как таймаут для relay — если за указанное время ни байта не прошло ни в одну сторону, соединение должно закрыться. Параметр network.timeout.idle в конфиге (по умолчанию 1m) существует, но реально ни на что не влияет.
В Telegram relay (proxy.go:104-110) используется голый relay.Relay → io.CopyBuffer без каких-либо deadline. Если клиент пропадает (ушёл в метро, сел аккумулятор, упал провайдер), TCP-соединение формально живо, но данных нет. Горутина в worker pool сидит и ждёт бесконечно.
При массовом отвале клиентов (например, провайдер лёг и поднялся) можно накопить тысячи зомби-горутин в пуле.
Возможный фикс
Аналогично тому, что сделано для domain fronting в #416: обернуть оба соединения в connIdleTimeout, который выставляет SetReadDeadline/SetWriteDeadline перед каждой операцией.
Если подход устраивает — могу прислать PR.