@ -181,6 +181,12 @@ struct CONN_MGR_ENTRY* cm_ensure_entry(struct CONN_MGR* mgr, uint64_t node_id) {
void cm_entry_cleanup ( struct CONN_MGR_ENTRY * entry ) {
void cm_entry_cleanup ( struct CONN_MGR_ENTRY * entry ) {
if ( ! entry | | entry - > state = = CONN_MGR_STATE_DISCONNECTED ) return ;
if ( ! entry | | entry - > state = = CONN_MGR_STATE_DISCONNECTED ) return ;
if ( entry - > main . timer ) { uasync_cancel_timeout ( entry - > mgr - > instance - > ua , entry - > main . timer ) ; entry - > main . timer = NULL ; }
if ( entry - > main . timer ) { uasync_cancel_timeout ( entry - > mgr - > instance - > ua , entry - > main . timer ) ; entry - > main . timer = NULL ; }
{ struct cm_reverse_pending * * pp = & entry - > mgr - > reverse_pending ;
while ( * pp ) {
if ( ( * pp ) - > entry = = entry ) { struct cm_reverse_pending * rp = * pp ; * pp = rp - > next ; u_free ( rp ) ; }
else pp = & ( * pp ) - > next ;
}
}
{ struct cm_exchange_pending * * pp = & entry - > mgr - > exchange_pending ;
{ struct cm_exchange_pending * * pp = & entry - > mgr - > exchange_pending ;
while ( * pp ) {
while ( * pp ) {
if ( ( * pp ) - > entry = = entry ) {
if ( ( * pp ) - > entry = = entry ) {
@ -281,6 +287,11 @@ void cm_ncd_callback(struct NODE_CONN_DIRECT* ncd_h, enum ncd_event ncd_ev, void
cm_entry_cleanup ( entry ) ;
cm_entry_cleanup ( entry ) ;
return ;
return ;
}
}
/* Инициатор с handle'ами: выбор следующей фазы делаем только из DIRECT (phase==0).
* В REVERSE ( phase = = 2 ) э с к а л а ц и е й в л а д е е т с о б с т в е н н ы й 15 с т а й м е р , а п о в т о р н ы е
* NCD - т а й м а у т ы ( ш а р и м ы й NCD о ж и в л я е т с я д р у г и м и м о д у л я м и ) и г н о р и р у е м — и н а ч е
* cm_start_phase_reverse у т е ч ё т с т а р ы м и т а й м е р а м и и в ы с т р е л и т в о с в о б о ж д ё н н ы й entry . */
if ( entry - > main . phase = = 2 ) return ;
{ struct TOPO_GROUP * g = entry - > mgr - > group ;
{ struct TOPO_GROUP * g = entry - > mgr - > group ;
struct TOPO_GROUP_NODE * t = topo_node_find_by_id ( g , entry - > node_id ) ;
struct TOPO_GROUP_NODE * t = topo_node_find_by_id ( g , entry - > node_id ) ;
if ( cm_has_direct_ip ( entry - > mgr , g - > local_node ) & & ! ( t & & cm_has_direct_ip ( entry - > mgr , t ) ) )
if ( cm_has_direct_ip ( entry - > mgr , g - > local_node ) & & ! ( t & & cm_has_direct_ip ( entry - > mgr , t ) ) )
@ -684,6 +695,7 @@ void cm_start_phase_reverse(struct CONN_MGR_ENTRY* entry) {
etcp_route_send ( entry - > mgr - > instance , group - > group_id , entry - > node_id , qe , 1 , 0 ) ;
etcp_route_send ( entry - > mgr - > instance , group - > group_id , entry - > node_id , qe , 1 , 0 ) ;
struct cm_reverse_pending * rp = u_calloc ( 1 , sizeof ( * rp ) ) ;
struct cm_reverse_pending * rp = u_calloc ( 1 , sizeof ( * rp ) ) ;
if ( rp ) { rp - > request_id = req_id ; rp - > entry = entry ; rp - > next = entry - > mgr - > reverse_pending ; entry - > mgr - > reverse_pending = rp ; }
if ( rp ) { rp - > request_id = req_id ; rp - > entry = entry ; rp - > next = entry - > mgr - > reverse_pending ; entry - > mgr - > reverse_pending = rp ; }
if ( entry - > main . timer ) { uasync_cancel_timeout ( entry - > mgr - > instance - > ua , entry - > main . timer ) ; entry - > main . timer = NULL ; }
entry - > main . timer = uasync_set_timeout ( entry - > mgr - > instance - > ua , CONN_MGR_CONNECT_REVERSE_TIMEOUT_MS * 10 ,
entry - > main . timer = uasync_set_timeout ( entry - > mgr - > instance - > ua , CONN_MGR_CONNECT_REVERSE_TIMEOUT_MS * 10 ,
entry , cm_reverse_timeout_cb , " conn_mgr_reverse " ) ;
entry , cm_reverse_timeout_cb , " conn_mgr_reverse " ) ;
DEBUG_INFO ( DEBUG_CATEGORY_GENERAL , " conn_mgr: phase 2 (reverse) sent DIRECT_REQ to 0x%016llx with %u addrs " ,
DEBUG_INFO ( DEBUG_CATEGORY_GENERAL , " conn_mgr: phase 2 (reverse) sent DIRECT_REQ to 0x%016llx with %u addrs " ,