summaryrefslogtreecommitdiff
path: root/ndb/src
diff options
context:
space:
mode:
Diffstat (limited to 'ndb/src')
-rw-r--r--ndb/src/common/mgmcommon/ConfigRetriever.cpp268
-rw-r--r--ndb/src/common/mgmcommon/LocalConfig.cpp94
-rw-r--r--ndb/src/common/mgmcommon/LocalConfig.hpp81
-rw-r--r--ndb/src/kernel/main.cpp11
-rw-r--r--ndb/src/kernel/vm/Configuration.cpp72
-rw-r--r--ndb/src/kernel/vm/Configuration.hpp1
-rw-r--r--ndb/src/mgmapi/mgmapi.cpp21
-rw-r--r--ndb/src/mgmclient/main.cpp10
-rw-r--r--ndb/src/mgmsrv/MgmtSrvr.cpp29
-rw-r--r--ndb/src/mgmsrv/MgmtSrvr.hpp5
-rw-r--r--ndb/src/mgmsrv/MgmtSrvrConfig.cpp7
-rw-r--r--ndb/src/mgmsrv/Services.cpp41
-rw-r--r--ndb/src/mgmsrv/main.cpp23
-rw-r--r--ndb/src/ndbapi/TransporterFacade.cpp52
14 files changed, 274 insertions, 441 deletions
diff --git a/ndb/src/common/mgmcommon/ConfigRetriever.cpp b/ndb/src/common/mgmcommon/ConfigRetriever.cpp
index 2de82d7250e..b8856382c15 100644
--- a/ndb/src/common/mgmcommon/ConfigRetriever.cpp
+++ b/ndb/src/common/mgmcommon/ConfigRetriever.cpp
@@ -43,33 +43,14 @@
//****************************************************************************
//****************************************************************************
-ConfigRetriever::ConfigRetriever() {
+ConfigRetriever::ConfigRetriever(Uint32 version, Uint32 node_type) {
- _localConfigFileName = 0;
- m_defaultConnectString = 0;
-
-
- errorString = 0;
- _localConfig = new LocalConfig();
- m_connectString = 0;
-
m_handle= 0;
+ m_version = version;
+ m_node_type = node_type;
}
ConfigRetriever::~ConfigRetriever(){
- if(_localConfigFileName != 0)
- free(_localConfigFileName);
-
- if(m_defaultConnectString != 0)
- free(m_defaultConnectString);
-
- if(m_connectString != 0)
- free(m_connectString);
-
- if(errorString != 0)
- free(errorString);
-
- delete _localConfig;
if (m_handle) {
ndb_mgm_disconnect(m_handle);
@@ -82,68 +63,51 @@ ConfigRetriever::~ConfigRetriever(){
//****************************************************************************
int
-ConfigRetriever::init(bool onlyNodeId) {
- if (_localConfig->init(onlyNodeId, m_connectString, _localConfigFileName, m_defaultConnectString)) {
- return _ownNodeId = (*_localConfig)._ownNodeId;
+ConfigRetriever::init() {
+ if (!_localConfig.init(m_connectString.c_str(),
+ _localConfigFileName.c_str())){
+
+ setError(CR_ERROR, "error in retrieving contact info for mgmtsrvr");
+ _localConfig.printError();
+ _localConfig.printUsage();
+ return -1;
}
-
- setError(CR_ERROR, "error in retrieving contact info for mgmtsrvr");
- _localConfig->printError();
- _localConfig->printUsage();
-
- return -1;
-}
-//****************************************************************************
-//****************************************************************************
-//****************************************************************************
-//****************************************************************************
-struct ndb_mgm_configuration*
-ConfigRetriever::getConfig(int verId, int nodeType) {
+ return _ownNodeId = _localConfig._ownNodeId;
+}
- int res = init();
- if (res == -1) {
- return 0;
- }
+int
+ConfigRetriever::do_connect(){
- if (_localConfig->items == 0){
- setError(CR_ERROR,"No Management Servers configured in local config file");
- return 0;
+ if(!m_handle)
+ m_handle= ndb_mgm_create_handle();
+
+ if (m_handle == 0) {
+ setError(CR_ERROR, "Unable to allocate mgm handle");
+ return -1;
}
int retry = 1;
int retry_max = 12; // Max number of retry attempts
int retry_interval= 5; // Seconds between each retry
- do {
+ while(retry < retry_max){
Uint32 type = CR_ERROR;
- for (int i = 0; i<_localConfig->items; i++){
- MgmtSrvrId * m = _localConfig->ids[i];
- struct ndb_mgm_configuration * p = 0;
+ BaseString tmp;
+ for (int i = 0; i<_localConfig.ids.size(); i++){
+ MgmtSrvrId * m = &_localConfig.ids[i];
switch(m->type){
case MgmId_TCP:
- p = getConfig(m->data.tcp.remoteHost, m->data.tcp.port,
- verId, nodeType);
- break;
- case MgmId_File:
- p = getConfig(m->data.file.filename, verId);
- break;
- default:
- setError(CR_ERROR, "Unknown error type");
- break;
- }
-
- if (p != 0) {
- if(!verifyConfig(p, nodeType)){
- free(p);
+ tmp.assfmt("%s:%d", m->name.c_str(), m->port);
+ if (ndb_mgm_connect(m_handle, tmp.c_str()) == 0) {
return 0;
}
- return p;
+ setError(CR_RETRY, ndb_mgm_get_latest_error_desc(m_handle));
+ case MgmId_File:
+ break;
}
- if(latestErrorType == CR_RETRY)
- type = CR_RETRY;
- } // for
-
- if(type == CR_RETRY){
+ }
+
+ if(latestErrorType == CR_RETRY){
REPORT_WARNING("Failed to retrieve cluster configuration");
ndbout << "(Cause of failure: " << getErrorString() << ")" << endl;
ndbout << "Attempt " << retry << " of " << retry_max << ". "
@@ -154,82 +118,63 @@ ConfigRetriever::getConfig(int verId, int nodeType) {
break;
}
retry++;
-
- } while (retry <= retry_max);
+ }
- return 0;
+ ndb_mgm_destroy_handle(&m_handle);
+ m_handle= 0;
+ return -1;
}
-ndb_mgm_configuration *
-ConfigRetriever::getConfig(const char * mgmhost,
- short port,
- int versionId,
- int nodetype){
- if (m_handle) {
- ndb_mgm_disconnect(m_handle);
- ndb_mgm_destroy_handle(&m_handle);
- }
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+struct ndb_mgm_configuration*
+ConfigRetriever::getConfig() {
- m_handle = ndb_mgm_create_handle();
+ struct ndb_mgm_configuration * p = 0;
- if (m_handle == 0) {
- setError(CR_ERROR, "Unable to allocate mgm handle");
- return 0;
+ if(m_handle != 0){
+ p = getConfig(m_handle);
+ } else {
+ for (int i = 0; i<_localConfig.ids.size(); i++){
+ MgmtSrvrId * m = &_localConfig.ids[i];
+ switch(m->type){
+ case MgmId_File:
+ p = getConfig(m->name.c_str());
+ break;
+ case MgmId_TCP:
+ break;
+ }
+ if(p)
+ break;
+ }
}
-
- BaseString tmp;
- tmp.assfmt("%s:%d", mgmhost, port);
- if (ndb_mgm_connect(m_handle, tmp.c_str()) != 0) {
- setError(CR_RETRY, ndb_mgm_get_latest_error_desc(m_handle));
- ndb_mgm_destroy_handle(&m_handle);
- m_handle= 0;
+ if(p == 0)
return 0;
+
+ if(!verifyConfig(p)){
+ free(p);
+ p= 0;
}
+
+ return p;
+}
- ndb_mgm_configuration * conf = ndb_mgm_get_configuration(m_handle, versionId);
+ndb_mgm_configuration *
+ConfigRetriever::getConfig(NdbMgmHandle m_handle){
+
+ ndb_mgm_configuration * conf = ndb_mgm_get_configuration(m_handle,m_version);
if(conf == 0){
setError(CR_ERROR, ndb_mgm_get_latest_error_desc(m_handle));
- ndb_mgm_disconnect(m_handle);
- ndb_mgm_destroy_handle(&m_handle);
- m_handle= 0;
return 0;
}
-
- {
- unsigned nodeid= getOwnNodeId();
-
- int res= ndb_mgm_alloc_nodeid(m_handle, versionId, &nodeid, nodetype);
- if(res != 0) {
- setError(CR_ERROR, ndb_mgm_get_latest_error_desc(m_handle));
- ndb_mgm_disconnect(m_handle);
- ndb_mgm_destroy_handle(&m_handle);
- m_handle= 0;
- return 0;
- }
-
- _ownNodeId= nodeid;
- }
-
+
return conf;
-#if 0
- bool compatible;
- if (global_ndb_check)
- compatible = ndbCompatible_ndb_mgmt(versionId, version);
- else
- compatible = ndbCompatible_api_mgmt(versionId, version);
-
- if(!compatible){ // if(version != versionId){
- NDB_CLOSE_SOCKET(sockfd);
- snprintf(err_buf, sizeof(err_buf), "Management Server: Invalid version. "
- "Version from server: %d Own version: %d", version, versionId);
- setError(CR_ERROR, err_buf);
- return 0;
- }
-#endif
}
ndb_mgm_configuration *
-ConfigRetriever::getConfig(const char * filename, int versionId){
+ConfigRetriever::getConfig(const char * filename){
struct stat sbuf;
const int res = stat(filename, &sbuf);
@@ -272,60 +217,29 @@ ConfigRetriever::getConfig(const char * filename, int versionId){
void
ConfigRetriever::setError(ErrorType et, const char * s){
- if(errorString != 0){
- free(errorString);
- }
- if(s == 0)
- errorString = 0;
- else
- errorString = strdup(s);
+ errorString.assign(s ? s : "");
latestErrorType = et;
}
const char *
ConfigRetriever::getErrorString(){
- return errorString;
+ return errorString.c_str();
}
void
ConfigRetriever::setLocalConfigFileName(const char * localConfigFileName) {
- if(_localConfigFileName != 0)
- free(_localConfigFileName);
- if(localConfigFileName != 0)
- _localConfigFileName = strdup(localConfigFileName);
- else
- _localConfigFileName = 0;
+ _localConfigFileName.assign(localConfigFileName ? localConfigFileName : "");
}
void
ConfigRetriever::setConnectString(const char * connectString) {
- if(m_connectString != 0)
- free(m_connectString);
- if (connectString != 0) {
- m_connectString = strdup(connectString);
- } else {
- m_connectString = 0;
- }
-}
-
-/**
- * @note Do not use! Use the one above if possible. /elathal
- */
-void
-ConfigRetriever::setDefaultConnectString(const char * defaultConnectString) {
- if(m_defaultConnectString != 0)
- free(m_defaultConnectString);
- if (defaultConnectString != 0) {
- m_defaultConnectString = strdup(defaultConnectString);
- } else {
- m_defaultConnectString = 0;
- }
+ m_connectString.assign(connectString ? connectString : "");
}
bool
-ConfigRetriever::verifyConfig(const struct ndb_mgm_configuration * conf,
- int type){
+ConfigRetriever::verifyConfig(const struct ndb_mgm_configuration * conf){
+
char buf[255];
ndb_mgm_configuration_iterator * it;
it = ndb_mgm_create_configuration_iterator((struct ndb_mgm_configuration *)conf, CFG_SECTION_NODE);
@@ -338,8 +252,8 @@ ConfigRetriever::verifyConfig(const struct ndb_mgm_configuration * conf,
}
NdbAutoPtr<ndb_mgm_configuration_iterator> ptr(it);
- if(ndb_mgm_find(it, CFG_NODE_ID, getOwnNodeId()) != 0){
- snprintf(buf, 255, "Unable to find node with id: %d", getOwnNodeId());
+ if(ndb_mgm_find(it, CFG_NODE_ID, _ownNodeId) != 0){
+ snprintf(buf, 255, "Unable to find node with id: %d", _ownNodeId);
setError(CR_ERROR, buf);
return false;
}
@@ -396,11 +310,27 @@ ConfigRetriever::verifyConfig(const struct ndb_mgm_configuration * conf,
return false;
}
- if(_type != type){
+ if(_type != m_node_type){
snprintf(buf, 255, "Supplied node type(%d) and config node type(%d) "
- " don't match", type, _type);
+ " don't match", m_node_type, _type);
setError(CR_ERROR, buf);
return false;
}
+
return true;
}
+
+Uint32
+ConfigRetriever::allocNodeId(){
+ unsigned nodeid= _ownNodeId;
+
+ if(m_handle != 0){
+ int res= ndb_mgm_alloc_nodeid(m_handle, m_version, &nodeid, m_node_type);
+ if(res != 0) {
+ setError(CR_ERROR, ndb_mgm_get_latest_error_desc(m_handle));
+ return 0;
+ }
+ }
+
+ return _ownNodeId= nodeid;
+}
diff --git a/ndb/src/common/mgmcommon/LocalConfig.cpp b/ndb/src/common/mgmcommon/LocalConfig.cpp
index 9915cbdc642..46afc58b756 100644
--- a/ndb/src/common/mgmcommon/LocalConfig.cpp
+++ b/ndb/src/common/mgmcommon/LocalConfig.cpp
@@ -20,16 +20,13 @@
#include <NdbAutoPtr.hpp>
LocalConfig::LocalConfig(){
- ids = 0; size = 0; items = 0;
error_line = 0; error_msg[0] = 0;
_ownNodeId= 0;
}
bool
-LocalConfig::init(bool onlyNodeId,
- const char *connectString,
- const char *fileName,
- const char *defaultConnectString) {
+LocalConfig::init(const char *connectString,
+ const char *fileName) {
/**
* Escalation:
* 1. Check connectString
@@ -41,8 +38,8 @@ LocalConfig::init(bool onlyNodeId,
*/
//1. Check connectString
- if(connectString != 0) {
- if(readConnectString(connectString, onlyNodeId)){
+ if(connectString != 0 && connectString[0] != 0){
+ if(readConnectString(connectString)){
return true;
}
return false;
@@ -51,7 +48,7 @@ LocalConfig::init(bool onlyNodeId,
//2. Check given filename
if (fileName && strlen(fileName) > 0) {
bool fopenError;
- if(readFile(fileName, fopenError, onlyNodeId)){
+ if(readFile(fileName, fopenError)){
return true;
}
return false;
@@ -61,7 +58,7 @@ LocalConfig::init(bool onlyNodeId,
char buf[255];
if(NdbEnv_GetEnv("NDB_CONNECTSTRING", buf, sizeof(buf)) &&
strlen(buf) != 0){
- if(readConnectString(buf, onlyNodeId)){
+ if(readConnectString(buf)){
return true;
}
return false;
@@ -72,7 +69,7 @@ LocalConfig::init(bool onlyNodeId,
bool fopenError;
char *buf= NdbConfig_NdbCfgName(1 /*true*/);
NdbAutoPtr<char> tmp_aptr(buf);
- if(readFile(buf, fopenError, onlyNodeId))
+ if(readFile(buf, fopenError))
return true;
if (!fopenError)
return false;
@@ -83,24 +80,17 @@ LocalConfig::init(bool onlyNodeId,
bool fopenError;
char *buf= NdbConfig_NdbCfgName(0 /*false*/);
NdbAutoPtr<char> tmp_aptr(buf);
- if(readFile(buf, fopenError, onlyNodeId))
+ if(readFile(buf, fopenError))
return true;
if (!fopenError)
return false;
}
- //6. Check defaultConnectString
- if(defaultConnectString != 0) {
- if(readConnectString(defaultConnectString, onlyNodeId))
- return true;
- return false;
- }
-
//7. Check
{
char buf[256];
snprintf(buf, sizeof(buf), "host=localhost:%u", NDB_BASE_PORT);
- if(readConnectString(buf, onlyNodeId))
+ if(readConnectString(buf))
return true;
}
@@ -110,30 +100,8 @@ LocalConfig::init(bool onlyNodeId,
}
LocalConfig::~LocalConfig(){
- for(int i = 0; i<items; i++){
- if(ids[i]->type == MgmId_TCP)
- free(ids[i]->data.tcp.remoteHost);
- else if(ids[i]->type == MgmId_File)
- free(ids[i]->data.file.filename);
- delete ids[i];
- }
- if(ids != 0)
- delete[] ids;
}
-void LocalConfig::add(MgmtSrvrId * i){
- if(items == size){
- MgmtSrvrId ** tmp = new MgmtSrvrId * [size+10];
- if(ids != 0){
- memcpy(tmp, ids, items*sizeof(MgmtSrvrId *));
- delete []ids;
- }
- ids = tmp;
- }
- ids[items] = i;
- items++;
-}
-
void LocalConfig::setError(int lineNumber, const char * _msg) {
error_line = lineNumber;
strncpy(error_msg, _msg, sizeof(error_msg));
@@ -162,13 +130,13 @@ void LocalConfig::printUsage() const {
<<endl<<endl;
}
-char *nodeIdTokens[] = {
+const char *nodeIdTokens[] = {
"OwnProcessId %i",
"nodeid=%i",
0
};
-char *hostNameTokens[] = {
+const char *hostNameTokens[] = {
"host://%[^:]:%i",
"host=%[^:]:%i",
"%[^:]:%i",
@@ -176,7 +144,7 @@ char *hostNameTokens[] = {
0
};
-char *fileNameTokens[] = {
+const char *fileNameTokens[] = {
"file://%s",
"file=%s",
0
@@ -196,11 +164,11 @@ LocalConfig::parseHostName(const char * buf){
int port;
for(int i = 0; hostNameTokens[i] != 0; i++) {
if (sscanf(buf, hostNameTokens[i], tempString, &port) == 2) {
- MgmtSrvrId* mgmtSrvrId = new MgmtSrvrId();
- mgmtSrvrId->type = MgmId_TCP;
- mgmtSrvrId->data.tcp.remoteHost = strdup(tempString);
- mgmtSrvrId->data.tcp.port = port;
- add(mgmtSrvrId);
+ MgmtSrvrId mgmtSrvrId;
+ mgmtSrvrId.type = MgmId_TCP;
+ mgmtSrvrId.name.assign(tempString);
+ mgmtSrvrId.port = port;
+ ids.push_back(mgmtSrvrId);
return true;
}
}
@@ -212,10 +180,10 @@ LocalConfig::parseFileName(const char * buf){
char tempString[1024];
for(int i = 0; fileNameTokens[i] != 0; i++) {
if (sscanf(buf, fileNameTokens[i], tempString) == 1) {
- MgmtSrvrId* mgmtSrvrId = new MgmtSrvrId();
- mgmtSrvrId->type = MgmId_File;
- mgmtSrvrId->data.file.filename = strdup(tempString);
- add(mgmtSrvrId);
+ MgmtSrvrId mgmtSrvrId;
+ mgmtSrvrId.type = MgmId_File;
+ mgmtSrvrId.name.assign(tempString);
+ ids.push_back(mgmtSrvrId);
return true;
}
}
@@ -223,7 +191,7 @@ LocalConfig::parseFileName(const char * buf){
}
bool
-LocalConfig::parseString(const char * connectString, bool onlyNodeId, char *line){
+LocalConfig::parseString(const char * connectString, char *line){
char * for_strtok;
char * copy = strdup(connectString);
NdbAutoPtr<char> tmp_aptr(copy);
@@ -231,8 +199,7 @@ LocalConfig::parseString(const char * connectString, bool onlyNodeId, char *line
bool b_nodeId = false;
bool found_other = false;
- for (char *tok = strtok_r(copy,";",&for_strtok);
- tok != 0 && !(onlyNodeId && b_nodeId);
+ for (char *tok = strtok_r(copy,";",&for_strtok); tok != 0;
tok = strtok_r(NULL, ";", &for_strtok)) {
if (tok[0] == '#') continue;
@@ -240,8 +207,6 @@ LocalConfig::parseString(const char * connectString, bool onlyNodeId, char *line
if (!b_nodeId) // only one nodeid definition allowed
if (b_nodeId = parseNodeId(tok))
continue;
- if (onlyNodeId)
- continue;
if (found_other = parseHostName(tok))
continue;
if (found_other = parseFileName(tok))
@@ -252,16 +217,17 @@ LocalConfig::parseString(const char * connectString, bool onlyNodeId, char *line
return false;
}
- if (!onlyNodeId && !found_other) {
+ if (!found_other) {
if (line)
- snprintf(line, 150, "Missing host/file name extry in \"%s\"", connectString);
+ snprintf(line, 150, "Missing host/file name extry in \"%s\"",
+ connectString);
return false;
}
return true;
}
-bool LocalConfig::readFile(const char * filename, bool &fopenError, bool onlyNodeId)
+bool LocalConfig::readFile(const char * filename, bool &fopenError)
{
char line[150], line2[150];
@@ -292,7 +258,7 @@ bool LocalConfig::readFile(const char * filename, bool &fopenError, bool onlyNod
strcat(theString, line);
}
- bool return_value = parseString(theString, onlyNodeId, line);
+ bool return_value = parseString(theString, line);
if (!return_value) {
snprintf(line2, 150, "Reading %s: %s", filename, line);
@@ -305,9 +271,9 @@ bool LocalConfig::readFile(const char * filename, bool &fopenError, bool onlyNod
}
bool
-LocalConfig::readConnectString(const char * connectString, bool onlyNodeId){
+LocalConfig::readConnectString(const char * connectString){
char line[150], line2[150];
- bool return_value = parseString(connectString, onlyNodeId, line);
+ bool return_value = parseString(connectString, line);
if (!return_value) {
snprintf(line2, 150, "Reading NDB_CONNECTSTRING \"%s\": %s", connectString, line);
setError(0,line2);
diff --git a/ndb/src/common/mgmcommon/LocalConfig.hpp b/ndb/src/common/mgmcommon/LocalConfig.hpp
deleted file mode 100644
index eb676bf9bed..00000000000
--- a/ndb/src/common/mgmcommon/LocalConfig.hpp
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Copyright (C) 2003 MySQL AB
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
-#ifndef LocalConfig_H
-#define LocalConfig_H
-
-#include <ndb_global.h>
-#include <NdbOut.hpp>
-
-//****************************************************************************
-// Description: The class LocalConfig corresponds to the information possible
-// to give in the local configuration file.
-//*****************************************************************************
-
-enum MgmtSrvrId_Type {
- MgmId_TCP = 0,
- MgmId_File = 1
-};
-
-struct MgmtSrvrId {
- MgmtSrvrId_Type type;
- union {
- struct {
- char * remoteHost;
- unsigned int port;
- } tcp;
- struct {
- char * filename;
- } file;
- } data;
-};
-
-struct LocalConfig {
-
- int _ownNodeId;
-
- int size;
- int items;
- MgmtSrvrId ** ids;
-
- int error_line;
- char error_msg[256];
-
- LocalConfig();
- ~LocalConfig();
- bool init(bool onlyNodeId = false,
- const char *connectString = 0,
- const char *fileName = 0,
- const char *defaultConnectString = 0);
-
- void add(MgmtSrvrId *i);
-
- void printError() const;
- void printUsage() const;
-
- void setError(int lineNumber, const char * _msg);
- bool readConnectString(const char * connectString, bool onlyNodeId = false);
- bool readFile(const char * filename, bool &fopenError, bool onlyNodeId = false);
- bool parseLine(char * line, int lineNumber);
-
- bool parseNodeId(const char *buf);
- bool parseHostName(const char *buf);
- bool parseFileName(const char *buf);
- bool parseString(const char *buf, bool onlyNodeId, char *line);
-};
-
-#endif // LocalConfig_H
-
diff --git a/ndb/src/kernel/main.cpp b/ndb/src/kernel/main.cpp
index f8e852b9d35..858af88d6de 100644
--- a/ndb/src/kernel/main.cpp
+++ b/ndb/src/kernel/main.cpp
@@ -69,9 +69,10 @@ NDB_MAIN(ndb_kernel){
}
{ // Do configuration
- theConfig->setupConfiguration();
+ signal(SIGPIPE, SIG_IGN);
+ theConfig->fetch_configuration();
}
-
+
if (theConfig->getDaemonMode()) {
// Become a daemon
char *lockfile= NdbConfig_PidFileName(globalData.ownId);
@@ -88,8 +89,6 @@ NDB_MAIN(ndb_kernel){
/**
* Parent
*/
- theConfig->closeConfiguration();
-
catchsigs(true);
int status = 0;
@@ -132,11 +131,13 @@ NDB_MAIN(ndb_kernel){
exit(0);
}
g_eventLogger.info("Ndb has terminated (pid %d) restarting", child);
+ theConfig->fetch_configuration();
}
g_eventLogger.info("Angel pid: %d ndb pid: %d", getppid(), getpid());
+ theConfig->setupConfiguration();
systemInfo(* theConfig, * theConfig->m_logLevel);
-
+
// Load blocks
globalEmulatorData.theSimBlockList->load(* theConfig);
diff --git a/ndb/src/kernel/vm/Configuration.cpp b/ndb/src/kernel/vm/Configuration.cpp
index 550c6313058..03e4f07f2ff 100644
--- a/ndb/src/kernel/vm/Configuration.cpp
+++ b/ndb/src/kernel/vm/Configuration.cpp
@@ -35,6 +35,7 @@
#include <ndb_limits.h>
#include "pc.hpp"
#include <LogLevel.hpp>
+#include <NdbSleep.h>
extern "C" {
void ndbSetOwnVersion();
@@ -153,39 +154,82 @@ Configuration::closeConfiguration(){
}
void
-Configuration::setupConfiguration(){
+Configuration::fetch_configuration(){
/**
* Fetch configuration from management server
*/
if (m_config_retriever) {
delete m_config_retriever;
}
- m_config_retriever= new ConfigRetriever();
- ConfigRetriever &cr= *m_config_retriever;
- cr.setConnectString(_connectString);
- stopOnError(true);
- ndb_mgm_configuration * p = cr.getConfig(NDB_VERSION, NODE_TYPE_DB);
+ m_config_retriever= new ConfigRetriever(NDB_VERSION, NODE_TYPE_DB);
+ m_config_retriever->setConnectString(_connectString ? _connectString : "");
+ if(m_config_retriever->init() == -1 ||
+ m_config_retriever->do_connect() == -1){
+
+ const char * s = m_config_retriever->getErrorString();
+ if(s == 0)
+ s = "No error given!";
+
+ /* Set stop on error to true otherwise NDB will
+ go into an restart loop...
+ */
+ ERROR_SET(fatal, ERR_INVALID_CONFIG, "Could connect to ndb_mgmd", s);
+ }
+
+ ConfigRetriever &cr= *m_config_retriever;
+
+ if((globalData.ownId = cr.allocNodeId()) == 0){
+ for(Uint32 i = 0; i<3; i++){
+ NdbSleep_SecSleep(3);
+ if(globalData.ownId = cr.allocNodeId())
+ break;
+ }
+ }
+
+ if(globalData.ownId == 0){
+ ERROR_SET(fatal, ERR_INVALID_CONFIG,
+ "Unable to alloc node id", m_config_retriever->getErrorString());
+ }
+
+ ndb_mgm_configuration * p = cr.getConfig();
if(p == 0){
const char * s = cr.getErrorString();
if(s == 0)
s = "No error given!";
-
+
/* Set stop on error to true otherwise NDB will
go into an restart loop...
- */
-
+ */
+
ERROR_SET(fatal, ERR_INVALID_CONFIG, "Could not fetch configuration"
"/invalid configuration", s);
}
+ if(m_clusterConfig)
+ free(m_clusterConfig);
+
+ m_clusterConfig = p;
+
+ ndb_mgm_configuration_iterator iter(* p, CFG_SECTION_NODE);
+ if (iter.find(CFG_NODE_ID, globalData.ownId)){
+ ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched", "DB missing");
+ }
+
+ if(iter.get(CFG_DB_STOP_ON_ERROR, &_stopOnError)){
+ ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched",
+ "StopOnError missing");
+ }
+}
- Uint32 nodeId = globalData.ownId = cr.getOwnNodeId();
+void
+Configuration::setupConfiguration(){
+ ndb_mgm_configuration * p = m_clusterConfig;
/**
* Configure transporters
*/
{
- int res = IPCConfig::configureTransporters(nodeId,
+ int res = IPCConfig::configureTransporters(globalData.ownId,
* p,
globalTransporterRegistry);
if(res <= 0){
@@ -247,11 +291,6 @@ Configuration::setupConfiguration(){
}
}
- if(iter.get(CFG_DB_STOP_ON_ERROR, &_stopOnError)){
- ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched",
- "StopOnError missing");
- }
-
if(iter.get(CFG_DB_STOP_ON_ERROR_INSERT, &m_restartOnErrorInsert)){
ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched",
"RestartOnErrorInsert missing");
@@ -268,7 +307,6 @@ Configuration::setupConfiguration(){
ConfigValues* cf = ConfigValuesFactory::extractCurrentSection(iter.m_config);
- m_clusterConfig = p;
m_clusterConfigIter = ndb_mgm_create_configuration_iterator
(p, CFG_SECTION_NODE);
diff --git a/ndb/src/kernel/vm/Configuration.hpp b/ndb/src/kernel/vm/Configuration.hpp
index ec5e8b371b1..bd91f3fa74b 100644
--- a/ndb/src/kernel/vm/Configuration.hpp
+++ b/ndb/src/kernel/vm/Configuration.hpp
@@ -32,6 +32,7 @@ public:
*/
bool init(int argc, const char** argv);
+ void fetch_configuration();
void setupConfiguration();
void closeConfiguration();
diff --git a/ndb/src/mgmapi/mgmapi.cpp b/ndb/src/mgmapi/mgmapi.cpp
index 1085c747c16..e78b0d41cf2 100644
--- a/ndb/src/mgmapi/mgmapi.cpp
+++ b/ndb/src/mgmapi/mgmapi.cpp
@@ -1438,11 +1438,7 @@ ndb_mgm_get_configuration(NdbMgmHandle handle, unsigned int version) {
const Properties *prop;
prop = ndb_mgm_call(handle, reply, "get config", &args);
-
- if(prop == NULL) {
- SET_ERROR(handle, EIO, "Unable to fetch config");
- return 0;
- }
+ CHECK_REPLY(prop, 0);
do {
const char * buf;
@@ -1537,17 +1533,14 @@ ndb_mgm_alloc_nodeid(NdbMgmHandle handle, unsigned int version, unsigned *pnodei
const Properties *prop;
prop= ndb_mgm_call(handle, reply, "get nodeid", &args);
-
- if(prop == NULL) {
- SET_ERROR(handle, EIO, "Unable to alloc nodeid");
- return -1;
- }
+ CHECK_REPLY(prop, -1);
int res= -1;
do {
const char * buf;
if(!prop->get("result", &buf) || strcmp(buf, "Ok") != 0){
- ndbout_c("ERROR Message: %s\n", buf);
+ setError(handle, NDB_MGM_COULD_NOT_CONNECT_TO_SOCKET, __LINE__,
+ "Could not alloc node id: %s",buf);
break;
}
if(!prop->get("nodeid", pnodeid) != 0){
@@ -1621,11 +1614,7 @@ ndb_mgm_set_int_parameter(NdbMgmHandle handle,
const Properties *prop;
prop= ndb_mgm_call(handle, reply, "set parameter", &args);
-
- if(prop == NULL) {
- SET_ERROR(handle, EIO, "Unable set parameter");
- return -1;
- }
+ CHECK_REPLY(prop, -1);
int res= -1;
do {
diff --git a/ndb/src/mgmclient/main.cpp b/ndb/src/mgmclient/main.cpp
index 5aefd4609b1..e70b454a01f 100644
--- a/ndb/src/mgmclient/main.cpp
+++ b/ndb/src/mgmclient/main.cpp
@@ -47,10 +47,6 @@ handler(int sig){
int main(int argc, const char** argv){
int optind = 0;
- char _default_connectstring_buf[256];
- snprintf(_default_connectstring_buf, sizeof(_default_connectstring_buf),
- "host=localhost:%u", NDB_BASE_PORT);
- const char *_default_connectstring= _default_connectstring_buf;
const char *_host = 0;
int _port = 0;
int _help = 0;
@@ -79,9 +75,9 @@ int main(int argc, const char** argv){
_port = atoi(argv[1]);
}
} else {
- if(cfg.init(false, 0, 0, _default_connectstring) && cfg.items > 0 && cfg.ids[0]->type == MgmId_TCP){
- _host = cfg.ids[0]->data.tcp.remoteHost;
- _port = cfg.ids[0]->data.tcp.port;
+ if(cfg.init(0, 0) && cfg.ids.size() > 0 && cfg.ids[0].type == MgmId_TCP){
+ _host = cfg.ids[0].name.c_str();
+ _port = cfg.ids[0].port;
} else {
cfg.printError();
cfg.printUsage();
diff --git a/ndb/src/mgmsrv/MgmtSrvr.cpp b/ndb/src/mgmsrv/MgmtSrvr.cpp
index 523883f7832..55384a2f91e 100644
--- a/ndb/src/mgmsrv/MgmtSrvr.cpp
+++ b/ndb/src/mgmsrv/MgmtSrvr.cpp
@@ -584,18 +584,11 @@ MgmtSrvr::MgmtSrvr(NodeId nodeId,
_ownNodeId= 0;
NodeId tmp= nodeId;
- if (getFreeNodeId(&tmp, NDB_MGM_NODE_TYPE_MGM, 0, 0)){
- _ownNodeId= tmp;
- if (nodeId != 0 && nodeId != tmp) {
- ndbout << "Unable to obtain requested nodeid " << nodeId
- << " nodeid " << tmp << " available\n";
- _ownNodeId= 0; // did not get nodeid requested
- }
- m_allocated_resources.reserve_node(_ownNodeId);
- } else {
- ndbout_c("Unable to retrieve own node id");
+ if (!alloc_node_id(&tmp, NDB_MGM_NODE_TYPE_MGM, 0, 0)){
+ ndbout << "Unable to obtain requested nodeid " << nodeId;
exit(-1);
}
+ _ownNodeId = tmp;
}
@@ -2301,10 +2294,19 @@ MgmtSrvr::getNodeType(NodeId nodeId) const
return nodeTypes[nodeId];
}
+#ifdef NDB_WIN32
+static NdbMutex & f_node_id_mutex = * NdbMutex_Create();
+#else
+static NdbMutex f_node_id_mutex = NDB_MUTEX_INITIALIZER;
+#endif
+
bool
-MgmtSrvr::getFreeNodeId(NodeId * nodeId, enum ndb_mgm_node_type type,
- struct sockaddr *client_addr, socklen_t *client_addr_len) const
+MgmtSrvr::alloc_node_id(NodeId * nodeId,
+ enum ndb_mgm_node_type type,
+ struct sockaddr *client_addr,
+ socklen_t *client_addr_len)
{
+ Guard g(&f_node_id_mutex);
#if 0
ndbout << "MgmtSrvr::getFreeNodeId type=" << type
<< " *nodeid=" << *nodeId << endl;
@@ -2365,6 +2367,7 @@ MgmtSrvr::getFreeNodeId(NodeId * nodeId, enum ndb_mgm_node_type type,
}
}
*nodeId= tmp;
+ m_reserved_nodes.set(tmp);
#if 0
ndbout << "MgmtSrvr::getFreeNodeId found type=" << type
<< " *nodeid=" << *nodeId << endl;
@@ -2769,6 +2772,7 @@ MgmtSrvr::Allocated_resources::Allocated_resources(MgmtSrvr &m)
MgmtSrvr::Allocated_resources::~Allocated_resources()
{
+ Guard g(&f_node_id_mutex);
m_mgmsrv.m_reserved_nodes.bitANDC(m_reserved_nodes);
}
@@ -2776,7 +2780,6 @@ void
MgmtSrvr::Allocated_resources::reserve_node(NodeId id)
{
m_reserved_nodes.set(id);
- m_mgmsrv.m_reserved_nodes.set(id);
}
int
diff --git a/ndb/src/mgmsrv/MgmtSrvr.hpp b/ndb/src/mgmsrv/MgmtSrvr.hpp
index f677cdbb2d0..661dcdfb784 100644
--- a/ndb/src/mgmsrv/MgmtSrvr.hpp
+++ b/ndb/src/mgmsrv/MgmtSrvr.hpp
@@ -78,6 +78,7 @@ public:
// methods to reserve/allocate resources which
// will be freed when running destructor
void reserve_node(NodeId id);
+ bool is_reserved(NodeId nodeId) { return m_reserved_nodes.get(nodeId);}
private:
MgmtSrvr &m_mgmsrv;
NodeBitmask m_reserved_nodes;
@@ -465,8 +466,8 @@ public:
* @return false if none found
*/
bool getNextNodeId(NodeId * _nodeId, enum ndb_mgm_node_type type) const ;
- bool getFreeNodeId(NodeId * _nodeId, enum ndb_mgm_node_type type,
- struct sockaddr *client_addr, socklen_t *client_addr_len) const ;
+ bool alloc_node_id(NodeId * _nodeId, enum ndb_mgm_node_type type,
+ struct sockaddr *client_addr, socklen_t *client_addr_len);
/**
*
diff --git a/ndb/src/mgmsrv/MgmtSrvrConfig.cpp b/ndb/src/mgmsrv/MgmtSrvrConfig.cpp
index 10316bd2851..44c2aadd1e2 100644
--- a/ndb/src/mgmsrv/MgmtSrvrConfig.cpp
+++ b/ndb/src/mgmsrv/MgmtSrvrConfig.cpp
@@ -288,16 +288,15 @@ MgmtSrvr::readConfig() {
Config *
MgmtSrvr::fetchConfig() {
- ConfigRetriever cr;
+ ConfigRetriever cr(NDB_VERSION, NODE_TYPE_MGM);
cr.setLocalConfigFileName(m_localNdbConfigFilename.c_str());
- struct ndb_mgm_configuration * tmp = cr.getConfig(NDB_VERSION,
- NODE_TYPE_MGM);
+ struct ndb_mgm_configuration * tmp = cr.getConfig();
if(tmp != 0){
Config * conf = new Config();
conf->m_configValues = tmp;
return conf;
}
-
+
return 0;
}
diff --git a/ndb/src/mgmsrv/Services.cpp b/ndb/src/mgmsrv/Services.cpp
index 99913face05..ec734fe24c5 100644
--- a/ndb/src/mgmsrv/Services.cpp
+++ b/ndb/src/mgmsrv/Services.cpp
@@ -401,34 +401,26 @@ MgmApiSession::get_nodeid(Parser_t::Context &,
struct sockaddr addr;
socklen_t addrlen= sizeof(addr);
- int r;
- if (r= getpeername(m_socket, &addr, &addrlen)) {
+ int r = getpeername(m_socket, &addr, &addrlen);
+ if (r != 0 ) {
m_output->println(cmd);
m_output->println("result: getpeername(%d) failed, err= %d", m_socket, r);
m_output->println("");
return;
}
- NodeId free_id= 0;
NodeId tmp= nodeid;
- if (m_mgmsrv.getFreeNodeId(&tmp, (enum ndb_mgm_node_type)nodetype, &addr, &addrlen))
- free_id= tmp;
-
- if (nodeid != 0 && free_id != nodeid){
- m_output->println(cmd);
- m_output->println("result: no free nodeid %d for nodetype %d",
- nodeid, nodetype);
- m_output->println("");
- return;
- }
+ if(tmp == 0 || !m_allocated_resources->is_reserved(tmp)){
+ if (!m_mgmsrv.alloc_node_id(&tmp, (enum ndb_mgm_node_type)nodetype,
+ &addr, &addrlen)){
+ m_output->println(cmd);
+ m_output->println("result: no free nodeid %d for nodetype %d",
+ nodeid, nodetype);
+ m_output->println("");
+ return;
+ }
+ }
- if (free_id == 0){
- m_output->println(cmd);
- m_output->println("result: no free nodeid for nodetype %d", nodetype);
- m_output->println("");
- return;
- }
-
#if 0
if (!compatible){
m_output->println(cmd);
@@ -438,14 +430,13 @@ MgmApiSession::get_nodeid(Parser_t::Context &,
return;
}
#endif
-
+
m_output->println(cmd);
- m_output->println("nodeid: %u", free_id);
+ m_output->println("nodeid: %u", tmp);
m_output->println("result: Ok");
m_output->println("");
-
- m_allocated_resources->reserve_node(free_id);
-
+ m_allocated_resources->reserve_node(tmp);
+
return;
}
diff --git a/ndb/src/mgmsrv/main.cpp b/ndb/src/mgmsrv/main.cpp
index 0bbf042fbd6..9e39452891f 100644
--- a/ndb/src/mgmsrv/main.cpp
+++ b/ndb/src/mgmsrv/main.cpp
@@ -16,8 +16,6 @@
#include <ndb_global.h>
-#include <signal.h>
-
#include "MgmtSrvr.hpp"
#include "EventLogger.hpp"
#include <Config.hpp>
@@ -229,6 +227,7 @@ NDB_MAIN(mgmsrv){
}
}
+ signal(SIGPIPE, SIG_IGN);
if(!glob.mgmObject->start()){
ndbout_c("Unable to start management server.");
ndbout_c("Probably caused by illegal initial configuration file.");
@@ -312,14 +311,13 @@ MgmGlobals::~MgmGlobals(){
static bool
readLocalConfig(){
// Read local config file
- ConfigRetriever cr;
- cr.setLocalConfigFileName(glob.local_config_filename);
- int nodeid = cr.init(true);
+ LocalConfig lc;
+ int nodeid = lc.init(glob.local_config_filename);
if(nodeid == -1){
return false;
}
- glob.localNodeId = (NodeId)nodeid;
+ glob.localNodeId = nodeid;
return true;
}
@@ -342,18 +340,7 @@ readGlobalConfig() {
InitConfigFileParser parser;
glob.cluster_config = parser.parseConfig(glob.config_filename);
if(glob.cluster_config == 0){
- /**
- * Try to get configuration from other MGM server
- * Note: Only new format
- */
- glob.cluster_config = new Config();
-
- ConfigRetriever cr;
- cr.setLocalConfigFileName(glob.local_config_filename);
- glob.cluster_config->m_configValues = cr.getConfig(NDB_VERSION,
- NODE_TYPE_MGM);
- if (glob.cluster_config->m_configValues == NULL)
- return false;
+ return false;
}
return true;
}
diff --git a/ndb/src/ndbapi/TransporterFacade.cpp b/ndb/src/ndbapi/TransporterFacade.cpp
index 6a25db560c9..d1e57e874ee 100644
--- a/ndb/src/ndbapi/TransporterFacade.cpp
+++ b/ndb/src/ndbapi/TransporterFacade.cpp
@@ -343,27 +343,39 @@ TransporterFacade*
TransporterFacade::start_instance(const char * connectString){
// TransporterFacade used from API get config from mgmt srvr
- s_config_retriever= new ConfigRetriever;
-
- ConfigRetriever &configRetriever= *s_config_retriever;
- configRetriever.setConnectString(connectString);
- ndb_mgm_configuration * props = configRetriever.getConfig(NDB_VERSION,
- NODE_TYPE_API);
- if (props == 0) {
- ndbout << "Configuration error: ";
- const char* erString = configRetriever.getErrorString();
- if (erString == 0) {
- erString = "No error specified!";
- }
- ndbout << erString << endl;
- return 0;
- }
- const int nodeId = configRetriever.getOwnNodeId();
-
- TransporterFacade * tf = start_instance(nodeId, props);
+ s_config_retriever= new ConfigRetriever(NDB_VERSION, NODE_TYPE_API);
+
+ s_config_retriever->setConnectString(connectString);
+ const char* error = 0;
+ do {
+ if(s_config_retriever->init() == -1)
+ break;
+
+ if(s_config_retriever->do_connect() == -1)
+ break;
+
+ const Uint32 nodeId = s_config_retriever->allocNodeId();
+ if(nodeId == 0)
+ break;
+
+
+ ndb_mgm_configuration * props = s_config_retriever->getConfig();
+ if(props == 0)
+ break;
+
+ TransporterFacade * tf = start_instance(nodeId, props);
+
+ free(props);
+ return tf;
+ } while(0);
- free(props);
- return tf;
+ ndbout << "Configuration error: ";
+ const char* erString = s_config_retriever->getErrorString();
+ if (erString == 0) {
+ erString = "No error specified!";
+ }
+ ndbout << erString << endl;
+ return 0;
}
TransporterFacade*