|
|
|
|
@ -1256,24 +1256,27 @@ static void tcp_link_close_cb(struct stcp_link *sl, int err, void *arg) {
|
|
|
|
|
struct ETCP_LINK *link = (struct ETCP_LINK *)arg; |
|
|
|
|
if (!link || !link->etcp) return; |
|
|
|
|
if (link->etcp->state == 2) return; |
|
|
|
|
/* Сохраняем до каскада: etcp_on_link_down может закрыть conn и освободить link */ |
|
|
|
|
int old_state = link->link_state; |
|
|
|
|
struct ETCP_CONN *etcp = link->etcp; /* сохранить до каскада: etcp_on_link_down может закрыть conn и освободить link */ |
|
|
|
|
int is_server = link->is_server; |
|
|
|
|
int local_link_id = link->local_link_id; |
|
|
|
|
struct ETCP_CONN *etcp = link->etcp; |
|
|
|
|
stcp_link_close(sl); |
|
|
|
|
link->tcp_link = NULL; |
|
|
|
|
|
|
|
|
|
etcp_fire_link_status_cbk(link, old_state, 0); |
|
|
|
|
|
|
|
|
|
if (link->is_server) { |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] TCP server link %d down err=%d, closing", link->etcp->log_name, link->local_link_id, err); |
|
|
|
|
if (is_server) { |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] TCP server link %d down err=%d, closing", etcp->log_name, local_link_id, err); |
|
|
|
|
etcp_on_link_down(etcp, link); |
|
|
|
|
if (etcp->state != 2) { |
|
|
|
|
etcp_link_close(link); |
|
|
|
|
} else { |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] TCP server link %d already closed by conn teardown, skip", |
|
|
|
|
etcp->log_name, link->local_link_id); |
|
|
|
|
etcp->log_name, local_link_id); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] TCP link %d down err=%d, scheduling reconnect", link->etcp->log_name, link->local_link_id, err); |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] TCP link %d down err=%d, scheduling reconnect", etcp->log_name, local_link_id, err); |
|
|
|
|
etcp_on_link_down(etcp, link); |
|
|
|
|
if (etcp->state != 2) etcp_tcp_link_start_reconnect(link); |
|
|
|
|
} |
|
|
|
|
|