===== ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp 1.30 vs edited ===== --- 1.30/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp 2007-01-18 03:18:46 +07:00 +++ edited/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp 2007-02-13 12:58:15 +07:00 @@ -897,7 +897,7 @@ case TimeToWaitAlive: // QMGR - case HeartbeatIntervalDbDb: // TODO ev till Ndbcnt också + case HeartbeatIntervalDbDb: // TODO possibly Ndbcnt too case HeartbeatIntervalDbApi: case ArbitTimeout: sendSignal(QMGR_REF, GSN_SET_VAR_REQ, signal, 3, JBB); @@ -1105,6 +1105,24 @@ } } + if (arg == 2604) + { + SubscriberPtr ptr; + subscribers.first(ptr); + g_eventLogger.info("List subscriptions:"); + while(ptr.i != RNIL) + { + g_eventLogger.info("Subscription: %u, nodeId: %u, ref: 0x%x", + ptr.i, refToNode(ptr.p->blockRef), ptr.p->blockRef); + for(Uint32 i = 0; i < LogLevel::LOGLEVEL_CATEGORIES; i++) + { + Uint32 level = ptr.p->logLevel.getLogLevel((LogLevel::EventCategory)i); + g_eventLogger.info("Category %u Level %u", i, level); + } + subscribers.next(ptr); + } + } + if (arg == DumpStateOrd::CmvmiDumpLongSignalMemory){ infoEvent("Cmvmi: g_sectionSegmentPool size: %d free: %d", g_sectionSegmentPool.getSize(), ===== ndb/src/mgmsrv/MgmtSrvr.cpp 1.111 vs edited ===== --- 1.111/ndb/src/mgmsrv/MgmtSrvr.cpp 2007-01-23 11:44:36 +07:00 +++ edited/ndb/src/mgmsrv/MgmtSrvr.cpp 2007-02-13 13:30:52 +07:00 @@ -70,7 +70,7 @@ SignalSender ss(theFacade); \ ss.lock(); /* lock will be released on exit */ \ {\ - int result = okToSendTo(nodeId, true);\ + int result = okToSendTo(nodeId, false);\ if (result != 0) {\ return result;\ }\ @@ -707,7 +707,7 @@ if(theFacade->theClusterMgr->getNodeInfo(nodeId).connected) return 0; } - else if (theFacade->get_node_alive(nodeId) == true) + else if (theFacade->theClusterMgr->getNodeInfo(nodeId).m_api_reg_conf == true) return 0; return NO_CONTACT_WITH_PROCESS; } @@ -1067,7 +1067,7 @@ nodeId= 0; while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)) { - if(okToSendTo(nodeId, true) == 0) + if(okToSendTo(nodeId, false) == 0) { SendStatus result = ss.sendSignal(nodeId, &ssig); if (result == SEND_OK) @@ -1085,14 +1085,14 @@ assert(nodes.count() == 0); if (use_master_node) nodeId= m_master_node; - if ((r= okToSendTo(nodeId, true)) != 0) + if ((r= okToSendTo(nodeId, false)) != 0) { bool next; if (!use_master_node) DBUG_RETURN(r); m_master_node= nodeId= 0; while((next= getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)) == true && - (r= okToSendTo(nodeId, true)) != 0); + (r= okToSendTo(nodeId, false)) != 0); if (!next) DBUG_RETURN(NO_CONTACT_WITH_DB_NODES); } @@ -1448,7 +1448,7 @@ resumeReq->senderRef = ss.getOwnRef(); while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)){ - if(okToSendTo(nodeId, true) == 0){ + if(okToSendTo(nodeId, false) == 0){ SendStatus result = ss.sendSignal(nodeId, &ssig); if (result == SEND_OK) count++; @@ -1562,32 +1562,62 @@ } int -MgmtSrvr::setEventReportingLevelImpl(int nodeId, +MgmtSrvr::setEventReportingLevelImpl(int nodeId_arg, const EventSubscribeReq& ll) { SignalSender ss(theFacade); - ss.lock(); - - SimpleSignal ssig; - EventSubscribeReq * dst = - CAST_PTR(EventSubscribeReq, ssig.getDataPtrSend()); - ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_EVENT_SUBSCRIBE_REQ, - EventSubscribeReq::SignalLength); - *dst = ll; - - NodeBitmask nodes; + NdbNodeBitmask nodes; + int retries = 30; nodes.clear(); - Uint32 max = (nodeId == 0) ? (nodeId = 1, MAX_NDB_NODES) : nodeId; - for(; (Uint32) nodeId <= max; nodeId++) + while (1) { - if (nodeTypes[nodeId] != NODE_TYPE_DB) - continue; - if (okToSendTo(nodeId, true)) - continue; - if (ss.sendSignal(nodeId, &ssig) == SEND_OK) + Uint32 nodeId, max; + ss.lock(); + SimpleSignal ssig; + EventSubscribeReq * dst = + CAST_PTR(EventSubscribeReq, ssig.getDataPtrSend()); + ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_EVENT_SUBSCRIBE_REQ, + EventSubscribeReq::SignalLength); + *dst = ll; + + nodeId = nodeId_arg; + max = (nodeId == 0) ? (nodeId = 1, MAX_NDB_NODES) : nodeId; + for(; nodeId <= max; nodeId++) { - nodes.set(nodeId); + if (nodeTypes[nodeId] != NODE_TYPE_DB) + continue; + if (okToSendTo(nodeId, false)) + { + if (theFacade->theClusterMgr->getNodeInfo(nodeId).connected == false) + { + // node not connected we can safely skip this one + continue; + } + // api_reg_conf not recevied yet, need to retry + break; + } } + if (nodeId <= max) + { + if (--retries) + { + ss.unlock(); + NdbSleep_MilliSleep(100); + continue; + } + return SEND_OR_RECEIVE_FAILED; + } + + nodeId = nodeId_arg; + max = (nodeId == 0) ? (nodeId = 1, MAX_NDB_NODES) : nodeId; + for(; (Uint32) nodeId <= max; nodeId++) + { + if (nodeTypes[nodeId] != NODE_TYPE_DB) + continue; + if (ss.sendSignal(nodeId, &ssig) == SEND_OK) + nodes.set(nodeId); + } + break; } if (nodes.isclear()) @@ -1598,6 +1628,7 @@ int error = 0; while (!nodes.isclear()) { + Uint32 nodeId; SimpleSignal *signal = ss.waitFor(); int gsn = signal->readSignalNumber(); nodeId = refToNode(signal->header.theSendersBlockRef); ===== ndb/src/ndbapi/ClusterMgr.cpp 1.31 vs edited ===== --- 1.31/ndb/src/ndbapi/ClusterMgr.cpp 2007-01-23 11:44:36 +07:00 +++ edited/ndb/src/ndbapi/ClusterMgr.cpp 2007-02-13 12:58:18 +07:00 @@ -327,7 +327,7 @@ ClusterMgr::Node::Node() : m_state(NodeState::SL_NOTHING) { compatible = nfCompleteRep = true; - connected = defined = m_alive = false; + connected = defined = m_alive = m_api_reg_conf = false; m_state.m_connected_nodes.clear(); } @@ -401,6 +401,8 @@ node.m_info.m_version); } + node.m_api_reg_conf = true; + node.m_state = apiRegConf->nodeState; if (node.compatible && (node.m_state.startLevel == NodeState::SL_STARTED || node.m_state.startLevel == NodeState::SL_SINGLEUSER)){ @@ -519,6 +521,7 @@ noOfConnectedNodes--; theNodes[nodeId].connected = false; + theNodes[nodeId].m_api_reg_conf = false; theNodes[nodeId].m_state.m_connected_nodes.clear(); reportNodeFailed(nodeId, true); ===== ndb/src/ndbapi/ClusterMgr.hpp 1.13 vs edited ===== --- 1.13/ndb/src/ndbapi/ClusterMgr.hpp 2007-01-23 11:44:36 +07:00 +++ edited/ndb/src/ndbapi/ClusterMgr.hpp 2007-02-13 12:58:18 +07:00 @@ -65,6 +65,7 @@ bool compatible; // Version is compatible bool nfCompleteRep; // NF Complete Rep has arrived bool m_alive; // Node is alive + bool m_api_reg_conf;// API_REGCONF has arrived NodeInfo m_info; NodeState m_state;