Clarify readiness contracts and stop on corrupt accounting
This commit is contained in:
1 parent
e2ee0d81dd
commit
0a00bd1c90
2 files changed
+5
-16
No files matched your search
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user