diff --git a/src/stream/stream_load.c b/src/stream/stream_load.c index f80d956a..37fc8445 100644 --- a/src/stream/stream_load.c +++ b/src/stream/stream_load.c @@ -37,7 +37,7 @@ int stream_load_remove(struct stream_load *load, uint64_t packets, uint64_t byte void stream_load_changed(struct stream_load *load) { if (!load) { DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "load change null context"); return; } - load->revision++; load->candidate = 0; + load->revision++; load->candidate = 0; load->snapshot.growth_rate = 0; } /* Сохраняем только законченные интервалы, без округления фактического времени по числу тиков. */ diff --git a/src/stream/stream_network.c b/src/stream/stream_network.c index 37611afd..4f49ed25 100644 --- a/src/stream/stream_network.c +++ b/src/stream/stream_network.c @@ -1145,6 +1145,11 @@ static void pressure_tick(struct stream_network *net, uint64_t now) { net->global_pressure = net->global_candidate && now - net->global_since_ms >= STREAM_LOAD_CONFIRM_MS; if (net->global_pressure) { uint64_t required = global.growth_rate ? global.growth_rate + global.growth_rate / 100 + 1 : global.queued.bytes / 2 + 1; + for (struct stream_peer *p = net->peers; p && required; p = p->next) if (p->pressure.active) { + uint64_t pending = p->pressure.required_rate > p->pressure.released_rate + ? p->pressure.required_rate - p->pressure.released_rate : 0; + required = pending >= required ? 0 : required - pending; + } for (unsigned pass = 0; pass < net->peer_count && required; pass++) { struct stream_peer *best = NULL; uint64_t best_rate = 0; for (struct stream_peer *p = net->peers; p; p = p->next) {