Clarify readiness contracts and stop on corrupt accounting

This commit is contained in:
evgeny committed 2026-10-22 22:53:30 +02:00
1 parent e2ee0d81dd
commit 0a00bd1c90
2 files changed
+5 -16

No files matched your search

+2 -13
View File
@@ -46,7 +46,6 @@ static void input_queue_cb(struct ll_queue* q, void* arg);
static void etcp_link_ready_callback(struct ETCP_CONN* etcp);
static void input_send_q_cb(struct ll_queue* q, void* arg);
static void wait_ack_cb(struct ll_queue* q, void* arg);
static void send_ack_req_cb(struct ll_queue* q, void* arg);
static void etcp_conn_process_send_queue(struct ETCP_CONN* etcp);
static void etcp_send_timer_cb(void* arg);
static void etcp_connection_free_deferred(void* arg);
@@ -94,7 +93,7 @@ static void etcp_inflight_release(struct INFLIGHT_PACKET* pkt) {
if (link->inflight_bytes < pkt->ll.len || !link->inflight_packets) {
DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "[%s] inflight accounting mismatch link=%u seq=%u bytes=%u packets=%u len=%u",
link->etcp->log_name, link->local_link_id, pkt->seq, link->inflight_bytes, link->inflight_packets, pkt->ll.len);
return;
abort(); // Повреждённый учёт нельзя продолжать с обёрнутыми/неверными счётчиками.
}
link->inflight_bytes -= pkt->ll.len;
link->inflight_packets--;
@@ -973,7 +972,7 @@ static void input_queue_try_resume(struct ETCP_CONN* etcp) {// при ACK
}
// Called from link-level etcp_link_update_inflight_lim() after inflight_lim_bytes changes.
// Recalculates connection-level optimal_inflight and resumes input_queue if room opened up.
// Recalculates connection-level optimal_inflight and requests one sender pass without changing UP/DOWN.
void etcp_conn_on_inflight_lim_changed(struct ETCP_CONN* etcp) {
if (!etcp || etcp->state == 2) return;
uint64_t sum = 0;
@@ -1162,16 +1161,6 @@ static void input_send_q_cb(struct ll_queue* q, void* arg) {// etcp->input_send_
(void)q;
etcp_conn_wake_sender(arg);
}
/*
static void send_ack_req_cb(struct ll_queue* q, void* arg) {// etcp->ack_q data ready
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "");
struct ETCP_CONN* etcp=(struct ETCP_CONN*)arg;
DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] processing", etcp->log_name);
etcp_conn_process_send_queue(etcp);
if (etcp->tx_state==ETCP_TX_STATE_DATA_WAIT) queue_resume_callback(etcp->ack_q);
}
*/
void etcp_on_link_down(struct ETCP_CONN* etcp, struct ETCP_LINK* down_link) {
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "");
if (!etcp || etcp->state == 2) return;
+3 -3
View File
@@ -25,13 +25,13 @@ struct ETCP_LINK* etcp_loadbalancer_select_link(struct ETCP_CONN* etcp, uint32_t
// Передать dgram с установленным link: после отправки (включая ошибку сокета) возвращает dgram в pkt_pool.
void etcp_loadbalancer_send(struct ETCP_DGRAM* dgram);
// сообщаем в loadbalancer о готовности линка (вызывается из таймера, ACK, изменения лимита)
// Готовность физического линка/его shaper; для ACK/изменения окна использовать etcp_conn_wake_sender.
void loadbalancer_link_ready(struct ETCP_LINK* link);
// Проверяет готовность shaper (burst разрешён); cwnd/inflight учитывает select_link отдельно.
// 1 — shaper готов или активен burst, 0 — NULL/ожидание таймера; физический статус и cwnd проверяет select_link.
int loadbalancer_link_can_send(struct ETCP_LINK* link);
// Получить состояние связи ETCP: 1 - есть живой линк, 0 - все недоступны
// 1 — хотя бы один link_status=UP; 0 — NULL conn, нет линков или все DOWN. Готовность сессии не проверяется.
int etcp_loadbalancer_get_link_status(struct ETCP_CONN* etcp);
#ifdef __cplusplus