diff --git a/src/stream/stream_network.c b/src/stream/stream_network.c index 4f49ed25..282adeba 100644 --- a/src/stream/stream_network.c +++ b/src/stream/stream_network.c @@ -1209,7 +1209,8 @@ int stream_peer_get_load(struct UTUN_INSTANCE *inst, uint64_t node, struct strea .required_rate = p->pressure.required_rate, .released_rate = p->pressure.released_rate, .deadline_ms = p->pressure.deadline_ms, .required_count = p->pressure.required_count, .released_count = p->pressure.released_count, .request_active = p->pressure.active, .cpu_percent = net->cpu.valid ? net->cpu.average_percent : 0, - .callback_late_ms = net->callback_late_ms, .global_pressure = net->global_pressure}; + .callback_late_ms = net->callback_late_ms, .global_pressure = net->global_pressure, + .accepting = !p->pressure.active && !p->cooling}; result.load.queued = p->load.queued; result.load.arrivals = p->load.arrivals; result.load.sent = p->load.sent; result.load.removed = p->load.removed; result.load.rejected = p->load.rejected; struct ETCP_CONN *conn = node_conn_direct_get_conn(p->ncd); diff --git a/src/stream/stream_network.h b/src/stream/stream_network.h index bc6eba7f..2ae9b0b4 100644 --- a/src/stream/stream_network.h +++ b/src/stream/stream_network.h @@ -40,7 +40,7 @@ struct stream_peer_load_info { double cpu_percent; uint64_t callback_late_ms; unsigned required_count, released_count; - int global_pressure, request_active; + int global_pressure, request_active, accepting; }; int stream_peer_get_load(struct UTUN_INSTANCE *inst, uint64_t peer, struct stream_peer_load_info *info); diff --git a/tests/test_stream_service.c b/tests/test_stream_service.c index 312b0fba..74380f33 100644 --- a/tests/test_stream_service.c +++ b/tests/test_stream_service.c @@ -499,6 +499,9 @@ static void test_pressure(void) { /* CPU сам по себе не режет выдачи. Подтверждённый backlog нескольких пиров с локальной загрузкой использует общий бюджет. */ static void test_global_pressure(void) { + uint64_t ready_deadline = get_time_tb() + 10000; + while (!source_load().accepting && get_time_tb() < ready_deadline) test_clock_poll(ua, 100); + CHECK(source_load().accepting); struct STREAM_HANDLE *publisher = NULL, *subscribers[3] = {0}; struct STREAM_RECEIVE *receives[3][2] = {{0}}; struct stream_parameters parameters = {.n = 2, .r = 1, .block_size = STREAM_RS_DEFAULT_SIZE}; CHECK(stream_publish_open(nodes[3], GROUP2, ¶meters, &publisher) == STREAM_OK);