diff --git a/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp b/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp index 0fdce8b5166fbc391b5d7e89e0ae6b7ddedd440d..674b8bf0669049b927099459da0a5421ef3940a5 100644 --- a/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp +++ b/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp @@ -455,6 +455,12 @@ private: void recompute_version_info(Uint32 type, Uint32 version); void execNODE_VERSION_REP(Signal* signal); void sendApiVersionRep(Signal* signal, NodeRecPtr nodePtr); + void sendVersionedDb(NodeReceiverGroup rg, + GlobalSignalNumber gsn, + Signal* signal, + Uint32 length, + JobBufferLevel jbuf, + Uint32 minversion); }; #endif diff --git a/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp b/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp index f4a4bbbb400263ec4fde1388bbe164fd7cacdc4c..317cc870873f3d1768504521eca130a49019be79 100644 --- a/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp +++ b/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp @@ -2786,30 +2786,12 @@ void Qmgr::execAPI_REGREQ(Signal* signal) recompute_version_info(type, version); - if (info.m_type[NodeInfo::DB].m_min_version >= NDBD_NODE_VERSION_REP) - { - jam(); - NodeReceiverGroup rg(QMGR, c_clusterNodes); - rg.m_nodes.clear(getOwnNodeId()); - signal->theData[0] = apiNodePtr.i; - signal->theData[1] = version; - sendSignal(rg, GSN_NODE_VERSION_REP, signal, 2, JBB); - } - else - { - Uint32 i = 0; - while((i = c_clusterNodes.find(i + 1)) != NdbNodeBitmask::NotFound) - { - jam(); - if (i == getOwnNodeId()) - continue; - if (getNodeInfo(i).m_version >= NDBD_NODE_VERSION_REP) - { - jam(); - sendSignal(calcQmgrBlockRef(i), GSN_NODE_VERSION_REP, signal, 2,JBB); - } - } - } + signal->theData[0] = apiNodePtr.i; + signal->theData[1] = version; + NodeReceiverGroup rg(QMGR, c_clusterNodes); + rg.m_nodes.clear(getOwnNodeId()); + sendVersionedDb(rg, GSN_NODE_VERSION_REP, signal, 2, JBB, + NDBD_NODE_VERSION_REP); signal->theData[0] = apiNodePtr.i; EXECUTE_DIRECT(NDBCNTR, GSN_API_START_REP, signal, 1); @@ -2817,6 +2799,38 @@ void Qmgr::execAPI_REGREQ(Signal* signal) return; }//Qmgr::execAPI_REGREQ() +void +Qmgr::sendVersionedDb(NodeReceiverGroup rg, + GlobalSignalNumber gsn, + Signal* signal, + Uint32 length, + JobBufferLevel jbuf, + Uint32 minversion) +{ + jam(); + NodeVersionInfo info = getNodeVersionInfo(); + if (info.m_type[NodeInfo::DB].m_min_version >= minversion) + { + jam(); + sendSignal(rg, gsn, signal, length, jbuf); + } + else + { + jam(); + Uint32 i = 0, cnt = 0; + while((i = rg.m_nodes.find(i + 1)) != NodeBitmask::NotFound) + { + jam(); + if (getNodeInfo(i).m_version >= minversion) + { + jam(); + cnt++; + sendSignal(numberToRef(rg.m_block, i), gsn, signal, length, jbuf); + } + } + ndbassert(cnt < rg.m_nodes.count()); + } +} void Qmgr::execAPI_VERSION_REQ(Signal * signal) {