Commit b6c7fb39 authored by unknown's avatar unknown
Browse files

ndb - Fix bug when sending NODE_VERSION_REP


storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp:
  Fix bug when sending NODE_VERSION_REP
storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp:
  Fix bug when sending NODE_VERSION_REP
parent 4e055f3f
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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
+38 −24
Original line number Diff line number Diff line
@@ -2786,37 +2786,51 @@ 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();
    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;
      signal->theData[1] = version;
      sendSignal(rg, GSN_NODE_VERSION_REP, signal, 2, JBB);
    EXECUTE_DIRECT(NDBCNTR, GSN_API_START_REP, signal, 1);
  }
  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
  {
      Uint32 i = 0;
      while((i = c_clusterNodes.find(i + 1)) != NdbNodeBitmask::NotFound)
    jam();
    Uint32 i = 0, cnt = 0;
    while((i = rg.m_nodes.find(i + 1)) != NodeBitmask::NotFound)
    {
      jam();
	if (i == getOwnNodeId())
	  continue;
	if (getNodeInfo(i).m_version >= NDBD_NODE_VERSION_REP)
      if (getNodeInfo(i).m_version >= minversion)
      {
	jam();
	  sendSignal(calcQmgrBlockRef(i), GSN_NODE_VERSION_REP, signal, 2,JBB);
	cnt++;
	sendSignal(numberToRef(rg.m_block, i), gsn, signal, length, jbuf);
      }
    }
    ndbassert(cnt < rg.m_nodes.count());
  }
    
    signal->theData[0] = apiNodePtr.i;
    EXECUTE_DIRECT(NDBCNTR, GSN_API_START_REP, signal, 1);
}
  return;
}//Qmgr::execAPI_REGREQ()


void
Qmgr::execAPI_VERSION_REQ(Signal * signal) {