Bug #25275 SINGLE USER MODE prevents ALTER on non-ndb tables for other mysqld nodes
- correction of part 1
    add ndb_waiter option to wait for single user mode
parent 6c25da9d
...@@ -2910,9 +2910,7 @@ Dbdict::execCREATE_TABLE_REQ(Signal* signal){ ...@@ -2910,9 +2910,7 @@ Dbdict::execCREATE_TABLE_REQ(Signal* signal){
break; break;
} }
if(getNodeState().getSingleUserMode() && if (checkSingleUserMode(signal->getSendersBlockRef()))
(refToNode(signal->getSendersBlockRef()) !=
getNodeState().getSingleUserApi()))
{ {
jam(); jam();
parseRecord.errorCode = CreateTableRef::SingleUser; parseRecord.errorCode = CreateTableRef::SingleUser;
...@@ -3081,9 +3079,7 @@ Dbdict::execALTER_TABLE_REQ(Signal* signal) ...@@ -3081,9 +3079,7 @@ Dbdict::execALTER_TABLE_REQ(Signal* signal)
return; return;
} }
if(getNodeState().getSingleUserMode() && if (checkSingleUserMode(signal->getSendersBlockRef()))
(refToNode(signal->getSendersBlockRef()) !=
getNodeState().getSingleUserApi()))
{ {
jam(); jam();
alterTableRef(signal, req, AlterTableRef::SingleUser); alterTableRef(signal, req, AlterTableRef::SingleUser);
...@@ -5419,9 +5415,7 @@ Dbdict::execDROP_TABLE_REQ(Signal* signal){ ...@@ -5419,9 +5415,7 @@ Dbdict::execDROP_TABLE_REQ(Signal* signal){
return; return;
} }
if(getNodeState().getSingleUserMode() && if (checkSingleUserMode(signal->getSendersBlockRef()))
(refToNode(signal->getSendersBlockRef()) !=
getNodeState().getSingleUserApi()))
{ {
jam(); jam();
dropTableRef(signal, req, DropTableRef::SingleUser); dropTableRef(signal, req, DropTableRef::SingleUser);
...@@ -6558,9 +6552,7 @@ Dbdict::execCREATE_INDX_REQ(Signal* signal) ...@@ -6558,9 +6552,7 @@ Dbdict::execCREATE_INDX_REQ(Signal* signal)
jam(); jam();
tmperr = CreateIndxRef::Busy; tmperr = CreateIndxRef::Busy;
} }
else if(getNodeState().getSingleUserMode() && else if (checkSingleUserMode(senderRef))
(refToNode(senderRef) !=
getNodeState().getSingleUserApi()))
{ {
jam(); jam();
tmperr = CreateIndxRef::SingleUser; tmperr = CreateIndxRef::SingleUser;
...@@ -7135,9 +7127,7 @@ Dbdict::execDROP_INDX_REQ(Signal* signal) ...@@ -7135,9 +7127,7 @@ Dbdict::execDROP_INDX_REQ(Signal* signal)
jam(); jam();
tmperr = DropIndxRef::Busy; tmperr = DropIndxRef::Busy;
} }
else if(getNodeState().getSingleUserMode() && else if (checkSingleUserMode(senderRef))
(refToNode(senderRef) !=
getNodeState().getSingleUserApi()))
{ {
jam(); jam();
tmperr = DropIndxRef::SingleUser; tmperr = DropIndxRef::SingleUser;
...@@ -10579,4 +10569,20 @@ Dbdict::getMetaAttribute(MetaData::Attribute& attr, const MetaData::Table& table ...@@ -10579,4 +10569,20 @@ Dbdict::getMetaAttribute(MetaData::Attribute& attr, const MetaData::Table& table
return 0; return 0;
} }
/*
return 1 if all of the below is true
a) node in single user mode
b) senderRef is not a db node
c) senderRef nodeid is not the singleUserApi
*/
int Dbdict::checkSingleUserMode(Uint32 senderRef)
{
Uint32 nodeId = refToNode(senderRef);
return
getNodeState().getSingleUserMode() &&
(getNodeInfo(nodeId).m_type != NodeInfo::DB) &&
(nodeId != getNodeState().getSingleUserApi());
}
CArray<KeyDescriptor> g_key_descriptor_pool; CArray<KeyDescriptor> g_key_descriptor_pool;
...@@ -1997,6 +1997,8 @@ private: ...@@ -1997,6 +1997,8 @@ private:
int getMetaTable(MetaData::Table& table, const char* tableName); int getMetaTable(MetaData::Table& table, const char* tableName);
int getMetaAttribute(MetaData::Attribute& attribute, const MetaData::Table& table, Uint32 attributeId); int getMetaAttribute(MetaData::Attribute& attribute, const MetaData::Table& table, Uint32 attributeId);
int getMetaAttribute(MetaData::Attribute& attribute, const MetaData::Table& table, const char* attributeName); int getMetaAttribute(MetaData::Attribute& attribute, const MetaData::Table& table, const char* attributeName);
int checkSingleUserMode(Uint32 senderRef);
}; };
#endif #endif
...@@ -30,12 +30,14 @@ waitClusterStatus(const char* _addr, ndb_mgm_node_status _status, ...@@ -30,12 +30,14 @@ waitClusterStatus(const char* _addr, ndb_mgm_node_status _status,
unsigned int _timeout); unsigned int _timeout);
enum ndb_waiter_options { enum ndb_waiter_options {
OPT_WAIT_STATUS_NOT_STARTED = NDB_STD_OPTIONS_LAST OPT_WAIT_STATUS_NOT_STARTED = NDB_STD_OPTIONS_LAST,
OPT_WAIT_STATUS_SINGLE_USER
}; };
NDB_STD_OPTS_VARS; NDB_STD_OPTS_VARS;
static int _no_contact = 0; static int _no_contact = 0;
static int _not_started = 0; static int _not_started = 0;
static int _single_user = 0;
static int _timeout = 120; static int _timeout = 120;
const char *load_default_groups[]= { "mysql_cluster",0 }; const char *load_default_groups[]= { "mysql_cluster",0 };
...@@ -49,6 +51,10 @@ static struct my_option my_long_options[] = ...@@ -49,6 +51,10 @@ static struct my_option my_long_options[] =
{ "not-started", OPT_WAIT_STATUS_NOT_STARTED, "Wait for cluster not started", { "not-started", OPT_WAIT_STATUS_NOT_STARTED, "Wait for cluster not started",
(gptr*) &_not_started, (gptr*) &_not_started, 0, (gptr*) &_not_started, (gptr*) &_not_started, 0,
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 }, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
{ "single-user", OPT_WAIT_STATUS_SINGLE_USER,
"Wait for cluster to enter single user mode",
(gptr*) &_single_user, (gptr*) &_single_user, 0,
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
{ "timeout", 't', "Timeout to wait", { "timeout", 't', "Timeout to wait",
(gptr*) &_timeout, (gptr*) &_timeout, 0, (gptr*) &_timeout, (gptr*) &_timeout, 0,
GET_INT, REQUIRED_ARG, 120, 0, 0, 0, 0, 0 }, GET_INT, REQUIRED_ARG, 120, 0, 0, 0, 0, 0 },
...@@ -90,6 +96,10 @@ int main(int argc, char** argv){ ...@@ -90,6 +96,10 @@ int main(int argc, char** argv){
{ {
wait_status= NDB_MGM_NODE_STATUS_NOT_STARTED; wait_status= NDB_MGM_NODE_STATUS_NOT_STARTED;
} }
else if (_single_user)
{
wait_status= NDB_MGM_NODE_STATUS_SINGLEUSER;
}
else else
{ {
wait_status= NDB_MGM_NODE_STATUS_STARTED; wait_status= NDB_MGM_NODE_STATUS_STARTED;
......
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