summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <stewart@mysql.com>2005-11-24 17:30:25 +1100
committerunknown <stewart@mysql.com>2005-11-24 17:30:25 +1100
commitc2421d3f0dffe87a272483712a4c6a455b1b3ecd (patch)
treefcc35c9d36dbf0510a05be278c8805b07169d0f3
parent57ad6b20ed8b22b010af1c354b23591570f12b09 (diff)
downloadmariadb-git-c2421d3f0dffe87a272483712a4c6a455b1b3ecd.tar.gz
BUG#15215 mysqld fails at start-up because of illegal reply from mgmd
In the rare circumstance where a mysqld connects to a mgm server, then the mgm server goes away before a node id can be allocated, it was possible to get an Error in mgm protocol parser error message. ndb/src/common/mgmcommon/ConfigRetriever.cpp: When allocating node id, retry connecting to a management server if it goes away. ndb/src/mgmapi/mgmapi.cpp: Treat Eof and NoLine results from the parser as a sign that we should disconnect from this management server. It's up to the caller to work out if they want to try again.
-rw-r--r--ndb/src/common/mgmcommon/ConfigRetriever.cpp6
-rw-r--r--ndb/src/mgmapi/mgmapi.cpp8
2 files changed, 13 insertions, 1 deletions
diff --git a/ndb/src/common/mgmcommon/ConfigRetriever.cpp b/ndb/src/common/mgmcommon/ConfigRetriever.cpp
index b3d0221fedb..278bf2b8ec7 100644
--- a/ndb/src/common/mgmcommon/ConfigRetriever.cpp
+++ b/ndb/src/common/mgmcommon/ConfigRetriever.cpp
@@ -341,9 +341,15 @@ ConfigRetriever::allocNodeId(int no_retries, int retry_delay_in_seconds)
{
while (1)
{
+ if(!ndb_mgm_is_connected(m_handle))
+ if(!ndb_mgm_connect(m_handle, 0, 0, 0))
+ goto next;
+
int res= ndb_mgm_alloc_nodeid(m_handle, m_version, m_node_type);
if(res >= 0)
return _ownNodeId= (Uint32)res;
+
+ next:
if (no_retries == 0)
break;
no_retries--;
diff --git a/ndb/src/mgmapi/mgmapi.cpp b/ndb/src/mgmapi/mgmapi.cpp
index 9bb238ca90b..a69a61dcda7 100644
--- a/ndb/src/mgmapi/mgmapi.cpp
+++ b/ndb/src/mgmapi/mgmapi.cpp
@@ -336,10 +336,16 @@ ndb_mgm_call(NdbMgmHandle handle, const ParserRow<ParserDummy> *command_reply,
const Properties* p = parser.parse(ctx, session);
if (p == NULL){
if(!ndb_mgm_is_connected(handle)) {
- return NULL;
+ DBUG_RETURN(NULL);
}
else
{
+ if(ctx.m_status==Parser_t::Eof
+ || ctx.m_status==Parser_t::NoLine)
+ {
+ ndb_mgm_disconnect(handle);
+ DBUG_RETURN(NULL);
+ }
/**
* Print some info about why the parser returns NULL
*/