Commit cd90b5d7 authored by tomas@poseidon.ndb.mysql.com's avatar tomas@poseidon.ndb.mysql.com

Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.1

into  poseidon.ndb.mysql.com:/home/tomas/mysql-5.1-new-ndb
parents a94ad6a2 cb3a75a4
...@@ -25,11 +25,12 @@ ...@@ -25,11 +25,12 @@
*/ */
class AllocNodeIdReq { class AllocNodeIdReq {
public: public:
STATIC_CONST( SignalLength = 3 ); STATIC_CONST( SignalLength = 4 );
Uint32 senderRef; Uint32 senderRef;
Uint32 senderData; Uint32 senderData;
Uint32 nodeId; Uint32 nodeId;
Uint32 nodeType;
}; };
class AllocNodeIdConf { class AllocNodeIdConf {
...@@ -53,7 +54,8 @@ public: ...@@ -53,7 +54,8 @@ public:
NotMaster = 702, NotMaster = 702,
NodeReserved = 1701, NodeReserved = 1701,
NodeConnected = 1702, NodeConnected = 1702,
NodeFailureHandlingNotCompleted = 1703 NodeFailureHandlingNotCompleted = 1703,
NodeTypeMismatch = 1704
}; };
Uint32 senderRef; Uint32 senderRef;
......
...@@ -234,6 +234,7 @@ void Cmvmi::execEVENT_REP(Signal* signal) ...@@ -234,6 +234,7 @@ void Cmvmi::execEVENT_REP(Signal* signal)
void void
Cmvmi::execEVENT_SUBSCRIBE_REQ(Signal * signal){ Cmvmi::execEVENT_SUBSCRIBE_REQ(Signal * signal){
EventSubscribeReq * subReq = (EventSubscribeReq *)&signal->theData[0]; EventSubscribeReq * subReq = (EventSubscribeReq *)&signal->theData[0];
Uint32 senderRef = signal->getSendersBlockRef();
SubscriberPtr ptr; SubscriberPtr ptr;
jamEntry(); jamEntry();
DBUG_ENTER("Cmvmi::execEVENT_SUBSCRIBE_REQ"); DBUG_ENTER("Cmvmi::execEVENT_SUBSCRIBE_REQ");
...@@ -251,7 +252,7 @@ Cmvmi::execEVENT_SUBSCRIBE_REQ(Signal * signal){ ...@@ -251,7 +252,7 @@ Cmvmi::execEVENT_SUBSCRIBE_REQ(Signal * signal){
* Create a new one * Create a new one
*/ */
if(subscribers.seize(ptr) == false){ if(subscribers.seize(ptr) == false){
sendSignal(subReq->blockRef, GSN_EVENT_SUBSCRIBE_REF, signal, 1, JBB); sendSignal(senderRef, GSN_EVENT_SUBSCRIBE_REF, signal, 1, JBB);
return; return;
} }
ptr.p->logLevel.clear(); ptr.p->logLevel.clear();
...@@ -278,7 +279,7 @@ Cmvmi::execEVENT_SUBSCRIBE_REQ(Signal * signal){ ...@@ -278,7 +279,7 @@ Cmvmi::execEVENT_SUBSCRIBE_REQ(Signal * signal){
} }
signal->theData[0] = ptr.i; signal->theData[0] = ptr.i;
sendSignal(ptr.p->blockRef, GSN_EVENT_SUBSCRIBE_CONF, signal, 1, JBB); sendSignal(senderRef, GSN_EVENT_SUBSCRIBE_CONF, signal, 1, JBB);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
......
...@@ -4736,6 +4736,7 @@ Qmgr::execALLOC_NODEID_REQ(Signal * signal) ...@@ -4736,6 +4736,7 @@ Qmgr::execALLOC_NODEID_REQ(Signal * signal)
const AllocNodeIdReq * req = (AllocNodeIdReq*)signal->getDataPtr(); const AllocNodeIdReq * req = (AllocNodeIdReq*)signal->getDataPtr();
Uint32 senderRef = req->senderRef; Uint32 senderRef = req->senderRef;
Uint32 nodeId = req->nodeId; Uint32 nodeId = req->nodeId;
Uint32 nodeType = req->nodeType;
Uint32 error = 0; Uint32 error = 0;
if (refToBlock(senderRef) != QMGR) // request from management server if (refToBlock(senderRef) != QMGR) // request from management server
...@@ -4786,7 +4787,9 @@ Qmgr::execALLOC_NODEID_REQ(Signal * signal) ...@@ -4786,7 +4787,9 @@ Qmgr::execALLOC_NODEID_REQ(Signal * signal)
NodeRecPtr nodePtr; NodeRecPtr nodePtr;
nodePtr.i = nodeId; nodePtr.i = nodeId;
ptrAss(nodePtr, nodeRec); ptrAss(nodePtr, nodeRec);
if (nodePtr.p->failState != NORMAL) if (nodeType != getNodeInfo(nodeId).m_type)
error = AllocNodeIdRef::NodeTypeMismatch;
else if (nodePtr.p->failState != NORMAL)
error = AllocNodeIdRef::NodeFailureHandlingNotCompleted; error = AllocNodeIdRef::NodeFailureHandlingNotCompleted;
} }
......
...@@ -122,41 +122,50 @@ MgmtSrvr::logLevelThreadRun() ...@@ -122,41 +122,50 @@ MgmtSrvr::logLevelThreadRun()
/** /**
* Handle started nodes * Handle started nodes
*/ */
EventSubscribeReq req;
req = m_event_listner[0].m_logLevel;
req.blockRef = _ownReference;
SetLogLevelOrd ord;
m_started_nodes.lock(); m_started_nodes.lock();
while(m_started_nodes.size() > 0){ if (m_started_nodes.size() > 0)
Uint32 node = m_started_nodes[0]; {
m_started_nodes.erase(0, false); // calculate max log level
m_started_nodes.unlock(); EventSubscribeReq req;
{
LogLevel tmp;
m_event_listner.lock();
for(int i = m_event_listner.m_clients.size() - 1; i >= 0; i--)
tmp.set_max(m_event_listner[i].m_logLevel);
m_event_listner.unlock();
req = tmp;
}
req.blockRef = _ownReference;
while (m_started_nodes.size() > 0)
{
Uint32 node = m_started_nodes[0];
m_started_nodes.erase(0, false);
m_started_nodes.unlock();
setEventReportingLevelImpl(node, req); setEventReportingLevelImpl(node, req);
ord = m_nodeLogLevel[node]; SetLogLevelOrd ord;
setNodeLogLevelImpl(node, ord); ord = m_nodeLogLevel[node];
setNodeLogLevelImpl(node, ord);
m_started_nodes.lock();
} m_started_nodes.lock();
}
}
m_started_nodes.unlock(); m_started_nodes.unlock();
m_log_level_requests.lock(); m_log_level_requests.lock();
while(m_log_level_requests.size() > 0){ while (m_log_level_requests.size() > 0)
req = m_log_level_requests[0]; {
EventSubscribeReq req = m_log_level_requests[0];
m_log_level_requests.erase(0, false); m_log_level_requests.erase(0, false);
m_log_level_requests.unlock(); m_log_level_requests.unlock();
LogLevel tmp;
tmp = req;
if(req.blockRef == 0){ if(req.blockRef == 0){
req.blockRef = _ownReference; req.blockRef = _ownReference;
setEventReportingLevelImpl(0, req); setEventReportingLevelImpl(0, req);
} else { } else {
ord = req; SetLogLevelOrd ord;
ord = req;
setNodeLogLevelImpl(req.blockRef, ord); setNodeLogLevelImpl(req.blockRef, ord);
} }
m_log_level_requests.lock(); m_log_level_requests.lock();
...@@ -1499,7 +1508,8 @@ int ...@@ -1499,7 +1508,8 @@ int
MgmtSrvr::setEventReportingLevelImpl(int nodeId, MgmtSrvr::setEventReportingLevelImpl(int nodeId,
const EventSubscribeReq& ll) const EventSubscribeReq& ll)
{ {
INIT_SIGNAL_SENDER(ss,nodeId); SignalSender ss(theFacade);
ss.lock();
SimpleSignal ssig; SimpleSignal ssig;
EventSubscribeReq * dst = EventSubscribeReq * dst =
...@@ -1508,41 +1518,54 @@ MgmtSrvr::setEventReportingLevelImpl(int nodeId, ...@@ -1508,41 +1518,54 @@ MgmtSrvr::setEventReportingLevelImpl(int nodeId,
EventSubscribeReq::SignalLength); EventSubscribeReq::SignalLength);
*dst = ll; *dst = ll;
send(ss,ssig,nodeId,NODE_TYPE_DB); NodeBitmask nodes;
nodes.clear();
Uint32 max = (nodeId == 0) ? (nodeId = 1, MAX_NDB_NODES) : nodeId;
for(; nodeId <= max; nodeId++)
{
if (nodeTypes[nodeId] != NODE_TYPE_DB)
continue;
if (okToSendTo(nodeId, true))
continue;
if (ss.sendSignal(nodeId, &ssig) == SEND_OK)
{
nodes.set(nodeId);
}
}
#if 0 int error = 0;
while (1) while (!nodes.isclear())
{ {
SimpleSignal *signal = ss.waitFor(); SimpleSignal *signal = ss.waitFor();
int gsn = signal->readSignalNumber(); int gsn = signal->readSignalNumber();
switch (gsn) { nodeId = refToNode(signal->header.theSendersBlockRef);
switch (gsn) {
case GSN_EVENT_SUBSCRIBE_CONF:{ case GSN_EVENT_SUBSCRIBE_CONF:{
nodes.clear(nodeId);
break; break;
} }
case GSN_EVENT_SUBSCRIBE_REF:{ case GSN_EVENT_SUBSCRIBE_REF:{
return SEND_OR_RECEIVE_FAILED; nodes.clear(nodeId);
error = 1;
break;
} }
case GSN_NF_COMPLETEREP:{ case GSN_NF_COMPLETEREP:{
const NFCompleteRep * const rep = const NFCompleteRep * const rep =
CAST_CONSTPTR(NFCompleteRep, signal->getDataPtr()); CAST_CONSTPTR(NFCompleteRep, signal->getDataPtr());
if (rep->failedNodeId == nodeId) nodes.clear(rep->failedNodeId);
return SEND_OR_RECEIVE_FAILED;
break; break;
} }
case GSN_NODE_FAILREP:{ case GSN_NODE_FAILREP:{
const NodeFailRep * const rep = // ignore, NF_COMPLETEREP will arrive later
CAST_CONSTPTR(NodeFailRep, signal->getDataPtr());
if (NodeBitmask::get(rep->theNodes,nodeId))
return SEND_OR_RECEIVE_FAILED;
break; break;
} }
default: default:
report_unknown_signal(signal); report_unknown_signal(signal);
return SEND_OR_RECEIVE_FAILED; return SEND_OR_RECEIVE_FAILED;
} }
} }
#endif if (error)
return SEND_OR_RECEIVE_FAILED;
return 0; return 0;
} }
...@@ -1562,19 +1585,6 @@ MgmtSrvr::setNodeLogLevelImpl(int nodeId, const SetLogLevelOrd & ll) ...@@ -1562,19 +1585,6 @@ MgmtSrvr::setNodeLogLevelImpl(int nodeId, const SetLogLevelOrd & ll)
return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED; return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;
} }
int
MgmtSrvr::send(SignalSender &ss, SimpleSignal &ssig, Uint32 node, Uint32 node_type){
Uint32 max = (node == 0) ? MAX_NODES : node + 1;
for(; node < max; node++){
while(nodeTypes[node] != (int)node_type && node < max) node++;
if(nodeTypes[node] != (int)node_type)
break;
ss.sendSignal(node, &ssig);
}
return 0;
}
//**************************************************************************** //****************************************************************************
//**************************************************************************** //****************************************************************************
...@@ -1927,7 +1937,7 @@ MgmtSrvr::get_connected_nodes(NodeBitmask &connected_nodes) const ...@@ -1927,7 +1937,7 @@ MgmtSrvr::get_connected_nodes(NodeBitmask &connected_nodes) const
} }
int int
MgmtSrvr::alloc_node_id_req(Uint32 free_node_id) MgmtSrvr::alloc_node_id_req(NodeId free_node_id, enum ndb_mgm_node_type type)
{ {
SignalSender ss(theFacade); SignalSender ss(theFacade);
ss.lock(); // lock will be released on exit ss.lock(); // lock will be released on exit
...@@ -1940,6 +1950,7 @@ MgmtSrvr::alloc_node_id_req(Uint32 free_node_id) ...@@ -1940,6 +1950,7 @@ MgmtSrvr::alloc_node_id_req(Uint32 free_node_id)
req->senderRef = ss.getOwnRef(); req->senderRef = ss.getOwnRef();
req->senderData = 19; req->senderData = 19;
req->nodeId = free_node_id; req->nodeId = free_node_id;
req->nodeType = type;
int do_send = 1; int do_send = 1;
NodeId nodeId = 0; NodeId nodeId = 0;
...@@ -2140,7 +2151,7 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId, ...@@ -2140,7 +2151,7 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId,
if (id_found && client_addr != 0) if (id_found && client_addr != 0)
{ {
int res = alloc_node_id_req(id_found); int res = alloc_node_id_req(id_found, type);
unsigned save_id_found = id_found; unsigned save_id_found = id_found;
switch (res) switch (res)
{ {
......
...@@ -486,8 +486,6 @@ public: ...@@ -486,8 +486,6 @@ public:
private: private:
//************************************************************************** //**************************************************************************
int send(SignalSender &ss, SimpleSignal &ssig, Uint32 node, Uint32 node_type);
int sendStopMgmd(NodeId nodeId, int sendStopMgmd(NodeId nodeId,
bool abort, bool abort,
bool stop, bool stop,
...@@ -520,7 +518,7 @@ private: ...@@ -520,7 +518,7 @@ private:
*/ */
int getBlockNumber(const BaseString &blockName); int getBlockNumber(const BaseString &blockName);
int alloc_node_id_req(Uint32 free_node_id); int alloc_node_id_req(NodeId free_node_id, enum ndb_mgm_node_type type);
//************************************************************************** //**************************************************************************
int _blockNumber; int _blockNumber;
......
...@@ -813,9 +813,8 @@ MgmApiSession::setClusterLogLevel(Parser<MgmApiSession>::Context &, ...@@ -813,9 +813,8 @@ MgmApiSession::setClusterLogLevel(Parser<MgmApiSession>::Context &,
m_mgmsrv.m_event_listner.unlock(); m_mgmsrv.m_event_listner.unlock();
{ {
LogLevel ll; LogLevel tmp;
ll.setLogLevel(category,level); m_mgmsrv.m_event_listner.update_max_log_level(tmp);
m_mgmsrv.m_event_listner.update_max_log_level(ll);
} }
m_output->println(reply); m_output->println(reply);
...@@ -1302,21 +1301,23 @@ Ndb_mgmd_event_service::log(int eventType, const Uint32* theData, NodeId nodeId) ...@@ -1302,21 +1301,23 @@ Ndb_mgmd_event_service::log(int eventType, const Uint32* theData, NodeId nodeId)
void void
Ndb_mgmd_event_service::update_max_log_level(const LogLevel &log_level) Ndb_mgmd_event_service::update_max_log_level(const LogLevel &log_level)
{ {
LogLevel tmp= m_logLevel; LogLevel tmp = log_level;
tmp.set_max(log_level); m_clients.lock();
for(int i = m_clients.size() - 1; i >= 0; i--)
tmp.set_max(m_clients[i].m_logLevel);
m_clients.unlock();
update_log_level(tmp); update_log_level(tmp);
} }
void void
Ndb_mgmd_event_service::update_log_level(const LogLevel &tmp) Ndb_mgmd_event_service::update_log_level(const LogLevel &tmp)
{ {
if(!(tmp == m_logLevel)){ m_logLevel = tmp;
m_logLevel = tmp; EventSubscribeReq req;
EventSubscribeReq req; req = tmp;
req = tmp; // send update to all nodes
req.blockRef = 0; req.blockRef = 0;
m_mgmsrv->m_log_level_requests.push_back(req); m_mgmsrv->m_log_level_requests.push_back(req);
}
} }
void void
......
...@@ -462,6 +462,7 @@ ErrorBundle ErrorCodes[] = { ...@@ -462,6 +462,7 @@ ErrorBundle ErrorCodes[] = {
{ 1701, DMEC, AE, "Node already reserved" }, { 1701, DMEC, AE, "Node already reserved" },
{ 1702, DMEC, AE, "Node already connected" }, { 1702, DMEC, AE, "Node already connected" },
{ 1703, DMEC, AE, "Node failure handling not completed" }, { 1703, DMEC, AE, "Node failure handling not completed" },
{ 1704, DMEC, AE, "Node type mismatch" },
/** /**
* Still uncategorized * Still uncategorized
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment