Commit 6be30eec authored by mjorgensen@production.mysql.com's avatar mjorgensen@production.mysql.com

Merge bk-internal:/home/bk/mysql-5.0

into  production.mysql.com:/usersnfs/mjorgensen/bktrees/mysql-5.0-build
parents e10d74cf 6cb0c79c
use test;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
create table t1 (a int key, b int unique, c int) engine ndb;
ERROR HY000: Can't create table './test/t1.frm' (errno: 155)
create table t1 (a int key, b int unique, c int) engine ndb;
insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0);
create table t2 as select * from t1;
select * from t1 where a = 1;
a b c
1 1 0
select * from t1 where b = 4;
a b c
4 4 0
select * from t1 where a > 4 order by a;
a b c
5 5 0
6 6 0
7 7 0
8 8 0
9 9 0
10 10 0
update t1 set b=102 where a = 2;
update t1 set b=103 where b = 3;
update t1 set b=b+100;
update t1 set b=b+100 where a > 7;
delete from t1;
insert into t1 select * from t2;
drop table t1;
ERROR 42S02: Unknown table 't1'
create index new_index on t1 (c);
ERROR 42S02: Table 'test.t1' doesn't exist
insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0);
ERROR 42S02: Table 'test.t1' doesn't exist
select * from t1 where a = 1;
ERROR 42S02: Table 'test.t1' doesn't exist
select * from t1 where b = 4;
ERROR 42S02: Table 'test.t1' doesn't exist
update t1 set b=102 where a = 2;
ERROR 42S02: Table 'test.t1' doesn't exist
update t1 set b=103 where b = 3;
ERROR 42S02: Table 'test.t1' doesn't exist
update t1 set b=b+100;
ERROR 42S02: Table 'test.t1' doesn't exist
update t1 set b=b+100 where a > 7;
ERROR 42S02: Table 'test.t1' doesn't exist
drop table t1;
-- source include/have_ndb.inc
-- source include/have_multi_ndb.inc
-- source include/ndb_default_cluster.inc
-- source include/not_embedded.inc
--disable_warnings
use test;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
--enable_warnings
# operations allowed while cluster is in single user mode
--connection server1
--let $node_id= `SHOW STATUS LIKE 'Ndb_cluster_node_id'`
--disable_query_log
--eval set @node_id= SUBSTRING('$node_id', 20)+0
--enable_query_log
--let $node_id= `SELECT @node_id`
--exec $NDB_MGM --no-defaults --ndb-connectstring="localhost:$NDBCLUSTER_PORT" -e "enter single user mode $node_id" >> $NDB_TOOLS_OUTPUT
--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults --ndb-connectstring="localhost:$NDBCLUSTER_PORT" --single-user >> $NDB_TOOLS_OUTPUT
# verify that we are indeed in single user mode
--connection server2
--error 1005
create table t1 (a int key, b int unique, c int) engine ndb;
# test some sql on first mysqld
--connection server1
create table t1 (a int key, b int unique, c int) engine ndb;
insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0);
create table t2 as select * from t1;
# read with pk
select * from t1 where a = 1;
# read with unique index
select * from t1 where b = 4;
# read with ordered index
select * from t1 where a > 4 order by a;
# update with pk
update t1 set b=102 where a = 2;
# update with unique index
update t1 set b=103 where b = 3;
# update with full table scan
update t1 set b=b+100;
# update with ordered insex scan
update t1 set b=b+100 where a > 7;
# delete with full table scan
delete from t1;
insert into t1 select * from t2;
# test some sql on other mysqld
--connection server2
--error 1051
drop table t1;
--error 1146
#--error 1296
create index new_index on t1 (c);
--error 1146
#--error 1296
insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0);
--error 1146
#--error 1296
select * from t1 where a = 1;
--error 1146
#--error 1296
select * from t1 where b = 4;
--error 1146
#--error 1296
update t1 set b=102 where a = 2;
--error 1146
#--error 1296
update t1 set b=103 where b = 3;
--error 1146
#--error 1296
update t1 set b=b+100;
--error 1146
#--error 1296
update t1 set b=b+100 where a > 7;
--exec $NDB_MGM --no-defaults --ndb-connectstring="localhost:$NDBCLUSTER_PORT" -e "exit single user mode" >> $NDB_TOOLS_OUTPUT
--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults >> $NDB_TOOLS_OUTPUT
# cleanup
--connection server1
drop table t1;
...@@ -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);
...@@ -5414,9 +5410,7 @@ Dbdict::execDROP_TABLE_REQ(Signal* signal){ ...@@ -5414,9 +5410,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);
...@@ -6553,9 +6547,7 @@ Dbdict::execCREATE_INDX_REQ(Signal* signal) ...@@ -6553,9 +6547,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;
...@@ -7130,9 +7122,7 @@ Dbdict::execDROP_INDX_REQ(Signal* signal) ...@@ -7130,9 +7122,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;
...@@ -10574,4 +10564,20 @@ Dbdict::getMetaAttribute(MetaData::Attribute& attr, const MetaData::Table& table ...@@ -10574,4 +10564,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;
...@@ -2003,6 +2003,8 @@ private: ...@@ -2003,6 +2003,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
...@@ -880,6 +880,7 @@ NdbDictInterface::dictSignal(NdbApiSignal* signal, ...@@ -880,6 +880,7 @@ NdbDictInterface::dictSignal(NdbApiSignal* signal,
r = m_transporter->sendSignal(signal, aNodeId); r = m_transporter->sendSignal(signal, aNodeId);
} }
if(r != 0){ if(r != 0){
m_error.code= 4007;
m_transporter->unlock_mutex(); m_transporter->unlock_mutex();
continue; continue;
} }
...@@ -903,7 +904,10 @@ NdbDictInterface::dictSignal(NdbApiSignal* signal, ...@@ -903,7 +904,10 @@ NdbDictInterface::dictSignal(NdbApiSignal* signal,
* Handle error codes * Handle error codes
*/ */
if(m_waiter.m_state == WAIT_NODE_FAILURE) if(m_waiter.m_state == WAIT_NODE_FAILURE)
{
m_error.code = 4013;
continue; continue;
}
if(m_waiter.m_state == WST_WAIT_TIMEOUT) if(m_waiter.m_state == WST_WAIT_TIMEOUT)
{ {
......
...@@ -192,8 +192,7 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r) ...@@ -192,8 +192,7 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
if (j > 0) if (j > 0)
out << " "; out << " ";
switch(r.getType()) switch(r.getType()){
{
case NdbDictionary::Column::Bigunsigned: case NdbDictionary::Column::Bigunsigned:
out << r.u_64_value(); out << r.u_64_value();
break; break;
...@@ -222,12 +221,12 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r) ...@@ -222,12 +221,12 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
out << (int) r.char_value(); out << (int) r.char_value();
break; break;
case NdbDictionary::Column::Binary: case NdbDictionary::Column::Binary:
ndbrecattr_print_string(out,"Binary",r.aRef(),r.arraySize());
j = r.arraySize(); j = r.arraySize();
ndbrecattr_print_string(out,"Binary", r.aRef(), j);
break; break;
case NdbDictionary::Column::Char: case NdbDictionary::Column::Char:
ndbrecattr_print_string(out,"Char",r.aRef(),r.arraySize());
j = length; j = length;
ndbrecattr_print_string(out,"Char", r.aRef(), r.arraySize());
break; break;
case NdbDictionary::Column::Varchar: case NdbDictionary::Column::Varchar:
{ {
...@@ -374,8 +373,13 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r) ...@@ -374,8 +373,13 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
j = length; j = length;
} }
break; break;
case NdbDictionary::Column::Undefined:
case NdbDictionary::Column::Mediumint:
case NdbDictionary::Column::Mediumunsigned:
case NdbDictionary::Column::Longvarbinary:
unknown: unknown:
default: /* no print functions for the rest, just print type */ //default: /* no print functions for the rest, just print type */
out << (int) r.getType(); out << (int) r.getType();
j = length; j = length;
if (j > 1) if (j > 1)
......
...@@ -137,10 +137,12 @@ ErrorBundle ErrorCodes[] = { ...@@ -137,10 +137,12 @@ ErrorBundle ErrorCodes[] = {
/** /**
* Unknown result * Unknown result
*/ */
{ 4007, UR, "Send to ndbd node failed" },
{ 4008, UR, "Receive from NDB failed" }, { 4008, UR, "Receive from NDB failed" },
{ 4009, UR, "Cluster Failure" }, { 4009, UR, "Cluster Failure" },
{ 4012, UR, { 4012, UR,
"Request ndbd time-out, maybe due to high load or communication problems"}, "Request ndbd time-out, maybe due to high load or communication problems"},
{ 4013, UR, "Request timed out in waiting for node failure"},
{ 4024, UR, { 4024, UR,
"Time-out, most likely caused by simple read or cluster failure" }, "Time-out, most likely caused by simple read or cluster failure" },
......
...@@ -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