void Cmvmi::execSTTOR(Signal* signal) { Uint32 theStartPhase = signal->theData[1]; jamEntry(); if (theStartPhase == 1){ jam(); if(m_ctx.m_config.lockPagesInMainMemory() == 1) { int res = NdbMem_MemLockAll(0); if(res != 0){ g_eventLogger.warning("Failed to memlock pages"); warningEvent("Failed to memlock pages"); } } sendSTTORRY(signal); return; } else if (theStartPhase == 3) { jam(); globalData.activateSendPacked = 1; sendSTTORRY(signal); } else if (theStartPhase == 8){ /*---------------------------------------------------*/ /* Open com to API + REP nodes */ /*---------------------------------------------------*/ signal->theData[0] = 0; // no answer signal->theData[1] = 0; // no id signal->theData[2] = NodeInfo::API; execOPEN_COMREQ(signal); globalData.theStartLevel = NodeState::SL_STARTED; sendSTTORRY(signal); } }
bool Transporter::connect_client(NDB_SOCKET_TYPE sockfd) { if(m_connected) return true; if (sockfd == NDB_INVALID_SOCKET) return false; DBUG_ENTER("Transporter::connect_client"); DBUG_PRINT("info",("port %d isMgmConnection=%d",m_s_port,isMgmConnection)); SocketOutputStream s_output(sockfd); SocketInputStream s_input(sockfd); // send info about own id // send info about own transporter type s_output.println("%d %d", localNodeId, m_type); // get remote id int nodeId, remote_transporter_type= -1; char buf[256]; if (s_input.gets(buf, 256) == 0) { NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); } int r= sscanf(buf, "%d %d", &nodeId, &remote_transporter_type); switch (r) { case 2: break; case 1: // we're running version prior to 4.1.9 // ok, but with no checks on transporter configuration compatability break; default: NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); } DBUG_PRINT("info", ("nodeId=%d remote_transporter_type=%d", nodeId, remote_transporter_type)); if (remote_transporter_type != -1) { if (remote_transporter_type != m_type) { DBUG_PRINT("error", ("Transporter types mismatch this=%d remote=%d", m_type, remote_transporter_type)); NDB_CLOSE_SOCKET(sockfd); g_eventLogger.error("Incompatible configuration: transporter type " "mismatch with node %d", nodeId); DBUG_RETURN(false); } } else if (m_type == tt_SHM_TRANSPORTER) { g_eventLogger.warning("Unable to verify transporter compatability with node %d", nodeId); } { struct sockaddr_in addr; SOCKET_SIZE_TYPE addrlen= sizeof(addr); getpeername(sockfd, (struct sockaddr*)&addr, &addrlen); m_connect_address= (&addr)->sin_addr; } bool res = connect_client_impl(sockfd); if(res){ m_connected = true; m_errorCount = 0; } DBUG_RETURN(res); }
bool TransporterRegistry::connect_server(NDB_SOCKET_TYPE sockfd) { DBUG_ENTER("TransporterRegistry::connect_server"); // read node id from client // read transporter type int nodeId, remote_transporter_type= -1; SocketInputStream s_input(sockfd); char buf[256]; if (s_input.gets(buf, 256) == 0) { DBUG_PRINT("error", ("Could not get node id from client")); DBUG_RETURN(false); } int r= sscanf(buf, "%d %d", &nodeId, &remote_transporter_type); switch (r) { case 2: break; case 1: // we're running version prior to 4.1.9 // ok, but with no checks on transporter configuration compatability break; default: DBUG_PRINT("error", ("Error in node id from client")); DBUG_RETURN(false); } DBUG_PRINT("info", ("nodeId=%d remote_transporter_type=%d", nodeId,remote_transporter_type)); //check that nodeid is valid and that there is an allocated transporter if ( nodeId < 0 || nodeId >= (int)maxTransporters) { DBUG_PRINT("error", ("Node id out of range from client")); DBUG_RETURN(false); } if (theTransporters[nodeId] == 0) { DBUG_PRINT("error", ("No transporter for this node id from client")); DBUG_RETURN(false); } //check that the transporter should be connected if (performStates[nodeId] != TransporterRegistry::CONNECTING) { DBUG_PRINT("error", ("Transporter in wrong state for this node id from client")); DBUG_RETURN(false); } Transporter *t= theTransporters[nodeId]; // send info about own id (just as response to acknowledge connection) // send info on own transporter type SocketOutputStream s_output(sockfd); s_output.println("%d %d", t->getLocalNodeId(), t->m_type); if (remote_transporter_type != -1) { if (remote_transporter_type != t->m_type) { DBUG_PRINT("error", ("Transporter types mismatch this=%d remote=%d", t->m_type, remote_transporter_type)); g_eventLogger.error("Incompatible configuration: Transporter type " "mismatch with node %d", nodeId); // wait for socket close for 1 second to let message arrive at client { fd_set a_set; FD_ZERO(&a_set); FD_SET(sockfd, &a_set); struct timeval timeout; timeout.tv_sec = 1; timeout.tv_usec = 0; select(sockfd+1, &a_set, 0, 0, &timeout); } DBUG_RETURN(false); } } else if (t->m_type == tt_SHM_TRANSPORTER) { g_eventLogger.warning("Unable to verify transporter compatability with node %d", nodeId); } // setup transporter (transporter responsible for closing sockfd) t->connect_server(sockfd); DBUG_RETURN(true); }
void WatchDog::run() { unsigned int anIPValue, sleep_time; unsigned int oldIPValue = 0; unsigned int theIntervalCheck = theInterval; struct MicroSecondTimer start_time, last_time, now; NdbTick_getMicroTimer(&start_time); last_time = start_time; // WatchDog for the single threaded NDB while (!theStop) { sleep_time= 100; NdbSleep_MilliSleep(sleep_time); if(theStop) break; NdbTick_getMicroTimer(&now); if (NdbTick_getMicrosPassed(last_time, now)/1000 > sleep_time*2) { struct tms my_tms; times(&my_tms); g_eventLogger.info("Watchdog: User time: %llu System time: %llu", (Uint64)my_tms.tms_utime, (Uint64)my_tms.tms_stime); g_eventLogger.warning("Watchdog: Warning overslept %u ms, expected %u ms.", NdbTick_getMicrosPassed(last_time, now)/1000, sleep_time); } last_time = now; // Verify that the IP thread is not stuck in a loop anIPValue = *theIPValue; if (anIPValue != 0) { oldIPValue = anIPValue; globalData.incrementWatchDogCounter(0); NdbTick_getMicroTimer(&start_time); theIntervalCheck = theInterval; } else { int warn = 1; Uint32 elapsed = NdbTick_getMicrosPassed(start_time, now)/1000; /* oldIPValue == 9 indicates malloc going on, this can take some time so only warn if we pass the watchdog interval */ if (oldIPValue == 9) if (elapsed < theIntervalCheck) warn = 0; else theIntervalCheck += theInterval; if (warn) { const char *last_stuck_action = get_action(oldIPValue); g_eventLogger.warning("Ndb kernel is stuck in: %s", last_stuck_action); { struct tms my_tms; times(&my_tms); g_eventLogger.info("Watchdog: User time: %llu System time: %llu", (Uint64)my_tms.tms_utime, (Uint64)my_tms.tms_stime); } if (elapsed > 3 * theInterval) { shutdownSystem(last_stuck_action); } } } } return; }