ndb -

 add support for reading config.ini from ndb_config
 (as alternative to contacting ndb_mgmd)
parent f5761aa4
...@@ -3,3 +3,4 @@ ndbd,1,localhost ndbd,2,localhost ndb_mgmd,3, mysqld,4, mysqld,5, mysqld,6, mysq ...@@ -3,3 +3,4 @@ ndbd,1,localhost ndbd,2,localhost ndb_mgmd,3, mysqld,4, mysqld,5, mysqld,6, mysq
1 localhost 41943040 12582912 1 localhost 41943040 12582912
2 localhost 41943040 12582912 2 localhost 41943040 12582912
1 2 1 2
ndbd,1,localhost ndbd,2,localhost ndb_mgmd,3, mysqld,4, mysqld,5, mysqld,6, mysqld,7,
...@@ -5,5 +5,6 @@ ...@@ -5,5 +5,6 @@
--exec $NDB_TOOLS_DIR/ndb_config --no-defaults --query=nodeid,host,DataMemory,IndexMemory --type=ndbd 2> /dev/null --exec $NDB_TOOLS_DIR/ndb_config --no-defaults --query=nodeid,host,DataMemory,IndexMemory --type=ndbd 2> /dev/null
--exec $NDB_TOOLS_DIR/ndb_config --no-defaults -r \\n -f " " --query=nodeid,host,DataMemory,IndexMemory --type=ndbd 2> /dev/null --exec $NDB_TOOLS_DIR/ndb_config --no-defaults -r \\n -f " " --query=nodeid,host,DataMemory,IndexMemory --type=ndbd 2> /dev/null
--exec $NDB_TOOLS_DIR/ndb_config --no-defaults --query=nodeid --type=ndbd --host=localhost 2> /dev/null --exec $NDB_TOOLS_DIR/ndb_config --no-defaults --query=nodeid --type=ndbd --host=localhost 2> /dev/null
--exec $NDB_TOOLS_DIR/ndb_config --no-defaults --query=type,nodeid,host --config-file=$NDB_BACKUP_DIR/config.ini 2> /dev/null
# End of 4.1 tests # End of 4.1 tests
...@@ -31,8 +31,10 @@ static void require(bool v) { if(!v) abort();} ...@@ -31,8 +31,10 @@ static void require(bool v) { if(!v) abort();}
//**************************************************************************** //****************************************************************************
// Ctor / Dtor // Ctor / Dtor
//**************************************************************************** //****************************************************************************
InitConfigFileParser::InitConfigFileParser(){ InitConfigFileParser::InitConfigFileParser(FILE * out)
{
m_info = new ConfigInfo(); m_info = new ConfigInfo();
m_errstream = out ? out : stdout;
} }
InitConfigFileParser::~InitConfigFileParser() { InitConfigFileParser::~InitConfigFileParser() {
...@@ -42,11 +44,12 @@ InitConfigFileParser::~InitConfigFileParser() { ...@@ -42,11 +44,12 @@ InitConfigFileParser::~InitConfigFileParser() {
//**************************************************************************** //****************************************************************************
// Read Config File // Read Config File
//**************************************************************************** //****************************************************************************
InitConfigFileParser::Context::Context(const ConfigInfo * info) InitConfigFileParser::Context::Context(const ConfigInfo * info, FILE * out)
: m_userProperties(true), m_configValues(1000, 20) { : m_userProperties(true), m_configValues(1000, 20) {
m_config = new Properties(true); m_config = new Properties(true);
m_defaults = new Properties(true); m_defaults = new Properties(true);
m_errstream = out;
} }
InitConfigFileParser::Context::~Context(){ InitConfigFileParser::Context::~Context(){
...@@ -61,7 +64,7 @@ Config * ...@@ -61,7 +64,7 @@ Config *
InitConfigFileParser::parseConfig(const char * filename) { InitConfigFileParser::parseConfig(const char * filename) {
FILE * file = fopen(filename, "r"); FILE * file = fopen(filename, "r");
if(file == 0){ if(file == 0){
ndbout << "Error opening file: " << filename << endl; fprintf(m_errstream, "Error opening file: %s\n", filename);
return 0; return 0;
} }
...@@ -75,7 +78,7 @@ InitConfigFileParser::parseConfig(FILE * file) { ...@@ -75,7 +78,7 @@ InitConfigFileParser::parseConfig(FILE * file) {
char line[MAX_LINE_LENGTH]; char line[MAX_LINE_LENGTH];
Context ctx(m_info); Context ctx(m_info, m_errstream);
ctx.m_lineno = 0; ctx.m_lineno = 0;
ctx.m_currentSection = 0; ctx.m_currentSection = 0;
...@@ -571,8 +574,9 @@ InitConfigFileParser::Context::reportError(const char * fmt, ...){ ...@@ -571,8 +574,9 @@ InitConfigFileParser::Context::reportError(const char * fmt, ...){
va_start(ap, fmt); va_start(ap, fmt);
if (fmt != 0) if (fmt != 0)
BaseString::vsnprintf(buf, sizeof(buf)-1, fmt, ap); BaseString::vsnprintf(buf, sizeof(buf)-1, fmt, ap);
ndbout << "Error line " << m_lineno << ": " << buf << endl;
va_end(ap); va_end(ap);
fprintf(m_errstream, "Error line %d: %s\n",
m_lineno, buf);
//m_currentSection->print(); //m_currentSection->print();
} }
...@@ -585,6 +589,7 @@ InitConfigFileParser::Context::reportWarning(const char * fmt, ...){ ...@@ -585,6 +589,7 @@ InitConfigFileParser::Context::reportWarning(const char * fmt, ...){
va_start(ap, fmt); va_start(ap, fmt);
if (fmt != 0) if (fmt != 0)
BaseString::vsnprintf(buf, sizeof(buf)-1, fmt, ap); BaseString::vsnprintf(buf, sizeof(buf)-1, fmt, ap);
ndbout << "Warning line " << m_lineno << ": " << buf << endl;
va_end(ap); va_end(ap);
fprintf(m_errstream, "Warning line %d: %s\n",
m_lineno, buf);
} }
...@@ -34,11 +34,12 @@ class ConfigInfo; ...@@ -34,11 +34,12 @@ class ConfigInfo;
* object if the config file has correct syntax and semantic. * object if the config file has correct syntax and semantic.
*/ */
class InitConfigFileParser { class InitConfigFileParser {
FILE * m_errstream;
public: public:
/** /**
* Constructor * Constructor
*/ */
InitConfigFileParser(); InitConfigFileParser(FILE * errstream = stdout);
~InitConfigFileParser(); ~InitConfigFileParser();
/** /**
...@@ -60,7 +61,7 @@ public: ...@@ -60,7 +61,7 @@ public:
* Context = Which section in init config file we are currently parsing * Context = Which section in init config file we are currently parsing
*/ */
struct Context { struct Context {
Context(const ConfigInfo *); Context(const ConfigInfo *, FILE * out);
~Context(); ~Context();
ContextSectionType type; ///< Section type (e.g. default section,section) ContextSectionType type; ///< Section type (e.g. default section,section)
...@@ -82,6 +83,7 @@ public: ...@@ -82,6 +83,7 @@ public:
ConfigValuesFactory m_configValues; // ConfigValuesFactory m_configValues; //
public: public:
FILE * m_errstream;
void reportError(const char * msg, ...); void reportError(const char * msg, ...);
void reportWarning(const char * msg, ...); void reportWarning(const char * msg, ...);
}; };
......
...@@ -40,6 +40,7 @@ static const char * g_type = 0; ...@@ -40,6 +40,7 @@ static const char * g_type = 0;
static const char * g_host = 0; static const char * g_host = 0;
static const char * g_field_delimiter=","; static const char * g_field_delimiter=",";
static const char * g_row_delimiter=" "; static const char * g_row_delimiter=" ";
static const char * g_config_file = 0;
int g_print_full_config, opt_ndb_shm; int g_print_full_config, opt_ndb_shm;
my_bool opt_core; my_bool opt_core;
...@@ -90,6 +91,9 @@ static struct my_option my_long_options[] = ...@@ -90,6 +91,9 @@ static struct my_option my_long_options[] =
{ "rows", 'r', "Row separator", { "rows", 'r', "Row separator",
(gptr*) &g_row_delimiter, (gptr*) &g_row_delimiter, (gptr*) &g_row_delimiter, (gptr*) &g_row_delimiter,
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{ "config-file", 256, "Path to config.ini",
(gptr*) &g_config_file, (gptr*) &g_config_file,
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
}; };
...@@ -124,7 +128,7 @@ struct Match ...@@ -124,7 +128,7 @@ struct Match
{ {
int m_key; int m_key;
BaseString m_value; BaseString m_value;
virtual int eval(NdbMgmHandle, const Iter&); virtual int eval(const Iter&);
}; };
struct Apply struct Apply
...@@ -132,18 +136,21 @@ struct Apply ...@@ -132,18 +136,21 @@ struct Apply
Apply() {} Apply() {}
Apply(int val) { m_key = val;} Apply(int val) { m_key = val;}
int m_key; int m_key;
virtual int apply(NdbMgmHandle, const Iter&); virtual int apply(const Iter&);
}; };
struct NodeTypeApply : public Apply struct NodeTypeApply : public Apply
{ {
virtual int apply(NdbMgmHandle, const Iter&); virtual int apply(const Iter&);
}; };
static int parse_query(Vector<Apply*>&, int &argc, char**& argv); static int parse_query(Vector<Apply*>&, int &argc, char**& argv);
static int parse_where(Vector<Match*>&, int &argc, char**& argv); static int parse_where(Vector<Match*>&, int &argc, char**& argv);
static int eval(NdbMgmHandle, const Iter&, const Vector<Match*>&); static int eval(const Iter&, const Vector<Match*>&);
static int apply(NdbMgmHandle, const Iter&, const Vector<Apply*>&); static int apply(const Iter&, const Vector<Apply*>&);
static ndb_mgm_configuration* fetch_configuration();
static ndb_mgm_configuration* load_configuration();
int int
main(int argc, char** argv){ main(int argc, char** argv){
NDB_INIT(argv[0]); NDB_INIT(argv[0]);
...@@ -154,52 +161,12 @@ main(int argc, char** argv){ ...@@ -154,52 +161,12 @@ main(int argc, char** argv){
ndb_std_get_one_option))) ndb_std_get_one_option)))
return -1; return -1;
NdbMgmHandle mgm = ndb_mgm_create_handle(); ndb_mgm_configuration * conf = 0;
if(mgm == NULL) {
fprintf(stderr, "Cannot create handle to management server.\n");
exit(-1);
}
ndb_mgm_set_error_stream(mgm, stderr); if (g_config_file)
conf = load_configuration();
if (ndb_mgm_set_connectstring(mgm, g_connectstring)) else
{ conf = fetch_configuration();
fprintf(stderr, "* %5d: %s\n",
ndb_mgm_get_latest_error(mgm),
ndb_mgm_get_latest_error_msg(mgm));
fprintf(stderr,
"* %s", ndb_mgm_get_latest_error_desc(mgm));
exit(-1);
}
if(ndb_mgm_connect(mgm, try_reconnect-1, 5, 1))
{
fprintf(stderr, "Connect failed");
fprintf(stderr, " code: %d, msg: %s\n",
ndb_mgm_get_latest_error(mgm),
ndb_mgm_get_latest_error_msg(mgm));
exit(-1);
}
else if(g_verbose)
{
fprintf(stderr, "Connected to %s:%d\n",
ndb_mgm_get_connected_host(mgm),
ndb_mgm_get_connected_port(mgm));
}
ndb_mgm_configuration * conf = ndb_mgm_get_configuration(mgm, 0);
if(conf == 0)
{
fprintf(stderr, "Could not get configuration");
fprintf(stderr, "code: %d, msg: %s\n",
ndb_mgm_get_latest_error(mgm),
ndb_mgm_get_latest_error_msg(mgm));
exit(-1);
}
else if(g_verbose)
{
fprintf(stderr, "Fetched configuration\n");
}
Vector<Apply*> select_list; Vector<Apply*> select_list;
Vector<Match*> where_clause; Vector<Match*> where_clause;
...@@ -224,12 +191,12 @@ main(int argc, char** argv){ ...@@ -224,12 +191,12 @@ main(int argc, char** argv){
iter.first(); iter.first();
for(iter.first(); iter.valid(); iter.next()) for(iter.first(); iter.valid(); iter.next())
{ {
if(eval(mgm, iter, where_clause)) if(eval(iter, where_clause))
{ {
if(prev) if(prev)
printf("%s", g_row_delimiter); printf("%s", g_row_delimiter);
prev= true; prev= true;
apply(mgm, iter, select_list); apply(iter, select_list);
} }
} }
printf("\n"); printf("\n");
...@@ -323,11 +290,11 @@ template class Vector<Match*>; ...@@ -323,11 +290,11 @@ template class Vector<Match*>;
static static
int int
eval(NdbMgmHandle mgm, const Iter& iter, const Vector<Match*>& where) eval(const Iter& iter, const Vector<Match*>& where)
{ {
for(unsigned i = 0; i<where.size(); i++) for(unsigned i = 0; i<where.size(); i++)
{ {
if(where[i]->eval(mgm, iter) == 0) if(where[i]->eval(iter) == 0)
return 0; return 0;
} }
...@@ -336,11 +303,11 @@ eval(NdbMgmHandle mgm, const Iter& iter, const Vector<Match*>& where) ...@@ -336,11 +303,11 @@ eval(NdbMgmHandle mgm, const Iter& iter, const Vector<Match*>& where)
static static
int int
apply(NdbMgmHandle mgm, const Iter& iter, const Vector<Apply*>& list) apply(const Iter& iter, const Vector<Apply*>& list)
{ {
for(unsigned i = 0; i<list.size(); i++) for(unsigned i = 0; i<list.size(); i++)
{ {
list[i]->apply(mgm, iter); list[i]->apply(iter);
if(i + 1 != list.size()) if(i + 1 != list.size())
printf("%s", g_field_delimiter); printf("%s", g_field_delimiter);
} }
...@@ -348,19 +315,19 @@ apply(NdbMgmHandle mgm, const Iter& iter, const Vector<Apply*>& list) ...@@ -348,19 +315,19 @@ apply(NdbMgmHandle mgm, const Iter& iter, const Vector<Apply*>& list)
} }
int int
Match::eval(NdbMgmHandle h, const Iter& iter) Match::eval(const Iter& iter)
{ {
Uint32 val32; Uint32 val32;
Uint64 val64; Uint64 val64;
const char* valc; const char* valc;
if (iter.get(m_key, &val32) == 0) if (iter.get(m_key, &val32) == 0)
{ {
if(atoi(m_value.c_str()) != val32) if(atoi(m_value.c_str()) != (int)val32)
return 0; return 0;
} }
else if(iter.get(m_key, &val64) == 0) else if(iter.get(m_key, &val64) == 0)
{ {
if(strtoll(m_value.c_str(), (char **)NULL, 10) != val64) if(strtoll(m_value.c_str(), (char **)NULL, 10) != (long long)val64)
return 0; return 0;
} }
else if(iter.get(m_key, &valc) == 0) else if(iter.get(m_key, &valc) == 0)
...@@ -376,7 +343,7 @@ Match::eval(NdbMgmHandle h, const Iter& iter) ...@@ -376,7 +343,7 @@ Match::eval(NdbMgmHandle h, const Iter& iter)
} }
int int
Apply::apply(NdbMgmHandle h, const Iter& iter) Apply::apply(const Iter& iter)
{ {
Uint32 val32; Uint32 val32;
Uint64 val64; Uint64 val64;
...@@ -397,7 +364,7 @@ Apply::apply(NdbMgmHandle h, const Iter& iter) ...@@ -397,7 +364,7 @@ Apply::apply(NdbMgmHandle h, const Iter& iter)
} }
int int
NodeTypeApply::apply(NdbMgmHandle h, const Iter& iter) NodeTypeApply::apply(const Iter& iter)
{ {
Uint32 val32; Uint32 val32;
if (iter.get(CFG_TYPE_OF_SECTION, &val32) == 0) if (iter.get(CFG_TYPE_OF_SECTION, &val32) == 0)
...@@ -406,3 +373,76 @@ NodeTypeApply::apply(NdbMgmHandle h, const Iter& iter) ...@@ -406,3 +373,76 @@ NodeTypeApply::apply(NdbMgmHandle h, const Iter& iter)
} }
return 0; return 0;
} }
ndb_mgm_configuration*
fetch_configuration()
{
ndb_mgm_configuration* conf = 0;
NdbMgmHandle mgm = ndb_mgm_create_handle();
if(mgm == NULL) {
fprintf(stderr, "Cannot create handle to management server.\n");
return 0;
}
ndb_mgm_set_error_stream(mgm, stderr);
if (ndb_mgm_set_connectstring(mgm, g_connectstring))
{
fprintf(stderr, "* %5d: %s\n",
ndb_mgm_get_latest_error(mgm),
ndb_mgm_get_latest_error_msg(mgm));
fprintf(stderr,
"* %s", ndb_mgm_get_latest_error_desc(mgm));
goto noconnect;
}
if(ndb_mgm_connect(mgm, try_reconnect-1, 5, 1))
{
fprintf(stderr, "Connect failed");
fprintf(stderr, " code: %d, msg: %s\n",
ndb_mgm_get_latest_error(mgm),
ndb_mgm_get_latest_error_msg(mgm));
goto noconnect;
}
else if(g_verbose)
{
fprintf(stderr, "Connected to %s:%d\n",
ndb_mgm_get_connected_host(mgm),
ndb_mgm_get_connected_port(mgm));
}
conf = ndb_mgm_get_configuration(mgm, 0);
if(conf == 0)
{
fprintf(stderr, "Could not get configuration");
fprintf(stderr, "code: %d, msg: %s\n",
ndb_mgm_get_latest_error(mgm),
ndb_mgm_get_latest_error_msg(mgm));
}
else if(g_verbose)
{
fprintf(stderr, "Fetched configuration\n");
}
ndb_mgm_disconnect(mgm);
noconnect:
ndb_mgm_destroy_handle(&mgm);
return conf;
}
#include <Config.hpp>
ndb_mgm_configuration*
load_configuration()
{
InitConfigFileParser parser(stderr);
if (g_verbose)
fprintf(stderr, "Using config.ini : %s", g_config_file);
Config* conf = parser.parseConfig(g_config_file);
if (conf)
return conf->m_configValues;
return 0;
}
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