===== ndb/include/kernel/signaldata/DumpStateOrd.hpp 1.10 vs edited ===== --- 1.10/ndb/include/kernel/signaldata/DumpStateOrd.hpp 2007-01-12 03:12:09 +07:00 +++ edited/ndb/include/kernel/signaldata/DumpStateOrd.hpp 2007-02-14 08:01:26 +07:00 @@ -107,6 +107,10 @@ public: CmvmiDumpLongSignalMemory = 2601, CmvmiSetRestartOnErrorInsert = 2602, CmvmiTestLongSigWithDelay = 2603, + CmvmiDumpSubscriptions = 2604, /* note: done to respective outfile + to be able to debug if events + for some reason does not end up + in clusterlog */ // 7000 DIH // 7001 DIH // 7002 DIH ===== 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-14 09:18:00 +07:00 @@ -897,7 +897,7 @@ void Cmvmi::execSET_VAR_REQ(Signal* sign 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 @@ Cmvmi::execDUMP_STATE_ORD(Signal* signal } } + if (arg == DumpStateOrd::CmvmiDumpSubscriptions) + { + 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-14 07:57:31 +07:00 @@ -704,7 +704,7 @@ int MgmtSrvr::okToSendTo(NodeId nodeId, return WRONG_PROCESS_TYPE; // Check if we have contact with it if(unCond){ - if(theFacade->theClusterMgr->getNodeInfo(nodeId).connected) + if(theFacade->theClusterMgr->getNodeInfo(nodeId).m_api_reg_conf) return 0; } else if (theFacade->get_node_alive(nodeId) == true) @@ -1562,32 +1562,62 @@ MgmtSrvr::status(int nodeId, } 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, true)) + { + 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 @@ MgmtSrvr::setEventReportingLevelImpl(int 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::showState(NodeId nodeId){ 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 @@ ClusterMgr::execAPI_REGCONF(const Uint32 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 @@ ClusterMgr::reportDisconnected(NodeId no 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-14 07:55:12 +07:00 @@ -65,6 +65,7 @@ public: 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; ===== ndb/src/ndbapi/TransporterFacade.cpp 1.44 vs edited ===== --- 1.44/ndb/src/ndbapi/TransporterFacade.cpp 2006-12-24 02:04:18 +07:00 +++ edited/ndb/src/ndbapi/TransporterFacade.cpp 2007-02-14 07:52:04 +07:00 @@ -805,6 +805,8 @@ TransporterFacade::sendSignal(NdbApiSign Uint32 Tlen = aSignal->theLength; Uint32 TBno = aSignal->theReceiversBlockNumber; if(getIsNodeSendable(aNode) == true){ + assert(theClusterMgr->getNodeInfo(aNode).m_api_reg_conf == true || + aSignal->theVerId_signalNumber == GSN_API_REGREQ); #ifdef API_TRACE if(setSignalLog() && TRACE_GSN(aSignal->theVerId_signalNumber)){ Uint32 tmp = aSignal->theSendersBlockRef;