int getStatus(){ int retries = 0; struct ndb_mgm_cluster_state * status; struct ndb_mgm_node_state * node; ndbNodes.clear(); while(retries < 10){ status = ndb_mgm_get_status(handle); if (status == NULL){ ndbout << "status==NULL, retries="<<retries<<endl; MGMERR(handle); retries++; ndb_mgm_disconnect(handle); if (ndb_mgm_connect(handle,0,0,1)) { MGMERR(handle); g_err << "Reconnect failed" << endl; break; } continue; } int count = status->no_of_nodes; for (int i = 0; i < count; i++){ node = &status->node_states[i]; switch(node->node_type){ case NDB_MGM_NODE_TYPE_NDB: if (!nowait_nodes_bitmask.get(node->node_id)) ndbNodes.push_back(*node); break; case NDB_MGM_NODE_TYPE_MGM: /* Don't care about MGM nodes */ break; case NDB_MGM_NODE_TYPE_API: /* Don't care about API nodes */ break; default: if(node->node_status == NDB_MGM_NODE_STATUS_UNKNOWN || node->node_status == NDB_MGM_NODE_STATUS_NO_CONTACT){ retries++; ndbNodes.clear(); free(status); status = NULL; count = 0; ndbout << "kalle"<< endl; break; } abort(); break; } } if(status == 0){ ndbout << "status == 0" << endl; continue; } free(status); return 0; } return -1; }
static int waitClusterStatus(const char* _addr, ndb_mgm_node_status _status) { int _startphase = -1; #ifndef NDB_WIN /* Ignore SIGPIPE */ signal(SIGPIPE, SIG_IGN); #endif handle = ndb_mgm_create_handle(); if (handle == NULL){ g_err << "Could not create ndb_mgm handle" << endl; return -1; } g_info << "Connecting to mgmsrv at " << _addr << endl; if (ndb_mgm_set_connectstring(handle, _addr)) { MGMERR(handle); g_err << "Connectstring " << _addr << " invalid" << endl; return -1; } if (ndb_mgm_connect(handle,0,0,1)) { MGMERR(handle); g_err << "Connection to " << _addr << " failed" << endl; return -1; } int attempts = 0; int resetAttempts = 0; const int MAX_RESET_ATTEMPTS = 10; bool allInState = false; Uint64 time_now = NdbTick_CurrentMillisecond(); Uint64 timeout_time = time_now + 1000 * _timeout; while (allInState == false){ if (_timeout > 0 && time_now > timeout_time){ /** * Timeout has expired waiting for the nodes to enter * the state we want */ bool waitMore = false; /** * Make special check if we are waiting for * cluster to become started */ if(_status == NDB_MGM_NODE_STATUS_STARTED){ waitMore = true; /** * First check if any node is not starting * then it's no idea to wait anymore */ for (size_t n = 0; n < ndbNodes.size(); n++){ if (ndbNodes[n].node_status != NDB_MGM_NODE_STATUS_STARTED && ndbNodes[n].node_status != NDB_MGM_NODE_STATUS_STARTING) waitMore = false; } } if (!waitMore || resetAttempts > MAX_RESET_ATTEMPTS){ g_err << "waitNodeState(" << ndb_mgm_get_node_status_string(_status) <<", "<<_startphase<<")" << " timeout after " << attempts << " attempts" << endl; return -1; } g_err << "waitNodeState(" << ndb_mgm_get_node_status_string(_status) <<", "<<_startphase<<")" << " resetting timeout " << resetAttempts << endl; timeout_time = time_now + 1000 * _timeout; resetAttempts++; } if (attempts > 0) NdbSleep_MilliSleep(100); if (getStatus() != 0){ return -1; } /* Assume all nodes are in state(if there is any) */ allInState = (ndbNodes.size() > 0); /* Loop through all nodes and check their state */ for (size_t n = 0; n < ndbNodes.size(); n++) { ndb_mgm_node_state* ndbNode = &ndbNodes[n]; assert(ndbNode != NULL); g_info << "Node " << ndbNode->node_id << ": " << ndb_mgm_get_node_status_string(ndbNode->node_status)<< endl; if (ndbNode->node_status != _status) allInState = false; } if (!allInState) { char time[9]; g_info << "[" << getTimeAsString(time) << "] " << "Waiting for cluster enter state " << ndb_mgm_get_node_status_string(_status) << endl; } attempts++; time_now = NdbTick_CurrentMillisecond(); } return 0; }
int main(int argc, char** argv) { NDB_INIT(argv[0]); const char *load_default_groups[]= { "mysql_cluster",0 }; ndb_load_defaults(NULL,load_default_groups,&argc,&argv); int ho_error; #ifndef DBUG_OFF opt_debug= "d:t:O,/tmp/eventlog.trace"; #endif #ifndef _WIN32 // Catching signal to allow testing of EINTR safeness // with "while killall -USR1 eventlog; do true; done" signal(SIGUSR1, catch_signal); #endif if ((ho_error=handle_options(&argc, &argv, my_long_options, ndb_std_get_one_option))) return NDBT_ProgramExit(NDBT_WRONGARGS); NdbMgmHandle handle= ndb_mgm_create_handle(); ndb_mgm_set_connectstring(handle, opt_ndb_connectstring); while (true) { if (ndb_mgm_connect(handle,0,0,0) == -1) { ndbout_c("Failed to connect"); exit(0); } NdbLogEventHandle le = ndb_mgm_create_logevent_handle(handle, filter); if (le == 0) { ndbout_c("Failed to create logevent handle"); exit(0); } struct ndb_logevent event; while (true) { int r= ndb_logevent_get_next(le, &event,5000); if (r < 0) { ndbout_c("Error while getting next event"); break; } if (r == 0) { continue; } ndbout_c("Got event: %d", event.type); } ndb_mgm_destroy_logevent_handle(&le); ndb_mgm_disconnect(handle); } return 0; }