summaryrefslogtreecommitdiff
path: root/ndb
diff options
context:
space:
mode:
authorunknown <joreland@mysql.com>2004-08-20 15:58:30 +0200
committerunknown <joreland@mysql.com>2004-08-20 15:58:30 +0200
commita4b3048299aff87e86e2cc731f281e8140e5fa44 (patch)
treef1ef7e58688c79c6e414e8433982476e975b15a6 /ndb
parented7d4eeb699a136cfff4d434723e047f0d10ed67 (diff)
downloadmariadb-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.cpp131
-rw-r--r--ndb/src/common/mgmcommon/ConfigRetriever.cpp43
-rw-r--r--ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp4
-rw-r--r--ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp2
-rw-r--r--ndb/src/kernel/blocks/ndbfs/Filename.cpp11
-rw-r--r--ndb/src/kernel/blocks/ndbfs/Filename.hpp2
-rw-r--r--ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp2
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>&sections,
+static bool add_node_connections(Vector<ConfigInfo::ConfigRuleSection>&sections,
struct InitConfigFileParser::Context &ctx,
const char * rule_data);
-bool add_server_ports(Vector<ConfigInfo::ConfigRuleSection>&sections,
+static bool add_server_ports(Vector<ConfigInfo::ConfigRuleSection>&sections,
struct InitConfigFileParser::Context &ctx,
const char * rule_data);
-bool check_node_vs_replicas(Vector<ConfigInfo::ConfigRuleSection>&sections,
+static bool check_node_vs_replicas(Vector<ConfigInfo::ConfigRuleSection>&sections,
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>&sections,
struct InitConfigFileParser::Context &ctx,
const char * rule_data)
@@ -3003,7 +3034,7 @@ add_node_connections(Vector<ConfigInfo::ConfigRuleSection>&sections,
}
-bool add_server_ports(Vector<ConfigInfo::ConfigRuleSection>&sections,
+static bool add_server_ports(Vector<ConfigInfo::ConfigRuleSection>&sections,
struct InitConfigFileParser::Context &ctx,
const char * rule_data)
{
@@ -3042,7 +3073,7 @@ bool add_server_ports(Vector<ConfigInfo::ConfigRuleSection>&sections,
return true;
}
-bool
+static bool
check_node_vs_replicas(Vector<ConfigInfo::ConfigRuleSection>&sections,
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);