NABoolean ComRtGetCpuStatus(char *nodeName, short cpuNum) { NABoolean retval = FALSE; // assume cpu is down MS_Mon_Node_Info_Type nodeInfo; memset(&nodeInfo, 0, sizeof(nodeInfo)); Int32 error = msg_mon_get_node_info_detail(cpuNum, &nodeInfo); if ( XZFIL_ERR_OK == error ) { if ( MS_Mon_State_Up == nodeInfo.node[0].state ) retval = TRUE; } return retval; }
void node_cycle() { int count; int ferr; MS_Mon_Node_Info_Type ninfo; bool pp; MS_Mon_Process_Info_Type *ppinfo1; MS_Mon_Process_Info_Type pinfo1[2]; do { pp = false; do { ferr = msg_mon_get_process_info_type(MS_ProcessType_TSE, // ptype &count, // count 2, // max pinfo1); // info myassert(ferr == XZFIL_ERR_OK); // oops if (count == 0) { sleep(1); printf("count is 0\n"); } } while (count == 0); myassert(count > 0); if (count == 2) pp = true; else { printf("server is not up yet\n"); usleep(10000); // 1/100 sec } } while (!pp); // pick primary if (pinfo1[0].backup) ppinfo1 = &pinfo1[1]; else ppinfo1 = &pinfo1[0]; assert(ferr == XZFIL_ERR_OK); ferr = msg_mon_get_node_info_detail(ppinfo1->nid, &ninfo); assert(ferr == XZFIL_ERR_OK); if (gverbose) printf("node-down(%d)\n", pinfo1->nid); msg_mon_node_down(pinfo1->nid); usleep(100000); // wait_node_notice(); if (gverbose) printf("node-up(%d)\n", pinfo1->nid); msg_mon_node_up(pinfo1->nid); usleep(100000); // wait_node_notice(); }
bool pp_is_backup() { bool backup; int disable; int ferr; MS_Mon_Node_Info_Type node_info; MS_Mon_Process_Info_Type proc_info; ferr = msg_mon_get_process_info_detail(gname, &proc_info); TEST_CHK_FEOK(ferr); gnid = proc_info.nid; gpid = proc_info.pid; backup = proc_info.backup ? true : false; if (backup) { gpeer_nid = proc_info.parent_nid; gpeer_pid = proc_info.parent_pid; // set this up in case register fails strcpy(gdisplay_name, gname); sprintf(&gdisplay_name[strlen(gdisplay_name)], "-%d-%d-%d-B", gnid, gpid, getpid()); if (gverbosepp) pp_printf("we are the backup process.\n"); disable = msg_test_assert_disable(); ferr = msg_mon_register_death_notification(gpeer_nid, gpeer_pid); if (ferr != XZFIL_ERR_OK) { if (gverbosepp) pp_printf("msg_mon_register_death_notification FAILED ferr=%d.\n", ferr); ferr = msg_mon_get_node_info_detail(gpeer_nid, &node_info); myassert(ferr == XZFIL_ERR_OK); if (gverbosepp) pp_printf("node-state=%d.\n", node_info.node[0].state); if (node_info.node[0].state == MS_Mon_State_Shutdown) gshutdown = true; } msg_test_assert_enable(disable); } return backup; }
void kill_server() { int count; int err; int ferr; char killcmd[100]; MS_Mon_Node_Info_Type ninfo; bool pp; MS_Mon_Process_Info_Type *ppinfo1; MS_Mon_Process_Info_Type pinfo1[2]; MS_Mon_Process_Info_Type pinfo2; do { pp = false; ferr = msg_mon_get_process_info_type(MS_ProcessType_TSE, // ptype &count, // count 2, // max pinfo1); // info myassert(ferr == XZFIL_ERR_OK); // oops myassert(count > 0); if (count == 2) pp = true; else { printf("server is not up yet\n"); usleep(10000); // 1/100 sec } } while (!pp); // pick primary if (pinfo1[0].backup) ppinfo1 = &pinfo1[1]; else ppinfo1 = &pinfo1[0]; assert(ferr == XZFIL_ERR_OK); ferr = msg_mon_get_node_info_detail(ppinfo1->nid, &ninfo); assert(ferr == XZFIL_ERR_OK); usleep(gksleep); if (gvirtual || (ppinfo1->nid == gcnid)) { do { if (gverbose) printf("kc=kill(%d, SIGURG)\n", pinfo1->pid); kill(ppinfo1->pid, SIGURG); usleep(1000); err = kill(ppinfo1->pid, 0); if (err == 0) sleep(1); } while (err == 0); } else { assert(ninfo.num_returned == 1); sprintf(killcmd, "pdsh -w %s kill -s URG %d", ninfo.node[0].node_name, ppinfo1->pid); do { if (gverbose) printf("kc=%s\n", killcmd); system(killcmd); ferr = msg_mon_get_process_info_detail((char *) "$srv", &pinfo2); if (ferr == XZFIL_ERR_OK) { if ((pinfo2.nid != ppinfo1->nid) && (pinfo2.pid != ppinfo1->pid)) ferr = XZFIL_ERR_NOSUCHDEV; else sleep(1); } } while (ferr == XZFIL_ERR_OK); } }