fix(memory): ограничить чтения неограниченного вывода в память
На роутере со 128 МБ несколько мест читали в память вывод, размер которого ничем не ограничен. Распаковка gzip подписки шла через пайп с чтением целиком: скачивание curl ограничено 15 МБ, но коэффициент сжатия base64-текста высокий, так что пик доходил до десятков мегабайт. Оба вызывающих места передают файл и ждут файл, поэтому распакованный поток теперь уходит редиректом сразу в выходной файл, а успех определяется по коду возврата и ненулевому размеру. Таблица nftables содержит сеты с десятками тысяч элементов из списков, и `nft list table` печатает их все. Проба контроллера делала это каждый тик, хотя ищет только имена цепочек и правил; четыре проверки доктора и вывод чужих меток из полного рулесета — то же самое. Везде добавлен grep на источнике, отбирающий только те строки, которые код потом и разбирает. Два просмотра логов читали кольцевой буфер syslog целиком, чтобы показать несколько сотен строк; теперь количество строк ограничено на стороне logread.
This commit is contained in:
@@ -630,8 +630,8 @@ function controller(bus, opts) {
|
||||
|
||||
let nft_table = getenv("NFT_TABLE_NAME") || "TachyonTable";
|
||||
let routing_mode = setting("routing_mode", "nftables");
|
||||
// One `nft list` serves both the table check and the QoS check.
|
||||
let out_nft = command_output_from_args(["nft", "list", "table", "inet", nft_table]);
|
||||
let out_nft = command_output_from_args(["sh", "-c",
|
||||
"nft list table inet " + nft_table + " | grep -E 'chain|tproxy|priority_rules|dscp'; exit 0"]);
|
||||
|
||||
if (routing_mode == "nftables") {
|
||||
if (index(out_nft, "tproxy") < 0 || index(out_nft, "priority_rules") < 0) {
|
||||
|
||||
Reference in New Issue
Block a user