// get a random db server connection in the range [start_pos, stop_pos) static CDBServConn* get_db_server_conn_in_range(uint32_t start_pos, uint32_t stop_pos) { uint32_t i = 0; CDBServConn* pDbConn = NULL; // determine if there is a valid DB server connection for (i = start_pos; i < stop_pos; i++) { pDbConn = (CDBServConn*)g_db_server_list[i].serv_conn; if (pDbConn && pDbConn->IsOpen()) { break; } } // no valid DB server connection if (i == stop_pos) { return NULL; } // return a random valid DB server connection while (true) { int i = rand() % (stop_pos - start_pos) + start_pos; pDbConn = (CDBServConn*)g_db_server_list[i].serv_conn; if (pDbConn && pDbConn->IsOpen()) { break; } } return pDbConn; }
static void db_server_conn_timer_callback(void* callback_data, uint8_t msg, uint32_t handle, void* pParam) { ConnMap_t::iterator it_old; CDBServConn* pConn = NULL; uint64_t cur_time = get_tick_count(); for (ConnMap_t::iterator it = g_db_server_conn_map.begin(); it != g_db_server_conn_map.end(); ) { it_old = it; it++; pConn = (CDBServConn*)it_old->second; if (pConn->IsOpen()) { pConn->OnTimer(cur_time); } } // reconnect DB Storage Server // will reconnect in 4s, 8s, 16s, 32s, 64s, 4s 8s ... serv_check_reconnect<CDBServConn>(g_db_server_list, g_db_server_count); }