#At file:///home/msvensson/mysql/bug/43641/ based on revid:frazer@stripped
2956 Magnus Svensson 2009-03-26
WL#4350 ndb_mgmd - consistent configuration
- Move the function that returns a bitmask of nodes of a certain type
from SignalSender to Config
- Rewrite m_config_change_state so that a setter function must be used when
changing the state.
- Trigger rebuild of m_all_mgm when m_config_change_state is set back to IDLE
modified:
storage/ndb/src/mgmsrv/Config.cpp
storage/ndb/src/mgmsrv/Config.hpp
storage/ndb/src/mgmsrv/ConfigManager.cpp
storage/ndb/src/mgmsrv/ConfigManager.hpp
storage/ndb/src/mgmsrv/MgmtSrvr.cpp
storage/ndb/src/ndbapi/SignalSender.cpp
storage/ndb/src/ndbapi/SignalSender.hpp
=== modified file 'storage/ndb/src/mgmsrv/Config.cpp'
--- a/storage/ndb/src/mgmsrv/Config.cpp 2009-03-14 20:42:04 +0000
+++ b/storage/ndb/src/mgmsrv/Config.cpp 2009-03-26 08:31:32 +0000
@@ -777,3 +777,25 @@ void Config::getConnectString(BaseString
ndbout << connectstring << endl;
}
+
+void
+Config::get_nodemask(NodeBitmask& mask,
+ ndb_mgm_node_type type) const
+{
+ mask.clear();
+ ConfigIter it(this, CFG_SECTION_NODE);
+ for (; it.valid(); it.next())
+ {
+ Uint32 node_type;
+ require(it.get(CFG_TYPE_OF_SECTION, &node_type) == 0);
+
+ if (type == NDB_MGM_NODE_TYPE_UNKNOWN || // UNKOWN -> add all nodes to mask
+ type == (ndb_mgm_node_type)node_type)
+ {
+ Uint32 nodeid;
+ require(it.get(CFG_NODE_ID, &nodeid) == 0);
+ mask.set(nodeid);
+ }
+ }
+}
+
=== modified file 'storage/ndb/src/mgmsrv/Config.hpp'
--- a/storage/ndb/src/mgmsrv/Config.hpp 2008-12-16 16:30:58 +0000
+++ b/storage/ndb/src/mgmsrv/Config.hpp 2009-03-26 08:31:32 +0000
@@ -16,7 +16,9 @@
#ifndef Config_H
#define Config_H
+#include <kernel/NodeBitmask.hpp>
#include "ConfigInfo.hpp"
+#include <mgmapi.h>
#include <mgmapi_configuration.hpp>
@@ -113,6 +115,13 @@ public:
*/
bool equal(const Config*, const unsigned* exclude = NULL) const;
+ /*
+ Return bitmask of all defined nodes of a certain type
+ returns all defined nodes by default.
+ */
+ void get_nodemask(NodeBitmask& mask,
+ ndb_mgm_node_type type = NDB_MGM_NODE_TYPE_UNKNOWN) const;
+
struct ndb_mgm_configuration * m_configValues;
struct ndb_mgm_configuration * values(void) const { return m_configValues; };
=== modified file 'storage/ndb/src/mgmsrv/ConfigManager.cpp'
--- a/storage/ndb/src/mgmsrv/ConfigManager.cpp 2009-02-23 09:59:06 +0000
+++ b/storage/ndb/src/mgmsrv/ConfigManager.cpp 2009-03-26 08:31:32 +0000
@@ -55,7 +55,6 @@ ConfigManager::ConfigManager(const MgmtS
NDB_VERSION,
NDB_MGM_NODE_TYPE_MGM,
opts.bind_address),
- m_config_change_state(CCS_IDLE),
m_config_state(CS_UNINITIALIZED),
m_previous_state(CS_UNINITIALIZED),
m_config_change_error(ConfigChangeRef::OK),
@@ -869,6 +868,19 @@ ConfigManager::execCONFIG_CHANGE_IMPL_RE
}
+void ConfigManager::set_config_change_state(ConfigChangeState::States state)
+{
+ if (state == ConfigChangeState::IDLE)
+ {
+ // Rebuild m_all_mgm so that each node in config is included
+ // new mgm nodes might have been added
+ m_config->get_nodemask(m_all_mgm, NDB_MGM_NODE_TYPE_MGM);
+ }
+
+ m_config_change_state.m_current_state = state;
+}
+
+
void
ConfigManager::execCONFIG_CHANGE_IMPL_REF(SignalSender& ss, SimpleSignal* sig)
{
@@ -886,9 +898,9 @@ ConfigManager::execCONFIG_CHANGE_IMPL_RE
switch(m_config_change_state){
- case CCS_PREPARING:{
+ case ConfigChangeState::PREPARING:{
/* Got ref while preparing */
- m_config_change_state = CCS_ABORT;
+ set_config_change_state(ConfigChangeState::ABORT);
m_waiting_for.clear(nodeId);
if (!m_waiting_for.isclear())
return;
@@ -907,18 +919,18 @@ ConfigManager::execCONFIG_CHANGE_IMPL_RE
GSN_CONFIG_CHANGE_IMPL_REQ,
ConfigChangeImplReq::SignalLength);
if (m_waiting_for.isclear())
- m_config_change_state = CCS_IDLE;
+ set_config_change_state(ConfigChangeState::IDLE);
else
- m_config_change_state = CCS_ABORTING;
+ set_config_change_state(ConfigChangeState::ABORTING);
break;
}
- case CCS_COMITTING:
+ case ConfigChangeState::COMITTING:
/* Got ref while comitting, impossible */
abort();
break;
- case CCS_ABORT:{
+ case ConfigChangeState::ABORT:{
/* Got ref(another) while already decided to abort */
m_waiting_for.clear(nodeId);
if (!m_waiting_for.isclear())
@@ -938,13 +950,13 @@ ConfigManager::execCONFIG_CHANGE_IMPL_RE
GSN_CONFIG_CHANGE_IMPL_REQ,
ConfigChangeImplReq::SignalLength);
if (m_waiting_for.isclear())
- m_config_change_state = CCS_IDLE;
+ set_config_change_state(ConfigChangeState::IDLE);
else
- m_config_change_state = CCS_ABORTING;
+ set_config_change_state(ConfigChangeState::ABORTING);
break;
}
- case CCS_ABORTING:
+ case ConfigChangeState::ABORTING:
/* Got ref while aborting, impossible */
abort();
break;
@@ -966,7 +978,7 @@ ConfigManager::execCONFIG_CHANGE_IMPL_CO
g_eventLogger->debug("Got CONFIG_CHANGE_IMPL_CONF from node %d", nodeId);
switch(m_config_change_state){
- case CCS_PREPARING:{
+ case ConfigChangeState::PREPARING:{
require(conf->requestType == ConfigChangeImplReq::Prepare);
m_waiting_for.clear(nodeId);
if (!m_waiting_for.isclear())
@@ -986,13 +998,13 @@ ConfigManager::execCONFIG_CHANGE_IMPL_CO
GSN_CONFIG_CHANGE_IMPL_REQ,
ConfigChangeImplReq::SignalLength);
if (m_waiting_for.isclear())
- m_config_change_state = CCS_IDLE;
+ set_config_change_state(ConfigChangeState::IDLE);
else
- m_config_change_state = CCS_COMITTING;
+ set_config_change_state(ConfigChangeState::COMITTING);
break;
}
- case CCS_COMITTING:{
+ case ConfigChangeState::COMITTING:{
require(conf->requestType == ConfigChangeImplReq::Commit);
m_waiting_for.clear(nodeId);
@@ -1012,11 +1024,11 @@ ConfigManager::execCONFIG_CHANGE_IMPL_CO
sendConfigChangeConf(ss, m_client_ref);
}
m_client_ref = RNIL;
- m_config_change_state = CCS_IDLE;
+ set_config_change_state(ConfigChangeState::IDLE);
break;
}
- case CCS_ABORT:{
+ case ConfigChangeState::ABORT:{
m_waiting_for.clear(nodeId);
if (!m_waiting_for.isclear())
return;
@@ -1034,13 +1046,13 @@ ConfigManager::execCONFIG_CHANGE_IMPL_CO
GSN_CONFIG_CHANGE_IMPL_REQ,
ConfigChangeImplReq::SignalLength);
if (m_waiting_for.isclear())
- m_config_change_state = CCS_IDLE;
+ set_config_change_state(ConfigChangeState::IDLE);
else
- m_config_change_state = CCS_ABORTING;
+ set_config_change_state(ConfigChangeState::ABORTING);
break;
}
- case CCS_ABORTING:{
+ case ConfigChangeState::ABORTING:{
m_waiting_for.clear(nodeId);
if (!m_waiting_for.isclear())
return;
@@ -1063,7 +1075,7 @@ ConfigManager::execCONFIG_CHANGE_IMPL_CO
}
m_config_change_error= ConfigChangeRef::OK;
m_client_ref = RNIL;
- m_config_change_state = CCS_IDLE;
+ set_config_change_state(ConfigChangeState::IDLE);
break;
}
@@ -1160,7 +1172,7 @@ ConfigManager::sendConfigChangeImplReq(S
req->length = buf.length();
require(m_waiting_for.isclear());
- require(m_config_change_state == CCS_IDLE);
+ require(m_config_change_state == ConfigChangeState::IDLE);
g_eventLogger->debug("Sending CONFIG_CHANGE_IMPL_REQ(prepare)");
unsigned i = 0;
@@ -1192,7 +1204,7 @@ ConfigManager::sendConfigChangeImplReq(S
// Some nodes got prepare, set state to
// abort and continue abort when result
// of prepare arrives
- m_config_change_state = CCS_ABORT;
+ set_config_change_state(ConfigChangeState::ABORT);
return false;
}
@@ -1202,7 +1214,7 @@ ConfigManager::sendConfigChangeImplReq(S
// Prepare has been sent to all mgm nodes
// continue and wait for prepare conf(s)
- m_config_change_state = CCS_PREPARING;
+ set_config_change_state(ConfigChangeState::PREPARING);
return true;
}
@@ -1230,7 +1242,7 @@ ConfigManager::execCONFIG_CHANGE_REQ(Sig
return;
}
- if (m_config_change_state != CCS_IDLE)
+ if (m_config_change_state != ConfigChangeState::IDLE)
{
sendConfigChangeRef(ss, from, ConfigChangeRef::ConfigChangeOnGoing);
return;
@@ -1470,14 +1482,15 @@ ConfigManager::run()
SignalSender ss(m_facade, MGM_CONFIG_MAN);
ss.lock();
- ss.getNodes(m_all_mgm, NodeInfo::MGM);
+ // Build bitmaks of all mgm nodes in config
+ m_config->get_nodemask(m_all_mgm, NDB_MGM_NODE_TYPE_MGM);
m_started.set(m_facade->ownId());
while (!is_stopped())
{
- if (m_config_change_state == CCS_IDLE)
+ if (m_config_change_state == ConfigChangeState::IDLE)
{
bool print_state = false;
if (m_previous_state != m_config_state)
@@ -1581,7 +1594,7 @@ ConfigManager::run()
m_checked.clear(nodeId);
m_defragger.node_failed(nodeId);
- if (m_config_change_state != CCS_IDLE)
+ if (m_config_change_state != ConfigChangeState::IDLE)
{
g_eventLogger->info("Node %d failed during config change!!",
nodeId);
=== modified file 'storage/ndb/src/mgmsrv/ConfigManager.hpp'
--- a/storage/ndb/src/mgmsrv/ConfigManager.hpp 2009-02-23 09:59:06 +0000
+++ b/storage/ndb/src/mgmsrv/ConfigManager.hpp 2009-03-26 08:31:32 +0000
@@ -39,14 +39,23 @@ class ConfigManager : public MgmtThread
ConfigRetriever m_config_retriever;
- enum ConfigChangeState {
- CCS_IDLE,
- CCS_PREPARING,
- CCS_COMITTING,
- CCS_ABORT,
- CCS_ABORTING
+ struct ConfigChangeState {
+ enum States {
+ IDLE,
+ PREPARING,
+ COMITTING,
+ ABORT,
+ ABORTING
+ } m_current_state;
+
+ ConfigChangeState() :
+ m_current_state(IDLE) {}
+
+ operator int() const { return m_current_state; }
} m_config_change_state;
+ void set_config_change_state(ConfigChangeState::States state);
+
enum ConfigState {
CS_UNINITIALIZED,
=== modified file 'storage/ndb/src/mgmsrv/MgmtSrvr.cpp'
--- a/storage/ndb/src/mgmsrv/MgmtSrvr.cpp 2009-03-13 14:24:21 +0000
+++ b/storage/ndb/src/mgmsrv/MgmtSrvr.cpp 2009-03-26 08:31:32 +0000
@@ -3990,7 +3990,7 @@ MgmtSrvr::change_config(Config& new_conf
req->length = buf.length();
NodeBitmask mgm_nodes;
- ss.getNodes(mgm_nodes, NodeInfo::MGM);
+ m_local_config->get_nodemask(mgm_nodes, NDB_MGM_NODE_TYPE_MGM);
NodeId nodeId= ss.find_confirmed_node(mgm_nodes);
if (nodeId == 0)
=== modified file 'storage/ndb/src/ndbapi/SignalSender.cpp'
--- a/storage/ndb/src/ndbapi/SignalSender.cpp 2009-02-23 09:59:06 +0000
+++ b/storage/ndb/src/ndbapi/SignalSender.cpp 2009-03-26 08:31:32 +0000
@@ -138,25 +138,6 @@ SignalSender::getNoOfConnectedNodes() co
}
-void
-SignalSender::getNodes(NodeBitmask& mask,
- NodeInfo::NodeType type)
-{
- mask.clear();
- for(Uint32 i = 1; i < MAX_NODES; i++)
- {
- const ClusterMgr::Node& node= getNodeInfo(i);
- if(!node.defined)
- continue;
- if(type == NodeInfo::INVALID || // INVALID -> add all nodes to mask
- node.m_info.getType() == type)
- {
- mask.set(i);
- }
- }
-}
-
-
NodeBitmask
SignalSender::broadcastSignal(NodeBitmask mask,
SimpleSignal& sig,
=== modified file 'storage/ndb/src/ndbapi/SignalSender.hpp'
--- a/storage/ndb/src/ndbapi/SignalSender.hpp 2009-02-23 09:59:06 +0000
+++ b/storage/ndb/src/ndbapi/SignalSender.hpp 2009-03-26 08:31:32 +0000
@@ -68,13 +68,6 @@ public:
const ClusterMgr::Node &getNodeInfo(Uint16 nodeId) const;
Uint32 getNoOfConnectedNodes() const;
- /*
- Return bitmask of all defined nodes of a certain type
- returns all defined nodes by default.
- */
- 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);
Attachment: [text/bzr-bundle] bzr/msvensson@mysql.com-20090326083132-8zxy0r1wdslgqoja.bundle
| Thread |
|---|
| • bzr commit into mysql-5.1-telco-7.0 branch (msvensson:2956) WL#4350 | Magnus Svensson | 26 Mar |