#At file:///home/msvensson/mysql/6.4-wl4350/
3039 Magnus Svensson 2008-11-06
WL#4350
- Make the binary config sent by 'mgm_get_configuration' actually
start a config change
- Set own node as "confirmed" in ClusterMgr's list of nodes, thus making
no distinction between local or remote ConfigManager
- Add functions to SignalSender to make it easy to find the next
node in a bitmask that is connected, alive or confirmed.
modified:
storage/ndb/src/mgmsrv/MgmtSrvr.cpp
storage/ndb/src/mgmsrv/MgmtSrvr.hpp
storage/ndb/src/mgmsrv/Services.cpp
storage/ndb/src/ndbapi/ClusterMgr.cpp
storage/ndb/src/ndbapi/ClusterMgr.hpp
storage/ndb/src/ndbapi/SignalSender.cpp
storage/ndb/src/ndbapi/SignalSender.hpp
=== modified file 'storage/ndb/src/mgmsrv/MgmtSrvr.cpp'
--- a/storage/ndb/src/mgmsrv/MgmtSrvr.cpp 2008-11-06 10:52:20 +0000
+++ b/storage/ndb/src/mgmsrv/MgmtSrvr.cpp 2008-11-06 10:56:21 +0000
@@ -3549,7 +3549,7 @@ bool MgmtSrvr::connect_to_self()
buf.assfmt("%s:%u",
m_opts.bind_address ? m_opts.bind_address : "localhost",
- getPort());
+ m_port);
ndb_mgm_set_connectstring(mgm_handle, buf.c_str());
if(ndb_mgm_connect(mgm_handle, 0, 0, 0) < 0)
@@ -3795,6 +3795,89 @@ int MgmtSrvr::ndbinfo(Uint32 tableId,
}
+int
+MgmtSrvr::change_config(Config& new_config)
+{
+ SignalSender ss(theFacade);
+ ss.lock();
+
+ SimpleSignal ssig;
+ UtilBuffer buf;
+ new_config.pack(buf);
+ ssig.ptr[0].p = (Uint32*)buf.get_data();
+ ssig.ptr[0].sz = (buf.length() + 3) / 4;
+ ssig.header.m_noOfSections = 1;
+
+ ConfigChangeReq *req= CAST_PTR(ConfigChangeReq, ssig.getDataPtrSend());
+ req->length = buf.length();
+
+ NodeBitmask mgm_nodes;
+ ss.getNodes(mgm_nodes, NodeInfo::MGM);
+
+ NodeId nodeId= ss.find_confirmed_node(mgm_nodes);
+ if (nodeId == 0)
+ return -1; // Hrmpf?
+
+ if (ss.sendSignal(nodeId, ssig,
+ MGM_CONFIG_MAN, GSN_CONFIG_CHANGE_REQ,
+ ConfigChangeReq::SignalLength) != SEND_OK)
+ return SEND_OR_RECEIVE_FAILED;
+ mgm_nodes.clear(nodeId);
+
+ bool done = false;
+ while(!done)
+ {
+ SimpleSignal *signal= ss.waitFor();
+
+ switch(signal->readSignalNumber()){
+ case GSN_CONFIG_CHANGE_CONF:
+ done= true;
+ break;
+ case GSN_CONFIG_CHANGE_REF:
+ {
+ const ConfigChangeRef * const ref =
+ CAST_CONSTPTR(ConfigChangeRef, signal->getDataPtr());
+ g_eventLogger->debug("Got CONFIG_CHANGE_REF, error: %d", ref->errorCode);
+ switch(ref->errorCode)
+ {
+ case ConfigChangeRef::NotMaster:{
+ // Retry with next node if any
+ NodeId nodeId= ss.find_confirmed_node(mgm_nodes);
+ if (nodeId == 0)
+ return -1; // Hrmpf?
+
+ if (ss.sendSignal(nodeId, ssig,
+ MGM_CONFIG_MAN, GSN_CONFIG_CHANGE_REQ,
+ ConfigChangeReq::SignalLength) != SEND_OK)
+ return SEND_OR_RECEIVE_FAILED;
+ mgm_nodes.clear(nodeId);
+ break;
+ }
+
+ default:
+ return ref->errorCode;
+ }
+
+ break;
+ }
+
+ case GSN_API_REGCONF:
+ // Ignore;
+ break;
+
+ default:
+ report_unknown_signal(signal);
+ return SEND_OR_RECEIVE_FAILED;
+
+ }
+ }
+
+ g_eventLogger->info("Config change completed");
+
+ return 0;
+}
+
+
template class MutexVector<NodeId>;
template class MutexVector<Ndb_mgmd_event_service::Event_listener>;
template class Vector<EventSubscribeReq>;
=== modified file 'storage/ndb/src/mgmsrv/MgmtSrvr.hpp'
--- a/storage/ndb/src/mgmsrv/MgmtSrvr.hpp 2008-11-06 10:52:20 +0000
+++ b/storage/ndb/src/mgmsrv/MgmtSrvr.hpp 2008-11-06 10:56:21 +0000
@@ -361,7 +361,9 @@ public:
SOCKET_SIZE_TYPE *client_addr_len,
int &error_code, BaseString &error_string,
int log_event = 1);
-
+
+ int change_config(Config& new_config);
+
/**
*
*/
=== modified file 'storage/ndb/src/mgmsrv/Services.cpp'
--- a/storage/ndb/src/mgmsrv/Services.cpp 2008-10-27 11:13:34 +0000
+++ b/storage/ndb/src/mgmsrv/Services.cpp 2008-11-06 10:56:21 +0000
@@ -2016,8 +2016,10 @@ void MgmApiSession::setConfig(Parser_t::
}
delete decoded;
- //m_mgmsrv.setConfig(new Config(cvf.getConfigValues()));
-
+ int res;
+ Config new_config(cvf.getConfigValues());
+ if ((res= m_mgmsrv.change_config(new_config)) != 0)
+ result.assfmt("error: %d", res);
}
done:
=== modified file 'storage/ndb/src/ndbapi/ClusterMgr.cpp'
--- a/storage/ndb/src/ndbapi/ClusterMgr.cpp 2008-11-04 08:43:06 +0000
+++ b/storage/ndb/src/ndbapi/ClusterMgr.cpp 2008-11-06 10:56:21 +0000
@@ -107,6 +107,11 @@ ClusterMgr::init(ndb_mgm_configuration_i
}
}
+ /* Init own node info */
+ Node &node= theNodes[theFacade.ownId()];
+ assert(node.defined);
+ node.m_api_reg_conf= true;
+
#if 1
print_nodes("init");
#endif
=== modified file 'storage/ndb/src/ndbapi/ClusterMgr.hpp'
--- a/storage/ndb/src/ndbapi/ClusterMgr.hpp 2008-11-04 08:43:06 +0000
+++ b/storage/ndb/src/ndbapi/ClusterMgr.hpp 2008-11-06 10:56:21 +0000
@@ -144,6 +144,7 @@ private:
inline
const ClusterMgr::Node &
ClusterMgr::getNodeInfo(NodeId nodeId) const {
+ assert(nodeId > 0 && nodeId < MAX_NODES);
return theNodes[nodeId];
}
=== modified file 'storage/ndb/src/ndbapi/SignalSender.cpp'
--- a/storage/ndb/src/ndbapi/SignalSender.cpp 2008-11-04 08:43:06 +0000
+++ b/storage/ndb/src/ndbapi/SignalSender.cpp 2008-11-06 10:56:21 +0000
@@ -143,7 +143,7 @@ SignalSender::getNodes(NodeBitmask& mask
NodeInfo::NodeType type)
{
mask.clear();
- for(Uint32 i = 0; i < MAX_NODES; i++)
+ for(Uint32 i = 1; i < MAX_NODES; i++)
{
const ClusterMgr::Node& node= getNodeInfo(i);
if(!node.defined)
@@ -338,9 +338,83 @@ SignalSender::execNodeStatus(void* signa
NdbCondition_Signal(ss->m_cond);
}
+
+template<class T>
+NodeId
+SignalSender::find_node(const NodeBitmask& mask, T & t)
+{
+ unsigned n= 0;
+ do {
+ n= mask.find(n+1);
+
+ if (n == NodeBitmask::NotFound)
+ return 0;
+
+ assert(n < MAX_NODES);
+
+ } while (!t.found_ok(*this, getNodeInfo(n)));
+
+ return n;
+}
+
+
+class FindConfirmedNode {
+public:
+ bool found_ok(const SignalSender& ss, const ClusterMgr::Node & node){
+ return node.m_api_reg_conf;
+ }
+};
+
+
+NodeId
+SignalSender::find_confirmed_node(const NodeBitmask& mask)
+{
+ FindConfirmedNode f;
+ return find_node(mask, f);
+}
+
+
+class FindConnectedNode {
+public:
+ bool found_ok(const SignalSender& ss, const ClusterMgr::Node & node){
+ return node.connected;
+ }
+};
+
+
+NodeId
+SignalSender::find_connected_node(const NodeBitmask& mask)
+{
+ FindConnectedNode f;
+ return find_node(mask, f);
+}
+
+
+class FindAliveNode {
+public:
+ bool found_ok(const SignalSender& ss, const ClusterMgr::Node & node){
+ return node.m_alive;
+ }
+};
+
+
+NodeId
+SignalSender::find_alive_node(const NodeBitmask& mask)
+{
+ FindAliveNode f;
+ return find_node(mask, f);
+}
+
+
#if __SUNPRO_CC != 0x560
template SimpleSignal* SignalSender::waitFor<WaitForNode>(unsigned, WaitForNode&);
template SimpleSignal* SignalSender::waitFor<WaitForAny>(unsigned, WaitForAny&);
+template NodeId SignalSender::find_node<FindConfirmedNode>(const NodeBitmask&,
+ FindConfirmedNode&);
+template NodeId SignalSender::find_node<FindAliveNode>(const NodeBitmask&,
+ FindAliveNode&);
+template NodeId SignalSender::find_node<FindConnectedNode>(const NodeBitmask&,
+ FindConnectedNode&);
#endif
template class Vector<SimpleSignal*>;
=== modified file 'storage/ndb/src/ndbapi/SignalSender.hpp'
--- a/storage/ndb/src/ndbapi/SignalSender.hpp 2008-10-24 12:51:04 +0000
+++ b/storage/ndb/src/ndbapi/SignalSender.hpp 2008-11-06 10:56:21 +0000
@@ -61,6 +61,10 @@ public:
void getNodes(NodeBitmask& mask,
NodeInfo::NodeType type = NodeInfo::INVALID);
+ NodeId find_confirmed_node(const NodeBitmask& mask);
+ NodeId find_connected_node(const NodeBitmask& mask);
+ NodeId find_alive_node(const NodeBitmask& mask);
+
SendStatus sendSignal(Uint16 nodeId, const SimpleSignal *);
SendStatus sendSignal(Uint16 nodeId, SimpleSignal& sig,
Uint16 recBlock, Uint16 gsn, Uint32 len);
@@ -93,6 +97,9 @@ private:
template<class T>
SimpleSignal * waitFor(Uint32 timeOutMillis, T & t);
+
+ template<class T>
+ NodeId find_node(const NodeBitmask& mask, T & t);
};
#endif
| Thread |
|---|
| • bzr commit into mysql-5.1 branch (msvensson:3039) WL#4350 | Magnus Svensson | 6 Nov |