List:Commits« Previous MessageNext Message »
From:Magnus Svensson Date:March 26 2009 8:31am
Subject:bzr commit into mysql-5.1-telco-7.0 branch (msvensson:2956) WL#4350
View as plain text  
#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#4350Magnus Svensson26 Mar