diff options
author | unknown <joreland@mysql.com> | 2004-08-20 15:58:30 +0200 |
---|---|---|
committer | unknown <joreland@mysql.com> | 2004-08-20 15:58:30 +0200 |
commit | a4b3048299aff87e86e2cc731f281e8140e5fa44 (patch) | |
tree | f1ef7e58688c79c6e414e8433982476e975b15a6 /ndb | |
parent | ed7d4eeb699a136cfff4d434723e047f0d10ed67 (diff) | |
download | mariadb-git-a4b3048299aff87e86e2cc731f281e8140e5fa44.tar.gz |
bug#5128 - remove need of unique fs-path
bug#4761 - more validation of hosts
bug#4511 - only non depricated should be saved in config
- fix ConfigInfo::BOOL w.r.t deprication
mysql-test/ndb/ndb_config_2_node.ini:
Removed need of unique filesystem
mysql-test/ndb/ndbcluster.sh:
Removed need of unique filesystem
Add "" around variables for increased portability
ndb/src/common/mgmcommon/ConfigInfo.cpp:
Added checking of hostnames already in InitConfigFileParser
ndb/src/common/mgmcommon/ConfigRetriever.cpp:
Add checking of hostnames when retreiving configuration
ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp:
Added ndb_%u to filesystempath
ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp:
Added ndb_%u to filesystempath
ndb/src/kernel/blocks/ndbfs/Filename.cpp:
Added ndb_%u to filesystempath
ndb/src/kernel/blocks/ndbfs/Filename.hpp:
Added ndb_%u to filesystempath
ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp:
Added ndb_%u to filesystempath
Diffstat (limited to 'ndb')
-rw-r--r-- | ndb/src/common/mgmcommon/ConfigInfo.cpp | 131 | ||||
-rw-r--r-- | ndb/src/common/mgmcommon/ConfigRetriever.cpp | 43 | ||||
-rw-r--r-- | ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp | 4 | ||||
-rw-r--r-- | ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp | 2 | ||||
-rw-r--r-- | ndb/src/kernel/blocks/ndbfs/Filename.cpp | 11 | ||||
-rw-r--r-- | ndb/src/kernel/blocks/ndbfs/Filename.hpp | 2 | ||||
-rw-r--r-- | ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp | 2 |
7 files changed, 137 insertions, 58 deletions
diff --git a/ndb/src/common/mgmcommon/ConfigInfo.cpp b/ndb/src/common/mgmcommon/ConfigInfo.cpp index 78f81f29ad8..30a709abe14 100644 --- a/ndb/src/common/mgmcommon/ConfigInfo.cpp +++ b/ndb/src/common/mgmcommon/ConfigInfo.cpp @@ -14,6 +14,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include <NdbTCP.h> #include "ConfigInfo.hpp" #include <mgmapi_config_parameters.h> #include <ndb_limits.h> @@ -48,24 +49,25 @@ sizeof(m_sectionNames)/sizeof(char*); /**************************************************************************** * Section Rules declarations ****************************************************************************/ -bool transformComputer(InitConfigFileParser::Context & ctx, const char *); -bool transformSystem(InitConfigFileParser::Context & ctx, const char *); -bool transformExternalSystem(InitConfigFileParser::Context & ctx, const char *); -bool transformNode(InitConfigFileParser::Context & ctx, const char *); -bool transformExtNode(InitConfigFileParser::Context & ctx, const char *); -bool transformConnection(InitConfigFileParser::Context & ctx, const char *); -bool applyDefaultValues(InitConfigFileParser::Context & ctx, const char *); -bool checkMandatory(InitConfigFileParser::Context & ctx, const char *); -bool fixPortNumber(InitConfigFileParser::Context & ctx, const char *); -bool fixShmkey(InitConfigFileParser::Context & ctx, const char *); -bool checkDbConstraints(InitConfigFileParser::Context & ctx, const char *); -bool checkConnectionConstraints(InitConfigFileParser::Context &, const char *); -bool fixNodeHostname(InitConfigFileParser::Context & ctx, const char * data); -bool fixHostname(InitConfigFileParser::Context & ctx, const char * data); -bool fixNodeId(InitConfigFileParser::Context & ctx, const char * data); -bool fixExtConnection(InitConfigFileParser::Context & ctx, const char * data); -bool fixDepricated(InitConfigFileParser::Context & ctx, const char *); -bool saveInConfigValues(InitConfigFileParser::Context & ctx, const 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 transformConnection(InitConfigFileParser::Context & ctx, const char *); +static bool applyDefaultValues(InitConfigFileParser::Context & ctx, const char *); +static bool checkMandatory(InitConfigFileParser::Context & ctx, const char *); +static bool fixPortNumber(InitConfigFileParser::Context & ctx, const char *); +static bool fixShmkey(InitConfigFileParser::Context & ctx, const char *); +static bool checkDbConstraints(InitConfigFileParser::Context & ctx, const char *); +static bool checkConnectionConstraints(InitConfigFileParser::Context &, const char *); +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 *); const ConfigInfo::SectionRule ConfigInfo::m_SectionRules[] = { @@ -130,7 +132,9 @@ ConfigInfo::m_SectionRules[] = { { "SCI", checkConnectionConstraints, 0 }, { "OSE", checkConnectionConstraints, 0 }, - + { "TCP", checkTCPConstraints, "HostName1" }, + { "TCP", checkTCPConstraints, "HostName2" }, + { "*", checkMandatory, 0 }, { "DB", saveInConfigValues, 0 }, @@ -148,13 +152,13 @@ const int ConfigInfo::m_NoOfRules = sizeof(m_SectionRules)/sizeof(SectionRule); /**************************************************************************** * Config Rules declarations ****************************************************************************/ -bool add_node_connections(Vector<ConfigInfo::ConfigRuleSection>§ions, +static bool add_node_connections(Vector<ConfigInfo::ConfigRuleSection>§ions, struct InitConfigFileParser::Context &ctx, const char * rule_data); -bool add_server_ports(Vector<ConfigInfo::ConfigRuleSection>§ions, +static bool add_server_ports(Vector<ConfigInfo::ConfigRuleSection>§ions, struct InitConfigFileParser::Context &ctx, const char * rule_data); -bool check_node_vs_replicas(Vector<ConfigInfo::ConfigRuleSection>§ions, +static bool check_node_vs_replicas(Vector<ConfigInfo::ConfigRuleSection>§ions, struct InitConfigFileParser::Context &ctx, const char * rule_data); @@ -812,7 +816,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = { 1}, { - CFG_DB_DISCLESS, + KEY_INTERNAL, "Discless", "DB", "Diskless", @@ -2219,22 +2223,13 @@ fixNodeHostname(InitConfigFileParser::Context & ctx, const char * data){ require(ctx.m_currentSection->put("HostName", "")); const char * type; - if(ctx.m_currentSection->get("Type", &type) && - strcmp(type,"DB") == 0) - { - ctx.reportError("Parameter \"ExecuteOnComputer\" missing from DB section " - "[%s] starting at line: %d", - ctx.fname, ctx.m_sectionLineno); + if(ctx.m_currentSection->get("Type", &type) && strcmp(type,"DB") == 0) { + ctx.reportError("Parameter \"ExecuteOnComputer\" missing from DB section" + " [%s] starting at line: %d", + ctx.fname, ctx.m_sectionLineno); return false; } - return true; -#if 0 - ctx.reportError("Parameter \"ExecuteOnComputer\" missing from section " - "[%s] starting at line: %d", - ctx.fname, ctx.m_sectionLineno); - return false; -#endif } const Properties * computer; @@ -2362,6 +2357,22 @@ transformComputer(InitConfigFileParser::Context & ctx, const char * data){ ctx.m_userProperties.get("NoOfComputers", &computers); ctx.m_userProperties.put("NoOfComputers", ++computers, true); + const char * hostname = 0; + ctx.m_currentSection->get("HostName", &hostname); + if(!hostname){ + return true; + } + + if(!strcmp(hostname, "localhost") || !strcmp(hostname, "127.0.0.1")){ + if(ctx.m_userProperties.get("$computer-localhost", &hostname)){ + ctx.reportError("Mixing of localhost with other hostname(%s) is illegal", + hostname); + return false; + } + } else { + ctx.m_userProperties.put("$computer-localhost", hostname); + } + return true; } @@ -2449,7 +2460,7 @@ checkMandatory(InitConfigFileParser::Context & ctx, const char * data){ * Transform a string "NodeidX" (e.g. "uppsala.32") * into a Uint32 "NodeIdX" (e.g. 32) and a string "SystemX" (e.g. "uppsala"). */ -bool fixNodeId(InitConfigFileParser::Context & ctx, const char * data) +static bool fixNodeId(InitConfigFileParser::Context & ctx, const char * data) { char buf[] = "NodeIdX"; buf[6] = data[sizeof("NodeI")]; char sysbuf[] = "SystemX"; sysbuf[6] = data[sizeof("NodeI")]; @@ -2485,7 +2496,7 @@ bool fixNodeId(InitConfigFileParser::Context & ctx, const char * data) * - name of external system in parameter extSystemName, and * - nodeId of external node in parameter extSystemNodeId. */ -bool +static bool isExtConnection(InitConfigFileParser::Context & ctx, const char **extSystemName, Uint32 * extSystemNodeId){ @@ -2513,7 +2524,7 @@ isExtConnection(InitConfigFileParser::Context & ctx, * If connection is to an external system, then move connection into * external system configuration (i.e. a sub-property). */ -bool +static bool fixExtConnection(InitConfigFileParser::Context & ctx, const char * data){ const char * extSystemName; @@ -2568,7 +2579,7 @@ fixExtConnection(InitConfigFileParser::Context & ctx, const char * data){ * -# Via Node's ExecuteOnComputer lookup Hostname * -# Add HostName to Connection */ -bool +static bool fixHostname(InitConfigFileParser::Context & ctx, const char * data){ char buf[] = "NodeIdX"; buf[6] = data[sizeof("HostNam")]; @@ -2591,7 +2602,7 @@ fixHostname(InitConfigFileParser::Context & ctx, const char * data){ /** * Connection rule: Fix port number (using a port number adder) */ -bool +static bool fixPortNumber(InitConfigFileParser::Context & ctx, const char * data){ Uint32 id1= 0, id2= 0; @@ -2645,7 +2656,7 @@ fixPortNumber(InitConfigFileParser::Context & ctx, const char * data){ /** * DB Node rule: Check various constraints */ -bool +static bool checkDbConstraints(InitConfigFileParser::Context & ctx, const char *){ Uint32 t1 = 0, t2 = 0; @@ -2678,7 +2689,7 @@ checkDbConstraints(InitConfigFileParser::Context & ctx, const char *){ /** * Connection rule: Check varius constraints */ -bool +static bool checkConnectionConstraints(InitConfigFileParser::Context & ctx, const char *){ Uint32 id1 = 0, id2 = 0; @@ -2734,6 +2745,22 @@ checkConnectionConstraints(InitConfigFileParser::Context & ctx, const char *){ ctx.fname, ctx.m_sectionLineno); return false; } + + return true; +} + +static bool +checkTCPConstraints(InitConfigFileParser::Context & ctx, const char * data){ + + const char * host; + struct in_addr addr; + if(ctx.m_currentSection->get(data, &host) && strlen(host) && + Ndb_getInAddr(&addr, host)){ + ctx.reportError("Unable to lookup/illegal hostname %s" + " - [%s] starting at line: %d", + host, ctx.fname, ctx.m_sectionLineno); + return false; + } return true; } @@ -2777,15 +2804,15 @@ transform(InitConfigFileParser::Context & ctx, return false; } - if(newType == ConfigInfo::INT){ + if(newType == ConfigInfo::INT || newType == ConfigInfo::BOOL){ require(dst.put(newName, (Uint32)newVal)); - } else { + } else if(newType == ConfigInfo::INT64) { require(dst.put64(newName, newVal)); } return true; } -bool +static bool fixDepricated(InitConfigFileParser::Context & ctx, const char * data){ const char * name; /** @@ -2845,7 +2872,7 @@ fixDepricated(InitConfigFileParser::Context & ctx, const char * data){ return true; } -bool +static bool saveInConfigValues(InitConfigFileParser::Context & ctx, const char * data){ const Properties * sec; if(!ctx.m_currentInfo->get(ctx.fname, &sec)){ @@ -2893,30 +2920,34 @@ saveInConfigValues(InitConfigFileParser::Context & ctx, const char * data){ Uint32 val; require(ctx.m_currentSection->get(n, &val)); ok = ctx.m_configValues.put(id, val); + ndbout_c("put %s %d %d", n, id, val); break; } case PropertiesType_Uint64:{ Uint64 val; require(ctx.m_currentSection->get(n, &val)); ok = ctx.m_configValues.put64(id, val); + ndbout_c("put64 %s %d %lld", n, id, val); break; } case PropertiesType_char:{ const char * val; require(ctx.m_currentSection->get(n, &val)); ok = ctx.m_configValues.put(id, val); + ndbout_c("put %s %d %s", n, id, val); break; } default: abort(); } + require(ok); } ctx.m_configValues.closeSection(); } while(0); return true; } -bool +static bool add_node_connections(Vector<ConfigInfo::ConfigRuleSection>§ions, struct InitConfigFileParser::Context &ctx, const char * rule_data) @@ -3003,7 +3034,7 @@ add_node_connections(Vector<ConfigInfo::ConfigRuleSection>§ions, } -bool add_server_ports(Vector<ConfigInfo::ConfigRuleSection>§ions, +static bool add_server_ports(Vector<ConfigInfo::ConfigRuleSection>§ions, struct InitConfigFileParser::Context &ctx, const char * rule_data) { @@ -3042,7 +3073,7 @@ bool add_server_ports(Vector<ConfigInfo::ConfigRuleSection>§ions, return true; } -bool +static bool check_node_vs_replicas(Vector<ConfigInfo::ConfigRuleSection>§ions, struct InitConfigFileParser::Context &ctx, const char * rule_data) diff --git a/ndb/src/common/mgmcommon/ConfigRetriever.cpp b/ndb/src/common/mgmcommon/ConfigRetriever.cpp index b8856382c15..2e809907058 100644 --- a/ndb/src/common/mgmcommon/ConfigRetriever.cpp +++ b/ndb/src/common/mgmcommon/ConfigRetriever.cpp @@ -37,6 +37,7 @@ #include <mgmapi.h> #include <mgmapi_config_parameters.h> +#include <mgmapi_configuration.hpp> #include <ConfigValues.hpp> #include <NdbHost.h> @@ -267,7 +268,7 @@ ConfigRetriever::verifyConfig(const struct ndb_mgm_configuration * conf){ char localhost[MAXHOSTNAMELEN]; if(NdbHost_GetHostName(localhost) != 0){ - snprintf(buf, 255, "Unable to own hostname"); + snprintf(buf, 255, "Unable to get own hostname"); setError(CR_ERROR, buf); return false; } @@ -317,6 +318,46 @@ ConfigRetriever::verifyConfig(const struct ndb_mgm_configuration * conf){ return false; } + /** + * Check hostnames + */ + ndb_mgm_configuration_iterator iter(* conf, CFG_SECTION_CONNECTION); + for(iter.first(); iter.valid(); iter.next()){ + + Uint32 type = CONNECTION_TYPE_TCP + 1; + if(iter.get(CFG_TYPE_OF_SECTION, &type)) continue; + if(type != CONNECTION_TYPE_TCP) continue; + + Uint32 nodeId1, nodeId2, remoteNodeId; + if(iter.get(CFG_CONNECTION_NODE_1, &nodeId1)) continue; + if(iter.get(CFG_CONNECTION_NODE_2, &nodeId2)) continue; + + if(nodeId1 != _ownNodeId && nodeId2 != _ownNodeId) continue; + remoteNodeId = (_ownNodeId == nodeId1 ? nodeId2 : nodeId1); + + const char * name; + struct in_addr addr; + BaseString tmp; + if(!iter.get(CFG_TCP_HOSTNAME_1, &name) && strlen(name)){ + if(Ndb_getInAddr(&addr, name) != 0){ + tmp.assfmt("Unable to lookup/illegal hostname %s, " + "connection from node %d to node %d", + name, _ownNodeId, remoteNodeId); + setError(CR_ERROR, tmp.c_str()); + return false; + } + } + + if(!iter.get(CFG_TCP_HOSTNAME_2, &name) && strlen(name)){ + if(Ndb_getInAddr(&addr, name) != 0){ + tmp.assfmt("Unable to lookup/illegal hostname %s, " + "connection from node %d to node %d", + name, _ownNodeId, remoteNodeId); + setError(CR_ERROR, tmp.c_str()); + return false; + } + } + } return true; } diff --git a/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp b/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp index f6607cdbdbb..18e46d2d004 100644 --- a/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp +++ b/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp @@ -108,8 +108,8 @@ AsyncFile::AsyncFile() : } void -AsyncFile::doStart(const char * filesystemPath) { - theFileName.init(filesystemPath); +AsyncFile::doStart(Uint32 nodeId, const char * filesystemPath) { + theFileName.init(nodeId, filesystemPath); // Stacksize for filesystem threads // An 8k stack should be enough diff --git a/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp b/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp index caa03e52d0c..9a405bc1580 100644 --- a/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp +++ b/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp @@ -181,7 +181,7 @@ public: void execute( Request* request ); - void doStart(const char * fspath); + void doStart(Uint32 nodeId, const char * fspath); // its a thread so its always running void run(); diff --git a/ndb/src/kernel/blocks/ndbfs/Filename.cpp b/ndb/src/kernel/blocks/ndbfs/Filename.cpp index 494c9c74eb9..660fe6eee94 100644 --- a/ndb/src/kernel/blocks/ndbfs/Filename.cpp +++ b/ndb/src/kernel/blocks/ndbfs/Filename.cpp @@ -46,7 +46,7 @@ Filename::Filename() : } void -Filename::init(const char * pFileSystemPath){ +Filename::init(Uint32 nodeid, const char * pFileSystemPath){ if (pFileSystemPath == NULL) { ERROR_SET(fatal, AFS_ERROR_NOPATH, ""," Filename::init()"); return; @@ -75,8 +75,15 @@ Filename::init(const char * pFileSystemPath){ DIR_SEPARATOR) != 0) strcat(theBaseDirectory, DIR_SEPARATOR); -} + snprintf(buf2, sizeof(buf2), "ndb_%u_fs%s", nodeid, DIR_SEPARATOR); + strcat(theBaseDirectory, buf2); +#ifdef NDB_WIN32 + CreateDirectory(theBaseDirectory, 0); +#else + mkdir(theBaseDirectory, S_IRUSR | S_IWUSR | S_IXUSR | S_IXGRP | S_IRGRP); +#endif +} Filename::~Filename(){ } diff --git a/ndb/src/kernel/blocks/ndbfs/Filename.hpp b/ndb/src/kernel/blocks/ndbfs/Filename.hpp index 29aba79c9dc..25c06092436 100644 --- a/ndb/src/kernel/blocks/ndbfs/Filename.hpp +++ b/ndb/src/kernel/blocks/ndbfs/Filename.hpp @@ -68,7 +68,7 @@ public: int levels() const; const char* c_str() const; - void init(const char * fileSystemPath); + void init(Uint32 nodeid, const char * fileSystemPath); private: int theLevelDepth; diff --git a/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp b/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp index 123c7f9207f..3b8cb20fe5c 100644 --- a/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp +++ b/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp @@ -559,7 +559,7 @@ Ndbfs::createAsyncFile(){ } AsyncFile* file = new AsyncFile; - file->doStart(theFileSystemPath); + file->doStart(getOwnNodeId(), theFileSystemPath); // Put the file in list of all files theFiles.push_back(file); |