From 980c69f5c79cf134ffb8daa85fa5530695465da0 Mon Sep 17 00:00:00 2001 From: John David Duncan Date: Sat, 10 Dec 2016 10:31:52 -0800 Subject: [PATCH] wl#9819 patch #6: Memory allocation in Qmgr In initData(), a new array receivedProcessInfo is dynamically allocated to hold one ProcessInfo struct for each configured API and MGM node. --- storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp | 7 ++++- .../ndb/src/kernel/blocks/qmgr/QmgrInit.cpp | 30 ++++++++++++++++++- .../ndb/src/kernel/blocks/qmgr/QmgrMain.cpp | 14 +++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp b/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp index d8b353458133..94cec4c1e354 100644 --- a/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp +++ b/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -482,6 +483,7 @@ class Qmgr : public SimulatedBlock { void joinedCluster(Signal* signal, NodeRecPtr nodePtr); void sendCmRegReq(Signal * signal, Uint32 nodeId); void sendCmNodeInfoReq(Signal* signal, Uint32 nodeId, const NodeRec * self); + ProcessInfo * getProcessInfo(Uint32 nodeId); private: void sendPrepFailReqRef(Signal* signal, @@ -542,6 +544,9 @@ class Qmgr : public SimulatedBlock { Timer hb_send_timer; Timer hb_api_timer; + Int16 processInfoNodeIndex[MAX_NODES]; + ProcessInfo * receivedProcessInfo; + Uint16 max_api_node_id; NdbNodeBitmask cfailedNodes; NdbNodeBitmask cprepFailedNodes; diff --git a/storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp b/storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp index 2236cfffd6ea..71d9d28b105d 100644 --- a/storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp +++ b/storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,9 @@ #define QMGR_C #include "Qmgr.hpp" +#include +extern EventLogger * g_eventLogger; + #define JAM_FILE_ID 361 @@ -133,6 +136,30 @@ void Qmgr::initData() nodePtr.p->sendPresToStatus = Q_NOT_ACTIVE; nodePtr.p->failState = NORMAL; }//for + + /* Received ProcessInfo are indirectly addressed: + nodeId => fixed array lookup => dynamic array. + The dynamic array contains enough entries for all + configured MGM and API nodes. + */ + int numOfApiAndMgmNodes = 0; + for (int i = 1; i < MAX_NODES; i++) + { + Uint32 type = getNodeInfo(i).m_type; + switch(type){ + case NodeInfo::API: + case NodeInfo::MGM: + processInfoNodeIndex[i] = numOfApiAndMgmNodes++; + max_api_node_id = i; + break; + default: + processInfoNodeIndex[i] = -1; + break; + } + } + receivedProcessInfo = new ProcessInfo[numOfApiAndMgmNodes]; + g_eventLogger->info("Qmgr initialized %d ProcessInfo records up to " + "node id %d", numOfApiAndMgmNodes, max_api_node_id); }//Qmgr::initData() void Qmgr::initRecords() @@ -228,6 +255,7 @@ Qmgr::Qmgr(Block_context& ctx) Qmgr::~Qmgr() { delete []nodeRec; + delete []receivedProcessInfo; }//Qmgr::~Qmgr() diff --git a/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp b/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp index 0d0d3977333e..07535fca60f8 100644 --- a/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp +++ b/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp @@ -44,6 +44,8 @@ #include #include #include +#include +#include #include // Get connect address @@ -7485,6 +7487,18 @@ Qmgr::handleFailFromSuspect(Signal* signal, failReportLab(signal, sourceNode, (FailRep::FailCause) reason, getOwnNodeId()); } +ProcessInfo * +Qmgr::getProcessInfo(Uint32 nodeId) +{ + ProcessInfo * storedProcessInfo = 0; + Int16 index = processInfoNodeIndex[nodeId]; + if(index >= 0) + storedProcessInfo = & receivedProcessInfo[index]; + else if(nodeId == getOwnNodeId()) + storedProcessInfo = getOwnProcessInfo(getOwnNodeId()); + return storedProcessInfo; +} + void Qmgr::execDBINFO_SCANREQ(Signal *signal) {