List:Commits« Previous MessageNext Message »
From:Magnus Svensson Date:November 6 2008 10:56am
Subject:bzr commit into mysql-5.1 branch (msvensson:3039) WL#4350
View as plain text  
#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#4350Magnus Svensson6 Nov