void north_lbg_entry_timeout_CBK (void *opaque) { int ret; north_lbg_entry_ctx_t *entry_p = (north_lbg_entry_ctx_t*)opaque; // entry_p->rpc_guard_timer_flg = TRUE; entry_p->stats.totalConnectAttempts++; ret = af_unix_sock_client_reconnect(entry_p->sock_ctx_ref); if (ret < 0) { // printf("north_lbg_entry_timeout_CBK-->fatal error on reconnect\n"); /* ** restart the timer */ north_lbg_entry_start_timer(entry_p,ROZOFS_TMR_GET(TMR_TCP_RECONNECT)); } }
void north_lbg_userDiscCallBack(void *userRef,uint32_t socket_context_ref,void *bufRef,int err_no) { // int len; int ret; int8_t retry_counter; north_lbg_entry_ctx_t *entry_p = (north_lbg_entry_ctx_t*)userRef; north_lbg_ctx_t *lbg_p = (north_lbg_ctx_t*)entry_p->parent; ruc_obj_desc_t *pnext = (ruc_obj_desc_t*)NULL; int up2down_transition = 0; /* ** change the state to DOWN */ if (entry_p->state != NORTH_LBG_DOWN) { north_lbg_entry_state_change(entry_p,NORTH_LBG_DOWN); warning("north_lbg_userDiscCallBack : LBG %s entry %d \n",lbg_p->name, entry_p->index); up2down_transition = 1; } /* **get the pointer to the destination stored in the buffer */ while (bufRef != NULL) { /* ** get the retry counter of the buffer */ retry_counter = ruc_buf_get_retryCounter(bufRef); if ((lbg_p->state == NORTH_LBG_DOWN) && (lbg_p->rechain_when_lbg_gets_down == 1)) { /* ** The lbg is down but we re-send on it hoping it will comme back up soon */ if (retry_counter < lbg_p->nb_entries_conf) { retry_counter +=1; ruc_buf_set_retryCounter(bufRef,retry_counter); /* ** resend by selecting a new destination */ lbg_p->stats.totalXmitRetries++; //info("rechain on LBG %d",lbg_p->index); north_lbg_send(lbg_p->index,bufRef); break; } } // if ((retry_counter >= NORTH_LBG_MAX_RETRY) || (lbg_p->state == NORTH_LBG_DOWN)) if ((retry_counter >= lbg_p->nb_entries_conf) || (lbg_p->state == NORTH_LBG_DOWN)) { /* ** inform the application or release the buffer */ lbg_p->stats.totalXmitAborts++; if (lbg_p->userDiscCallBack!= NULL) { (lbg_p->userDiscCallBack)(NULL,lbg_p->index,bufRef, err_no); break; } /* ** release the buffer */ //#warning Need to check the in_use counter of the buffer before the release ruc_buf_freeBuffer(bufRef); break; } /* ** the lbg is still up and there the retry count is not exhausted */ retry_counter +=1; ruc_buf_set_retryCounter(bufRef,retry_counter); /* ** resend by selecting a new destination */ lbg_p->stats.totalXmitRetries++; north_lbg_send(lbg_p->index,bufRef); break; } /* ** OK, now go the buffer that might be queued on that entry and do the same */ while ((bufRef = (void*) ruc_objGetNext((ruc_obj_desc_t*)&entry_p->xmitList, &pnext)) !=NULL) { /* ** remove it from the list because it might be queued afterwards on a new queue */ ruc_objRemove((ruc_obj_desc_t*)bufRef); while (1) { /* ** get the retry counter of the buffer */ retry_counter = ruc_buf_get_retryCounter(bufRef); if ((lbg_p->state == NORTH_LBG_DOWN) && (lbg_p->rechain_when_lbg_gets_down == 1)) { /* ** The lbg is down but we re-send on it hoping it will comme back up soon */ if (retry_counter < lbg_p->nb_entries_conf) { retry_counter +=1; ruc_buf_set_retryCounter(bufRef,retry_counter); /* ** resend by selecting a new destination */ lbg_p->stats.totalXmitRetries++; # //info("rechain on LBG %d",lbg_p->index); north_lbg_send(lbg_p->index,bufRef); break; } } // if ((retry_counter >= NORTH_LBG_MAX_RETRY) || (lbg_p->state == NORTH_LBG_DOWN)) if ((retry_counter >= lbg_p->nb_entries_conf) || (lbg_p->state == NORTH_LBG_DOWN)) { /* ** inform the application or release the buffer */ lbg_p->stats.totalXmitAborts++; if (lbg_p->userDiscCallBack!= NULL) { (lbg_p->userDiscCallBack)(NULL,lbg_p->index,bufRef, err_no); break; } /* ** release the buffer */ ruc_buf_freeBuffer(bufRef); break; } /* ** the lbg is still up and there the retry count is not exhausted */ retry_counter +=1; ruc_buf_set_retryCounter(bufRef,retry_counter); /* ** resend by selecting a new destination */ lbg_p->stats.totalXmitRetries++; north_lbg_send(lbg_p->index,bufRef); break; } } /* ** do the reconnect on UP 2 DOWN transition only */ if (up2down_transition) { entry_p->stats.totalConnectAttempts++; ret = af_unix_sock_client_reconnect(socket_context_ref); if (ret < 0) { // printf("north_lbg_userDiscCallBack->fatal error on reconnect\n"); north_lbg_entry_start_timer(entry_p,ROZOFS_TMR_GET(TMR_TCP_FIRST_RECONNECT)); } } }