Bug #13009 No gaps allowed in node id number sequence

+ some small bugfixes in ndb_config
+ extending ndb_config to print connections and take shm option
parent b78fa95d
......@@ -5,3 +5,8 @@ ndbd,1,localhost ndbd,2,localhost ndb_mgmd,3,localhost mysqld,4, mysqld,5, mysql
1 2
ndbd,1,localhost ndbd,2,localhost ndb_mgmd,3,localhost mysqld,4, mysqld,5, mysqld,6, mysqld,7,
ndbd,1,localhost,52428800,26214400 ndbd,2,localhost,52428800,36700160 ndbd,3,localhost,52428800,52428800 ndbd,4,localhost,52428800,52428800 ndb_mgmd,5,localhost,, mysqld,6,localhost,,
ndbd,1,localhost ndbd,2,localhost ndbd,3,localhost ndbd,4,localhost ndb_mgmd,5,localhost mysqld,6, mysqld,7, mysqld,8, mysqld,9, mysqld,10,
Cluster configuration warning line 0: Could not use next node id 2 for section [API], using next unused node id 7.
ndbd,2,localhost ndbd,3,localhost ndbd,4,localhost ndbd,5,localhost ndb_mgmd,6,localhost mysqld,1, mysqld,7, mysqld,8, mysqld,9, mysqld,10,
ndbd,3,localhost ndbd,4,localhost ndbd,5,localhost ndbd,6,localhost ndb_mgmd,1,localhost ndb_mgmd,2,localhost mysqld,11, mysqld,12, mysqld,13, mysqld,14, mysqld,15,
shm,3,4,35,3 shm,3,5,35,3 shm,3,6,35,3 shm,4,5,35,4 shm,4,6,35,4 shm,5,6,35,5 tcp,11,3,55,3 tcp,11,4,55,4 tcp,11,5,55,5 tcp,11,6,55,6 tcp,12,3,55,3 tcp,12,4,55,4 tcp,12,5,55,5 tcp,12,6,55,6 tcp,13,3,55,3 tcp,13,4,55,4 tcp,13,5,55,5 tcp,13,6,55,6 tcp,14,3,55,3 tcp,14,4,55,4 tcp,14,5,55,5 tcp,14,6,55,6 tcp,15,3,55,3 tcp,15,4,55,4 tcp,15,5,55,5 tcp,15,6,55,6 tcp,1,3,55,1 tcp,1,4,55,1 tcp,1,5,55,1 tcp,1,6,55,1 tcp,2,3,55,2 tcp,2,4,55,2 tcp,2,5,55,2 tcp,2,6,55,2
#
# Testing automatic node id generation
#
[cluster_config]
NoOfReplicas=2
Signum=39
[cluster_config.cluster0]
ndbd = localhost,localhost,localhost,localhost
ndb_mgmd = localhost
mysqld = ,,,,
[cluster_config.cluster1]
ndbd = localhost,localhost,localhost,localhost
ndb_mgmd = localhost
mysqld = ,,,,
[cluster_config.ndbd.1.cluster1]
NodeId=2
[cluster_config.mysqld.1.cluster1]
NodeId=1
[cluster_config.cluster2]
ndbd = localhost,localhost,localhost,localhost
ndb_mgmd = localhost,localhost
mysqld = ,,,,
[cluster_config.mysqld.1.cluster2]
NodeId=11
[cluster_config.ndb_mgmd.1.cluster2]
NodeId=1
[cluster_config.ndbd.1.cluster2]
NodeId=3
......@@ -11,3 +11,8 @@
# End of 4.1 tests
--exec $NDB_TOOLS_DIR/ndb_config --defaults-group-suffix=.jonas --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf1.cnf --query=type,nodeid,host,IndexMemory,DataMemory --mycnf 2> /dev/null
--exec $NDB_TOOLS_DIR/ndb_config --defaults-group-suffix=.cluster0 --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf2.cnf --query=type,nodeid,host --mycnf 2> /dev/null
--exec $NDB_TOOLS_DIR/ndb_config --defaults-group-suffix=.cluster1 --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf2.cnf --query=type,nodeid,host --mycnf 2> /dev/null
--exec $NDB_TOOLS_DIR/ndb_config --defaults-group-suffix=.cluster2 --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf2.cnf --query=type,nodeid,host --mycnf 2> /dev/null
--exec $NDB_TOOLS_DIR/ndb_config --defaults-group-suffix=.cluster2 --defaults-file=$MYSQL_TEST_DIR/std_data/ndb_config_mycnf2.cnf --ndb-shm --connections --query=type,nodeid1,nodeid2,group,nodeidserver --mycnf 2> /dev/null
......@@ -116,6 +116,7 @@
#define CFG_CONNECTION_HOSTNAME_1 407
#define CFG_CONNECTION_HOSTNAME_2 408
#define CFG_CONNECTION_GROUP 409
#define CFG_CONNECTION_NODE_ID_SERVER 410
#define CFG_TCP_SERVER 452
#define CFG_TCP_SEND_BUFFER_SIZE 454
......
......@@ -231,8 +231,11 @@ IPCConfig::configureTransporters(Uint32 nodeId,
Uint32 server_port= 0;
if(iter.get(CFG_CONNECTION_SERVER_PORT, &server_port)) break;
Uint32 nodeIdServer= 0;
if(iter.get(CFG_CONNECTION_NODE_ID_SERVER, &nodeIdServer)) break;
/*
We check the node type. MGM node becomes server.
We check the node type.
*/
Uint32 node1type, node2type;
ndb_mgm_configuration_iterator node1iter(config, CFG_SECTION_NODE);
......@@ -242,20 +245,12 @@ IPCConfig::configureTransporters(Uint32 nodeId,
node1iter.get(CFG_TYPE_OF_SECTION,&node1type);
node2iter.get(CFG_TYPE_OF_SECTION,&node2type);
conf.serverNodeId= (nodeId1 < nodeId2)? nodeId1:nodeId2;
conf.isMgmConnection= false;
if(node2type==NODE_TYPE_MGM)
{
conf.isMgmConnection= true;
conf.serverNodeId= nodeId2;
}
else if(node1type==NODE_TYPE_MGM)
{
if(node1type==NODE_TYPE_MGM || node2type==NODE_TYPE_MGM)
conf.isMgmConnection= true;
conf.serverNodeId= nodeId1;
}
else if (nodeId == conf.serverNodeId) {
else
conf.isMgmConnection= false;
if (nodeId == nodeIdServer && !conf.isMgmConnection) {
tr.add_transporter_interface(remoteNodeId, localHostName, server_port);
}
......@@ -279,6 +274,7 @@ IPCConfig::configureTransporters(Uint32 nodeId,
conf.s_port = server_port;
conf.localHostName = localHostName;
conf.remoteHostName = remoteHostName;
conf.serverNodeId = nodeIdServer;
switch(type){
case CONNECTION_TYPE_SHM:
......
......@@ -57,7 +57,6 @@ ConfigInfo::m_sectionNameAliases[]={
const char*
ConfigInfo::m_sectionNames[]={
"SYSTEM",
"EXTERNAL SYSTEM",
"COMPUTER",
DB_TOKEN,
......@@ -78,9 +77,7 @@ sizeof(m_sectionNames)/sizeof(char*);
****************************************************************************/
static bool transformComputer(InitConfigFileParser::Context & ctx, const char *);
static bool transformSystem(InitConfigFileParser::Context & ctx, const char *);
static bool transformExternalSystem(InitConfigFileParser::Context & ctx, const char *);
static bool transformNode(InitConfigFileParser::Context & ctx, const char *);
static bool transformExtNode(InitConfigFileParser::Context & ctx, const char *);
static bool checkConnectionSupport(InitConfigFileParser::Context & ctx, const char *);
static bool transformConnection(InitConfigFileParser::Context & ctx, const char *);
static bool applyDefaultValues(InitConfigFileParser::Context & ctx, const char *);
......@@ -93,7 +90,6 @@ static bool checkTCPConstraints(InitConfigFileParser::Context &, const char *);
static bool fixNodeHostname(InitConfigFileParser::Context & ctx, const char * data);
static bool fixHostname(InitConfigFileParser::Context & ctx, const char * data);
static bool fixNodeId(InitConfigFileParser::Context & ctx, const char * data);
static bool fixExtConnection(InitConfigFileParser::Context & ctx, const char * data);
static bool fixDepricated(InitConfigFileParser::Context & ctx, const char *);
static bool saveInConfigValues(InitConfigFileParser::Context & ctx, const char *);
static bool fixFileSystemPath(InitConfigFileParser::Context & ctx, const char * data);
......@@ -104,7 +100,6 @@ static bool checkLocalhostHostnameMix(InitConfigFileParser::Context & ctx, const
const ConfigInfo::SectionRule
ConfigInfo::m_SectionRules[] = {
{ "SYSTEM", transformSystem, 0 },
{ "EXTERNAL SYSTEM", transformExternalSystem, 0 },
{ "COMPUTER", transformComputer, 0 },
{ DB_TOKEN, transformNode, 0 },
......@@ -151,14 +146,6 @@ ConfigInfo::m_SectionRules[] = {
{ "SHM", fixPortNumber, 0 }, // has to come after fixHostName
{ "SCI", fixPortNumber, 0 }, // has to come after fixHostName
/**
* fixExtConnection must be after fixNodeId
*/
{ "TCP", fixExtConnection, 0 },
{ "SHM", fixExtConnection, 0 },
{ "SCI", fixExtConnection, 0 },
{ "OSE", fixExtConnection, 0 },
{ "*", applyDefaultValues, "user" },
{ "*", fixDepricated, 0 },
{ "*", applyDefaultValues, "system" },
......@@ -174,9 +161,6 @@ ConfigInfo::m_SectionRules[] = {
{ DB_TOKEN, checkDbConstraints, 0 },
/**
* checkConnectionConstraints must be after fixExtConnection
*/
{ "TCP", checkConnectionConstraints, 0 },
{ "SHM", checkConnectionConstraints, 0 },
{ "SCI", checkConnectionConstraints, 0 },
......@@ -214,9 +198,6 @@ static bool add_node_connections(Vector<ConfigInfo::ConfigRuleSection>&sections,
static bool set_connection_priorities(Vector<ConfigInfo::ConfigRuleSection>&sections,
struct InitConfigFileParser::Context &ctx,
const char * rule_data);
static bool add_server_ports(Vector<ConfigInfo::ConfigRuleSection>&sections,
struct InitConfigFileParser::Context &ctx,
const char * rule_data);
static bool check_node_vs_replicas(Vector<ConfigInfo::ConfigRuleSection>&sections,
struct InitConfigFileParser::Context &ctx,
const char * rule_data);
......@@ -226,7 +207,6 @@ ConfigInfo::m_ConfigRules[] = {
{ sanity_checks, 0 },
{ add_node_connections, 0 },
{ set_connection_priorities, 0 },
{ add_server_ports, 0 },
{ check_node_vs_replicas, 0 },
{ 0, 0 }
};
......@@ -242,9 +222,9 @@ struct DepricationTransform {
static
const DepricationTransform f_deprication[] = {
{ DB_TOKEN, "Discless", "Diskless", 0, 1 },
{ DB_TOKEN, "Id", "nodeid", 0, 1 },
{ API_TOKEN, "Id", "nodeid", 0, 1 },
{ MGM_TOKEN, "Id", "nodeid", 0, 1 },
{ DB_TOKEN, "Id", "NodeId", 0, 1 },
{ API_TOKEN, "Id", "NodeId", 0, 1 },
{ MGM_TOKEN, "Id", "NodeId", 0, 1 },
{ 0, 0, 0, 0, 0}
};
......@@ -422,7 +402,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
{
CFG_NODE_ID,
"nodeid",
"NodeId",
DB_TOKEN,
"Number identifying the database node ("DB_TOKEN_PRINT")",
ConfigInfo::CI_USED,
......@@ -1273,7 +1253,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
{
CFG_NODE_ID,
"nodeid",
"NodeId",
API_TOKEN,
"Number identifying application node ("API_TOKEN_PRINT")",
ConfigInfo::CI_USED,
......@@ -1416,7 +1396,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
{
CFG_NODE_ID,
"nodeid",
"NodeId",
MGM_TOKEN,
"Number identifying the management server node ("MGM_TOKEN_PRINT")",
ConfigInfo::CI_USED,
......@@ -1578,6 +1558,17 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
"55",
"0", "200" },
{
CFG_CONNECTION_NODE_ID_SERVER,
"NodeIdServer",
"TCP",
"",
ConfigInfo::CI_USED,
false,
ConfigInfo::CI_INT,
MANDATORY,
"1", "63" },
{
CFG_CONNECTION_SEND_SIGNAL_ID,
"SendSignalId",
......@@ -1766,6 +1757,17 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
"35",
"0", "200" },
{
CFG_CONNECTION_NODE_ID_SERVER,
"NodeIdServer",
"SHM",
"",
ConfigInfo::CI_USED,
false,
ConfigInfo::CI_INT,
MANDATORY,
"1", "63" },
{
CFG_CONNECTION_SEND_SIGNAL_ID,
"SendSignalId",
......@@ -1887,6 +1889,17 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
"15",
"0", "200" },
{
CFG_CONNECTION_NODE_ID_SERVER,
"NodeIdServer",
"SCI",
"",
ConfigInfo::CI_USED,
false,
ConfigInfo::CI_INT,
MANDATORY,
"1", "63" },
{
CFG_CONNECTION_HOSTNAME_1,
"HostName1",
......@@ -2555,29 +2568,32 @@ void ConfigInfo::print(const Properties * section,
bool
transformNode(InitConfigFileParser::Context & ctx, const char * data){
Uint32 id;
if(!ctx.m_currentSection->get("nodeid", &id) && !ctx.m_currentSection->get("Id", &id)){
Uint32 id, line;
if(!ctx.m_currentSection->get("NodeId", &id) && !ctx.m_currentSection->get("Id", &id)){
Uint32 nextNodeId= 1;
ctx.m_userProperties.get("NextNodeId", &nextNodeId);
id= nextNodeId;
while (ctx.m_userProperties.get("AllocatedNodeId_", id, &id))
while (ctx.m_userProperties.get("AllocatedNodeId_", id, &line))
id++;
ctx.m_userProperties.put("NextNodeId", id+1, true);
ctx.m_currentSection->put("nodeid", id);
#if 0
ctx.reportError("Mandatory parameter Id missing from section "
"[%s] starting at line: %d",
ctx.fname, ctx.m_sectionLineno);
return false;
#endif
} else if(ctx.m_userProperties.get("AllocatedNodeId_", id, &id)) {
if (id != nextNodeId)
{
ndbout_c("Cluster configuration warning line %d: "
"Could not use next node id %d for section [%s], "
"using next unused node id %d.",
ctx.m_sectionLineno, nextNodeId, ctx.fname, id);
}
ctx.m_currentSection->put("NodeId", id);
} else if(ctx.m_userProperties.get("AllocatedNodeId_", id, &line)) {
ctx.reportError("Duplicate nodeid in section "
"[%s] starting at line: %d",
ctx.fname, ctx.m_sectionLineno);
"[%s] starting at line: %d. Previously used on line %d.",
ctx.fname, ctx.m_sectionLineno, line);
return false;
}
ctx.m_userProperties.put("AllocatedNodeId_", id, id);
// next node id _always_ next numbers after last used id
ctx.m_userProperties.put("NextNodeId", id+1, true);
ctx.m_userProperties.put("AllocatedNodeId_", id, ctx.m_sectionLineno);
BaseString::snprintf(ctx.pname, sizeof(ctx.pname), "Node_%d", id);
ctx.m_currentSection->put("Type", ctx.fname);
......@@ -2691,38 +2707,6 @@ fixBackupDataDir(InitConfigFileParser::Context & ctx, const char * data){
return false;
}
bool
transformExtNode(InitConfigFileParser::Context & ctx, const char * data){
Uint32 id;
const char * systemName;
if(!ctx.m_currentSection->get("Id", &id)){
ctx.reportError("Mandatory parameter 'Id' missing from section "
"[%s] starting at line: %d",
ctx.fname, ctx.m_sectionLineno);
return false;
}
if(!ctx.m_currentSection->get("System", &systemName)){
ctx.reportError("Mandatory parameter 'System' missing from section "
"[%s] starting at line: %d",
ctx.fname, ctx.m_sectionLineno);
return false;
}
ctx.m_currentSection->put("Type", ctx.fname);
Uint32 nodes = 0;
ctx.m_userProperties.get("ExtNoOfNodes", &nodes);
require(ctx.m_userProperties.put("ExtNoOfNodes",++nodes, true));
BaseString::snprintf(ctx.pname, sizeof(ctx.pname), "EXTERNAL SYSTEM_%s:Node_%d",
systemName, id);
return true;
}
/**
* Connection rule: Check support of connection
*/
......@@ -2798,23 +2782,6 @@ transformSystem(InitConfigFileParser::Context & ctx, const char * data){
return true;
}
/**
* External system rule: Just add it
*/
bool
transformExternalSystem(InitConfigFileParser::Context & ctx, const char * data){
const char * name;
if(!ctx.m_currentSection->get("Name", &name)){
ctx.reportError("Mandatory parameter Name missing from section "
"[%s] starting at line: %d",
ctx.fname, ctx.m_sectionLineno);
return false;
}
BaseString::snprintf(ctx.pname, sizeof(ctx.pname), "EXTERNAL SYSTEM_%s", name);
return true;
}
/**
* Computer rule: Update "NoOfComputers", add "Type"
*/
......@@ -2990,87 +2957,6 @@ static bool fixNodeId(InitConfigFileParser::Context & ctx, const char * data)
return true;
}
/**
* @returns true if connection is external (one node is external)
* Also returns:
* - name of external system in parameter extSystemName, and
* - nodeId of external node in parameter extSystemNodeId.
*/
static bool
isExtConnection(InitConfigFileParser::Context & ctx,
const char **extSystemName, Uint32 * extSystemNodeId){
Uint32 nodeId1, nodeId2;
if (ctx.m_currentSection->contains("System1") &&
ctx.m_currentSection->get("System1", extSystemName) &&
ctx.m_currentSection->get("NodeId1", &nodeId1)) {
*extSystemNodeId = nodeId1;
return true;
}
if (ctx.m_currentSection->contains("System2") &&
ctx.m_currentSection->get("System2", extSystemName) &&
ctx.m_currentSection->get("NodeId2", &nodeId2)) {
*extSystemNodeId = nodeId2;
return true;
}
return false;
}
/**
* External Connection Rule:
* If connection is to an external system, then move connection into
* external system configuration (i.e. a sub-property).
*/
static bool
fixExtConnection(InitConfigFileParser::Context & ctx, const char * data){
const char * extSystemName;
Uint32 extSystemNodeId;
if (isExtConnection(ctx, &extSystemName, &extSystemNodeId)) {
Uint32 connections = 0;
ctx.m_userProperties.get("ExtNoOfConnections", &connections);
require(ctx.m_userProperties.put("ExtNoOfConnections",++connections, true));
char tmpLine1[MAX_LINE_LENGTH];
BaseString::snprintf(tmpLine1, MAX_LINE_LENGTH, "Connection_%d", connections-1);
/**
* Section: EXTERNAL SYSTEM_<Ext System Name>
*/
char extSystemPropName[MAX_LINE_LENGTH];
strncpy(extSystemPropName, "EXTERNAL SYSTEM_", MAX_LINE_LENGTH);
strncat(extSystemPropName, extSystemName, MAX_LINE_LENGTH);
strncat(extSystemPropName, ":", MAX_LINE_LENGTH);
strncat(extSystemPropName, tmpLine1, MAX_LINE_LENGTH);
/**
* Increase number of external connections for the system
*
* @todo Limitation: Only one external system is allowed
*/
require(ctx.m_userProperties.put("ExtSystem", extSystemName, true));
/**
* Make sure section is stored in right place
*/
strncpy(ctx.pname, extSystemPropName, MAX_LINE_LENGTH);
/**
* Since this is an external connection,
* decrease number of internal connections
*/
require(ctx.m_userProperties.get("NoOfConnections", &connections));
require(ctx.m_userProperties.put("NoOfConnections", --connections, true));
}
return true;
}
/**
* Connection rule: Fix hostname
*
......@@ -3113,7 +2999,7 @@ fixPortNumber(InitConfigFileParser::Context & ctx, const char * data){
DBUG_ENTER("fixPortNumber");
Uint32 id1= 0, id2= 0;
Uint32 id1, id2;
const char *hostName1;
const char *hostName2;
require(ctx.m_currentSection->get("NodeId1", &id1));
......@@ -3123,17 +3009,46 @@ fixPortNumber(InitConfigFileParser::Context & ctx, const char * data){
DBUG_PRINT("info",("NodeId1=%d HostName1=\"%s\"",id1,hostName1));
DBUG_PRINT("info",("NodeId2=%d HostName2=\"%s\"",id2,hostName2));
if (id1 > id2) {
Uint32 tmp= id1;
const char *tmp_name= hostName1;
hostName1= hostName2;
id1= id2;
hostName2= tmp_name;
id2= tmp;
}
const Properties *node1, *node2;
require(ctx.m_config->get("Node", id1, &node1));
require(ctx.m_config->get("Node", id2, &node2));
const Properties * node;
require(ctx.m_config->get("Node", id1, &node));
const char *type1, *type2;
require(node1->get("Type", &type1));
require(node2->get("Type", &type2));
/* add NodeIdServer info */
{
Uint32 nodeIdServer = id1 < id2 ? id1 : id2;
if(strcmp(type1, API_TOKEN) == 0 || strcmp(type2, MGM_TOKEN) == 0)
nodeIdServer = id2;
else if(strcmp(type2, API_TOKEN) == 0 || strcmp(type1, MGM_TOKEN) == 0)
nodeIdServer = id1;
ctx.m_currentSection->put("NodeIdServer", nodeIdServer);
if (id2 == nodeIdServer) {
{
const char *tmp= hostName1;
hostName1= hostName2;
hostName2= tmp;
}
{
Uint32 tmp= id1;
id1= id2;
id2= tmp;
}
{
const Properties *tmp= node1;
node1= node2;
node2= tmp;
}
{
const char *tmp= type1;
type1= type2;
type2= tmp;
}
}
}
BaseString hostname(hostName1);
......@@ -3144,21 +3059,13 @@ fixPortNumber(InitConfigFileParser::Context & ctx, const char * data){
}
Uint32 port= 0;
const char * type1;
const char * type2;
const Properties * node2;
node->get("Type", &type1);
ctx.m_config->get("Node", id2, &node2);
node2->get("Type", &type2);
if(strcmp(type1, MGM_TOKEN)==0)
node->get("PortNumber",&port);
node1->get("PortNumber",&port);
else if(strcmp(type2, MGM_TOKEN)==0)
node2->get("PortNumber",&port);
if (!port &&
!node->get("ServerPort", &port) &&
!node1->get("ServerPort", &port) &&
!ctx.m_userProperties.get("ServerPort_", id1, &port))
{
Uint32 base= 0;
......@@ -3309,11 +3216,6 @@ checkConnectionConstraints(InitConfigFileParser::Context & ctx, const char *){
ctx.m_currentSection->get("NodeId1", &id1);
ctx.m_currentSection->get("NodeId2", &id2);
// If external connection, just accept it
if (ctx.m_currentSection->contains("System1") ||
ctx.m_currentSection->contains("System2"))
return true;
if(id1 == id2){
ctx.reportError("Illegal connection from node to itself"
" - [%s] starting at line: %d",
......@@ -3346,12 +3248,10 @@ checkConnectionConstraints(InitConfigFileParser::Context & ctx, const char *){
* Report error if the following are true
* -# None of the nodes is of type DB
* -# Not both of them are MGMs
* -# None of them contain a "SystemX" name
*/
if((strcmp(type1, DB_TOKEN) != 0 && strcmp(type2, DB_TOKEN) != 0) &&
!(strcmp(type1, MGM_TOKEN) == 0 && strcmp(type2, MGM_TOKEN) == 0) &&
!ctx.m_currentSection->contains("System1") &&
!ctx.m_currentSection->contains("System2")){
!(strcmp(type1, MGM_TOKEN) == 0 && strcmp(type2, MGM_TOKEN) == 0))
{
ctx.reportError("Invalid connection between node %d (%s) and node %d (%s)"
" - [%s] starting at line: %d",
id1, type1, id2, type2,
......@@ -3441,11 +3341,11 @@ fixDepricated(InitConfigFileParser::Context & ctx, const char * data){
if(strcmp(p->m_section, ctx.fname) == 0){
double mul = p->m_mul;
double add = p->m_add;
if(strcmp(name, p->m_oldName) == 0){
if(strcasecmp(name, p->m_oldName) == 0){
if(!transform(ctx, tmp, name, p->m_newName, add, mul)){
return false;
}
} else if(strcmp(name, p->m_newName) == 0) {
} else if(strcasecmp(name, p->m_newName) == 0) {
if(!transform(ctx, tmp, name, p->m_oldName, -add/mul,1.0/mul)){
return false;
}
......@@ -3724,45 +3624,6 @@ static bool set_connection_priorities(Vector<ConfigInfo::ConfigRuleSection>&sect
DBUG_RETURN(true);
}
static bool add_server_ports(Vector<ConfigInfo::ConfigRuleSection>&sections,
struct InitConfigFileParser::Context &ctx,
const char * rule_data)
{
#if 0
Properties * props= ctx.m_config;
Properties computers(true);
Uint32 port_base = NDB_TCP_BASE_PORT;
Uint32 nNodes;
ctx.m_userProperties.get("NoOfNodes", &nNodes);
for (Uint32 i= 0, n= 0; n < nNodes; i++){
Properties * tmp;
if(!props->get("Node", i, &tmp)) continue;
n++;
const char * type;
if(!tmp->get("Type", &type)) continue;
Uint32 port;
if (tmp->get("ServerPort", &port)) continue;
Uint32 computer;
if (!tmp->get("ExecuteOnComputer", &computer)) continue;
Uint32 adder= 0;
computers.get("",computer, &adder);
if (strcmp(type,DB_TOKEN) == 0) {
adder++;
tmp->put("ServerPort", port_base+adder);
computers.put("",computer, adder);
}
}
#endif
return true;
}
static bool
check_node_vs_replicas(Vector<ConfigInfo::ConfigRuleSection>&sections,
struct InitConfigFileParser::Context &ctx,
......
......@@ -640,7 +640,7 @@ InitConfigFileParser::store_in_properties(Vector<struct my_option>& options,
value_int = *(Uint64*)options[i].value;
break;
case GET_STR:
ctx.m_currentSection->put(options[i].name, (char*)options[i].value);
ctx.m_currentSection->put(options[i].name, *(char**)options[i].value);
continue;
default:
abort();
......@@ -762,9 +762,6 @@ InitConfigFileParser::parse_mycnf()
Vector<struct my_option> options;
for(i = 0; i<ConfigInfo::m_NoOfParams; i++)
{
if (strcmp(ConfigInfo::m_ParamInfo[i]._section, "DB") == 0 ||
strcmp(ConfigInfo::m_ParamInfo[i]._section, "API") == 0 ||
strcmp(ConfigInfo::m_ParamInfo[i]._section, "MGM") == 0)
{
struct my_option opt;
bzero(&opt, sizeof(opt));
......@@ -855,6 +852,12 @@ InitConfigFileParser::parse_mycnf()
goto end;
if(!handle_mycnf_defaults(options, ctx, "MGM"))
goto end;
if(!handle_mycnf_defaults(options, ctx, "TCP"))
goto end;
if(!handle_mycnf_defaults(options, ctx, "SHM"))
goto end;
if(!handle_mycnf_defaults(options, ctx, "SCI"))
goto end;
{
struct sect { struct my_option* src; const char * name; } sections[] =
......
......@@ -33,7 +33,7 @@
static int g_verbose = 0;
static int try_reconnect = 3;
static int g_nodes = 1;
static int g_nodes, g_connections, g_section;
static const char * g_connectstring = 0;
static const char * g_query = 0;
......@@ -70,13 +70,19 @@ static struct my_option my_long_options[] =
"Overides specifying entries in NDB_CONNECTSTRING and Ndb.cfg",
(gptr*) &g_connectstring, (gptr*) &g_connectstring,
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
{ "ndb-shm", 256, "Print nodes",
(gptr*) &opt_ndb_shm, (gptr*) &opt_ndb_shm,
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{ "nodes", 256, "Print nodes",
(gptr*) &g_nodes, (gptr*) &g_nodes,
0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{ "connections", 256, "Print connections",
(gptr*) &g_connections, (gptr*) &g_connections,
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{ "query", 'q', "Query option(s)",
(gptr*) &g_query, (gptr*) &g_query,
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{ "host", 257, "Host",
{ "host", 256, "Host",
(gptr*) &g_host, (gptr*) &g_host,
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{ "type", 258, "Type of node/connection",
......@@ -155,6 +161,11 @@ struct NodeTypeApply : public Apply
virtual int apply(const Iter&);
};
struct ConnectionTypeApply : public Apply
{
virtual int apply(const Iter&);
};
static int parse_query(Vector<Apply*>&, int &argc, char**& argv);
static int parse_where(Vector<Match*>&, int &argc, char**& argv);
static int eval(const Iter&, const Vector<Match*>&);
......@@ -172,6 +183,15 @@ main(int argc, char** argv){
ndb_std_get_one_option)))
return -1;
if (g_nodes && g_connections)
{
ndbout_c("Only one option of --nodes and --connections allowed");
}
g_section = CFG_SECTION_NODE; //default
if (g_connections)
g_section = CFG_SECTION_CONNECTION;
ndb_mgm_configuration * conf = 0;
if (g_config_file || g_mycnf)
......@@ -202,7 +222,7 @@ main(int argc, char** argv){
exit(0);
}
Iter iter(* conf, CFG_SECTION_NODE);
Iter iter(* conf, g_section);
bool prev= false;
iter.first();
for(iter.first(); iter.valid(); iter.next())
......@@ -231,13 +251,32 @@ parse_query(Vector<Apply*>& select, int &argc, char**& argv)
for(unsigned i = 0; i<list.size(); i++)
{
const char * str= list[i].c_str();
if(strcasecmp(str, "id") == 0 || strcasecmp(str, "nodeid") == 0)
select.push_back(new Apply(CFG_NODE_ID));
else if(strncasecmp(str, "host", 4) == 0)
select.push_back(new Apply(CFG_NODE_HOST));
else if(strcasecmp(str, "type") == 0)
select.push_back(new NodeTypeApply());
else if(g_nodes)
if(g_section == CFG_SECTION_NODE)
{
if(strcasecmp(str, "id") == 0 || strcasecmp(str, "nodeid") == 0)
{
select.push_back(new Apply(CFG_NODE_ID));
continue;
}
else if(strncasecmp(str, "host", 4) == 0)
{
select.push_back(new Apply(CFG_NODE_HOST));
continue;
}
else if(strcasecmp(str, "type") == 0)
{
select.push_back(new NodeTypeApply());
continue;
}
}
else if (g_section == CFG_SECTION_CONNECTION)
{
if(strcasecmp(str, "type") == 0)
{
select.push_back(new ConnectionTypeApply());
continue;
}
}
{
bool found = false;
for(int p = 0; p<ConfigInfo::m_NoOfParams; p++)
......@@ -245,9 +284,15 @@ parse_query(Vector<Apply*>& select, int &argc, char**& argv)
if(0)ndbout_c("%s %s",
ConfigInfo::m_ParamInfo[p]._section,
ConfigInfo::m_ParamInfo[p]._fname);
if(strcmp(ConfigInfo::m_ParamInfo[p]._section, "DB") == 0 ||
strcmp(ConfigInfo::m_ParamInfo[p]._section, "API") == 0 ||
strcmp(ConfigInfo::m_ParamInfo[p]._section, "MGM") == 0)
if(g_section == CFG_SECTION_CONNECTION &&
(strcmp(ConfigInfo::m_ParamInfo[p]._section, "TCP") == 0 ||
strcmp(ConfigInfo::m_ParamInfo[p]._section, "SCI") == 0 ||
strcmp(ConfigInfo::m_ParamInfo[p]._section, "SHM") == 0)
||
g_section == CFG_SECTION_NODE &&
(strcmp(ConfigInfo::m_ParamInfo[p]._section, "DB") == 0 ||
strcmp(ConfigInfo::m_ParamInfo[p]._section, "API") == 0 ||
strcmp(ConfigInfo::m_ParamInfo[p]._section, "MGM") == 0))
{
if(strcasecmp(ConfigInfo::m_ParamInfo[p]._fname, str) == 0)
{
......@@ -263,11 +308,6 @@ parse_query(Vector<Apply*>& select, int &argc, char**& argv)
return 1;
}
}
else
{
fprintf(stderr, "Unknown query option: %s\n", str);
return 1;
}
}
}
return 0;
......@@ -425,6 +465,31 @@ NodeTypeApply::apply(const Iter& iter)
return 0;
}
int
ConnectionTypeApply::apply(const Iter& iter)
{
Uint32 val32;
if (iter.get(CFG_TYPE_OF_SECTION, &val32) == 0)
{
switch (val32)
{
case CONNECTION_TYPE_TCP:
printf("tcp");
break;
case CONNECTION_TYPE_SCI:
printf("sci");
break;
case CONNECTION_TYPE_SHM:
printf("shm");
break;
default:
printf("<unknown>");
break;
}
}
return 0;
}
ndb_mgm_configuration*
fetch_configuration()
{
......
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