Skip to content

IdleTimeout from ProxyOpts is not wired into Telegram relay #417

@dolonet

Description

@dolonet

В процессе анализа #378 обнаружил, что ProxyOpts.IdleTimeout нигде не подключён — ни к domain fronting relay (пофикшено в #416), ни к Telegram relay.

Суть проблемы

Поле IdleTimeout в ProxyOpts задокументировано как таймаут для relay — если за указанное время ни байта не прошло ни в одну сторону, соединение должно закрыться. Параметр network.timeout.idle в конфиге (по умолчанию 1m) существует, но реально ни на что не влияет.

В Telegram relay (proxy.go:104-110) используется голый relay.Relayio.CopyBuffer без каких-либо deadline. Если клиент пропадает (ушёл в метро, сел аккумулятор, упал провайдер), TCP-соединение формально живо, но данных нет. Горутина в worker pool сидит и ждёт бесконечно.

При массовом отвале клиентов (например, провайдер лёг и поднялся) можно накопить тысячи зомби-горутин в пуле.

Возможный фикс

Аналогично тому, что сделано для domain fronting в #416: обернуть оба соединения в connIdleTimeout, который выставляет SetReadDeadline/SetWriteDeadline перед каждой операцией.

Если подход устраивает — могу прислать PR.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions