===== storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp 1.43 vs edited ===== --- 1.43/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp 2007-02-06 04:13:43 +07:00 +++ edited/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp 2007-02-13 11:42:18 +07:00 @@ -924,7 +924,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); @@ -1132,6 +1132,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(), ===== storage/ndb/src/mgmsrv/MgmtSrvr.cpp 1.119 vs edited ===== --- 1.119/storage/ndb/src/mgmsrv/MgmtSrvr.cpp 2007-02-06 04:13:44 +07:00 +++ edited/storage/ndb/src/mgmsrv/MgmtSrvr.cpp 2007-02-13 11:19:33 +07:00 @@ -1593,32 +1593,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; - 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++) + { + if (nodeTypes[nodeId] != NODE_TYPE_DB) + continue; + if (theFacade->theClusterMgr->getNodeInfo(nodeId).m_api_reg_conf == 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++) { - nodes.set(nodeId); + if (nodeTypes[nodeId] != NODE_TYPE_DB) + continue; + if (ss.sendSignal(nodeId, &ssig) == SEND_OK) + nodes.set(nodeId); } + break; } if (nodes.isclear()) @@ -1629,6 +1659,7 @@ int error = 0; while (!nodes.isclear()) { + Uint32 nodeId; SimpleSignal *signal = ss.waitFor(); int gsn = signal->readSignalNumber(); nodeId = refToNode(signal->header.theSendersBlockRef); ===== storage/ndb/src/ndbapi/ClusterMgr.cpp 1.35 vs edited ===== --- 1.35/storage/ndb/src/ndbapi/ClusterMgr.cpp 2007-02-08 03:04:53 +07:00 +++ edited/storage/ndb/src/ndbapi/ClusterMgr.cpp 2007-02-13 10:39:23 +07:00 @@ -314,7 +314,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(); } @@ -402,6 +402,8 @@ */ memcpy(&node.m_state, &apiRegConf->nodeState, sizeof(node.m_state) - 24); } + + node.m_api_reg_conf = true; if (node.compatible && (node.m_state.startLevel == NodeState::SL_STARTED || node.m_state.startLevel == NodeState::SL_SINGLEUSER)){ @@ -518,6 +520,7 @@ noOfConnectedNodes--; theNodes[nodeId].connected = false; + theNodes[nodeId].m_api_reg_conf = false; theNodes[nodeId].m_state.m_connected_nodes.clear(); reportNodeFailed(nodeId, true); ===== storage/ndb/src/ndbapi/ClusterMgr.hpp 1.17 vs edited ===== --- 1.17/storage/ndb/src/ndbapi/ClusterMgr.hpp 2007-02-08 03:04:53 +07:00 +++ edited/storage/ndb/src/ndbapi/ClusterMgr.hpp 2007-02-13 10:14:25 +07:00 @@ -70,6 +70,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;