removed need for specifying TCP connections in MySQL Cluster configuration

parent 671a4344
...@@ -73,63 +73,5 @@ ExecuteOnComputer: 6 ...@@ -73,63 +73,5 @@ ExecuteOnComputer: 6
Id: 14 Id: 14
ExecuteOnComputer: 7 ExecuteOnComputer: 7
# Mgmtsrvr connections [TCP DEFAULT]
[TCP]
NodeId1: 1
NodeId2: 2
PortNumber: CHOOSE_PORT_BASE02 PortNumber: CHOOSE_PORT_BASE02
[TCP]
NodeId1: 1
NodeId2: 3
PortNumber: CHOOSE_PORT_BASE03
# Ndb nodes connections
[TCP]
NodeId1: 2
NodeId2: 3
PortNumber: CHOOSE_PORT_BASE04
# Api connections
[TCP]
NodeId1: 11
NodeId2: 2
PortNumber: CHOOSE_PORT_BASE05
[TCP]
NodeId1: 11
NodeId2: 3
PortNumber: CHOOSE_PORT_BASE06
[TCP]
NodeId1: 12
NodeId2: 2
PortNumber: CHOOSE_PORT_BASE07
[TCP]
NodeId1: 12
NodeId2: 3
PortNumber: CHOOSE_PORT_BASE08
[TCP]
NodeId1: 13
NodeId2: 2
PortNumber: CHOOSE_PORT_BASE09
[TCP]
NodeId1: 13
NodeId2: 3
PortNumber: CHOOSE_PORT_BASE10
[TCP]
NodeId1: 14
NodeId2: 2
PortNumber: CHOOSE_PORT_BASE11
[TCP]
NodeId1: 14
NodeId2: 3
PortNumber: CHOOSE_PORT_BASE12
...@@ -143,6 +143,19 @@ ConfigInfo::m_SectionRules[] = { ...@@ -143,6 +143,19 @@ ConfigInfo::m_SectionRules[] = {
}; };
const int ConfigInfo::m_NoOfRules = sizeof(m_SectionRules)/sizeof(SectionRule); const int ConfigInfo::m_NoOfRules = sizeof(m_SectionRules)/sizeof(SectionRule);
/****************************************************************************
* Config Rules declarations
****************************************************************************/
bool addNodeConnections(Vector<ConfigInfo::ConfigRuleSection>&sections,
struct InitConfigFileParser::Context &ctx,
const char * ruleData);
const ConfigInfo::ConfigRule
ConfigInfo::m_ConfigRules[] = {
{ addNodeConnections, 0 },
{ 0, 0 }
};
struct DepricationTransform { struct DepricationTransform {
const char * m_section; const char * m_section;
const char * m_oldName; const char * m_oldName;
...@@ -1525,7 +1538,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = { ...@@ -1525,7 +1538,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
ConfigInfo::USED, ConfigInfo::USED,
false, false,
ConfigInfo::INT, ConfigInfo::INT,
MANDATORY, 2202,
0, 0,
0x7FFFFFFF }, 0x7FFFFFFF },
...@@ -2712,13 +2725,13 @@ checkMandatory(InitConfigFileParser::Context & ctx, const char * data){ ...@@ -2712,13 +2725,13 @@ checkMandatory(InitConfigFileParser::Context & ctx, const char * data){
* Transform a string "NodeidX" (e.g. "uppsala.32") * Transform a string "NodeidX" (e.g. "uppsala.32")
* into a Uint32 "NodeIdX" (e.g. 32) and a string "SystemX" (e.g. "uppsala"). * into a Uint32 "NodeIdX" (e.g. 32) and a string "SystemX" (e.g. "uppsala").
*/ */
bool fixNodeId(InitConfigFileParser::Context & ctx, const char * data){ bool fixNodeId(InitConfigFileParser::Context & ctx, const char * data)
{
char buf[] = "NodeIdX"; buf[6] = data[sizeof("NodeI")]; char buf[] = "NodeIdX"; buf[6] = data[sizeof("NodeI")];
char sysbuf[] = "SystemX"; sysbuf[6] = data[sizeof("NodeI")]; char sysbuf[] = "SystemX"; sysbuf[6] = data[sizeof("NodeI")];
const char* nodeId; const char* nodeId;
require(ctx.m_currentSection->get(buf, &nodeId)); require(ctx.m_currentSection->get(buf, &nodeId));
char tmpLine[MAX_LINE_LENGTH]; char tmpLine[MAX_LINE_LENGTH];
strncpy(tmpLine, nodeId, MAX_LINE_LENGTH); strncpy(tmpLine, nodeId, MAX_LINE_LENGTH);
char* token1 = strtok(tmpLine, "."); char* token1 = strtok(tmpLine, ".");
...@@ -2739,7 +2752,6 @@ bool fixNodeId(InitConfigFileParser::Context & ctx, const char * data){ ...@@ -2739,7 +2752,6 @@ bool fixNodeId(InitConfigFileParser::Context & ctx, const char * data){
require(ctx.m_currentSection->put(buf, id, true)); require(ctx.m_currentSection->put(buf, id, true));
require(ctx.m_currentSection->put(sysbuf, token1)); require(ctx.m_currentSection->put(sysbuf, token1));
} }
return true; return true;
} }
...@@ -2862,9 +2874,9 @@ fixPortNumber(InitConfigFileParser::Context & ctx, const char * data){ ...@@ -2862,9 +2874,9 @@ fixPortNumber(InitConfigFileParser::Context & ctx, const char * data){
Uint32 adder = 0; Uint32 adder = 0;
ctx.m_userProperties.get("PortNumberAdder", &adder); ctx.m_userProperties.get("PortNumberAdder", &adder);
Uint32 base = 0; Uint32 base = 0;
if(!ctx.m_userDefaults->get("PortNumber", &base) && if(!(ctx.m_userDefaults && ctx.m_userDefaults->get("PortNumber", &base)) &&
!ctx.m_systemDefaults->get("PortNumber", &base)){ !ctx.m_systemDefaults->get("PortNumber", &base)){
return true; return false;
} }
ctx.m_currentSection->put("PortNumber", base + adder); ctx.m_currentSection->put("PortNumber", base + adder);
adder++; adder++;
...@@ -3144,3 +3156,88 @@ saveInConfigValues(InitConfigFileParser::Context & ctx, const char * data){ ...@@ -3144,3 +3156,88 @@ saveInConfigValues(InitConfigFileParser::Context & ctx, const char * data){
} while(0); } while(0);
return true; return true;
} }
bool
addNodeConnections(Vector<ConfigInfo::ConfigRuleSection>&sections,
struct InitConfigFileParser::Context &ctx,
const char * ruleData)
{
Properties * props= ctx.m_config;
Properties p_connections;
Properties p_connections2;
for (Uint32 i = 0;; i++){
const Properties * tmp;
Uint32 nodeId1, nodeId2;
if(!props->get("Connection", i, &tmp)) break;
if(!tmp->get("NodeId1", &nodeId1)) continue;
p_connections.put("", nodeId1, nodeId1);
if(!tmp->get("NodeId2", &nodeId2)) continue;
p_connections.put("", nodeId2, nodeId2);
p_connections2.put("", nodeId1 + nodeId2<<16, nodeId1);
p_connections2.put("", nodeId2 + nodeId1<<16, nodeId2);
}
Uint32 nNodes;
ctx.m_userProperties.get("NoOfNodes", &nNodes);
Properties p_db_nodes;
Properties p_api_mgm_nodes;
Uint32 i_db= 0, i_api_mgm= 0;
for (Uint32 i= 0, n= 0; n < nNodes; i++){
const Properties * tmp;
if(!props->get("Node", i, &tmp)) continue;
n++;
const char * type;
if(!tmp->get("Type", &type)) continue;
if (strcmp(type,"DB") == 0)
p_db_nodes.put("", i_db++, i);
else if (strcmp(type,"API") == 0 ||
strcmp(type,"MGM") == 0)
p_api_mgm_nodes.put("", i_api_mgm++, i);
}
Uint32 nodeId1, nodeId2, dummy;
for (Uint32 i= 0; p_db_nodes.get("", i, &nodeId1); i++){
for (Uint32 j= i+1;; j++){
if(!p_db_nodes.get("", j, &nodeId2)) break;
if(!p_connections2.get("", nodeId1+nodeId2<<16, &dummy)) {
ConfigInfo::ConfigRuleSection s;
s.m_sectionType= BaseString("TCP");
s.m_sectionData= new Properties;
char buf[16];
snprintf(buf, sizeof(buf), "%u", nodeId1);
s.m_sectionData->put("NodeId1", buf);
snprintf(buf, sizeof(buf), "%u", nodeId2);
s.m_sectionData->put("NodeId2", buf);
sections.push_back(s);
}
}
}
for (Uint32 i= 0; p_api_mgm_nodes.get("", i, &nodeId1); i++){
if(!p_connections.get("", nodeId1, &dummy)) {
for (Uint32 j= 0;; j++){
if(!p_db_nodes.get("", j, &nodeId2)) break;
ConfigInfo::ConfigRuleSection s;
s.m_sectionType= BaseString("TCP");
s.m_sectionData= new Properties;
char buf[16];
snprintf(buf, sizeof(buf), "%u", nodeId1);
s.m_sectionData->put("NodeId1", buf);
snprintf(buf, sizeof(buf), "%u", nodeId2);
s.m_sectionData->put("NodeId2", buf);
sections.push_back(s);
}
}
}
return true;
}
...@@ -71,6 +71,21 @@ public: ...@@ -71,6 +71,21 @@ public:
const char * m_ruleData; const char * m_ruleData;
}; };
/**
* Entry for config rule
*/
struct ConfigRuleSection {
BaseString m_sectionType;
Properties * m_sectionData;
};
struct ConfigRule {
bool (* m_configRule)(Vector<ConfigRuleSection>&,
struct InitConfigFileParser::Context &,
const char * m_ruleData);
const char * m_ruleData;
};
ConfigInfo(); ConfigInfo();
/** /**
...@@ -113,6 +128,7 @@ private: ...@@ -113,6 +128,7 @@ private:
public: public:
static const SectionRule m_SectionRules[]; static const SectionRule m_SectionRules[];
static const ConfigRule m_ConfigRules[];
static const int m_NoOfRules; static const int m_NoOfRules;
}; };
......
...@@ -163,6 +163,30 @@ InitConfigFileParser::parseConfig(FILE * file) { ...@@ -163,6 +163,30 @@ InitConfigFileParser::parseConfig(FILE * file) {
return 0; return 0;
} }
for(size_t i = 0; ConfigInfo::m_ConfigRules[i].m_configRule != 0; i++){
ctx.type = InitConfigFileParser::Undefined;
ctx.m_currentSection = 0;
ctx.m_userDefaults = 0;
ctx.m_currentInfo = 0;
ctx.m_systemDefaults = 0;
Vector<ConfigInfo::ConfigRuleSection> tmp;
if(!(* ConfigInfo::m_ConfigRules[i].m_configRule)(tmp, ctx,
ConfigInfo::m_ConfigRules[i].m_ruleData))
return 0;
for(size_t j = 0; j<tmp.size(); j++){
snprintf(ctx.fname, sizeof(ctx.fname), tmp[j].m_sectionType.c_str());
ctx.type = InitConfigFileParser::Section;
ctx.m_currentSection = tmp[j].m_sectionData;
ctx.m_userDefaults = getSection(ctx.fname, ctx.m_defaults);
ctx.m_currentInfo = m_info->getInfo(ctx.fname);
ctx.m_systemDefaults = m_info->getDefaults(ctx.fname);
if(!storeSection(ctx))
return 0;
}
}
Uint32 nConnections = 0; Uint32 nConnections = 0;
Uint32 nComputers = 0; Uint32 nComputers = 0;
Uint32 nNodes = 0; Uint32 nNodes = 0;
...@@ -499,28 +523,22 @@ bool ...@@ -499,28 +523,22 @@ bool
InitConfigFileParser::storeSection(Context& ctx){ InitConfigFileParser::storeSection(Context& ctx){
if(ctx.m_currentSection == NULL) if(ctx.m_currentSection == NULL)
return true; return true;
for(int i = strlen(ctx.fname) - 1; i>=0; i--){ for(int i = strlen(ctx.fname) - 1; i>=0; i--){
ctx.fname[i] = toupper(ctx.fname[i]); ctx.fname[i] = toupper(ctx.fname[i]);
} }
snprintf(ctx.pname, sizeof(ctx.pname), ctx.fname); snprintf(ctx.pname, sizeof(ctx.pname), ctx.fname);
char buf[255]; char buf[255];
if(ctx.type == InitConfigFileParser::Section) if(ctx.type == InitConfigFileParser::Section)
snprintf(buf, sizeof(buf), "%s", ctx.fname); snprintf(buf, sizeof(buf), "%s", ctx.fname);
if(ctx.type == InitConfigFileParser::DefaultSection) if(ctx.type == InitConfigFileParser::DefaultSection)
snprintf(buf, sizeof(buf), "%s DEFAULT", ctx.fname); snprintf(buf, sizeof(buf), "%s DEFAULT", ctx.fname);
snprintf(ctx.fname, sizeof(ctx.fname), buf); snprintf(ctx.fname, sizeof(ctx.fname), buf);
if(ctx.type == InitConfigFileParser::Section){ if(ctx.type == InitConfigFileParser::Section){
for(int i = 0; i<m_info->m_NoOfRules; i++){ for(int i = 0; i<m_info->m_NoOfRules; i++){
const ConfigInfo::SectionRule & rule = m_info->m_SectionRules[i]; const ConfigInfo::SectionRule & rule = m_info->m_SectionRules[i];
if(!strcmp(rule.m_section, "*") || !strcmp(rule.m_section, ctx.fname)){ if(!strcmp(rule.m_section, "*") || !strcmp(rule.m_section, ctx.fname))
if(!(* rule.m_sectionRule)(ctx, rule.m_ruleData)){ if(!(* rule.m_sectionRule)(ctx, rule.m_ruleData))
return false; return false;
}
}
} }
} }
......
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