#At file:///net/fimafeng09/export/home/tmp/oleja/mysql/mysql-5.1-telco-7.0-spj-scan-scan/ based on revid:ole.john.aske@stripped
3379 Ole John Aske 2010-11-25 [merge]
Merge from telco-7.0 mainline
modified:
mysql-test/suite/ndb/r/ndb_index.result
mysql-test/suite/ndb/r/ndb_read_multi_range.result
mysql-test/suite/ndb/t/ndb_index.test
mysql-test/suite/ndb/t/ndb_read_multi_range.test
mysql-test/suite/rpl/t/disabled.def
sql/ha_ndbcluster.cc
sql/ha_ndbcluster.h
sql/rpl_utility.cc
storage/ndb/src/kernel/blocks/ERROR_codes.txt
storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
storage/ndb/src/kernel/vm/GlobalData.hpp
storage/ndb/src/kernel/vm/mt.cpp
storage/ndb/src/mgmsrv/ConfigInfo.cpp
storage/ndb/test/ndbapi/testNdbApi.cpp
storage/ndb/test/ndbapi/testNodeRestart.cpp
storage/ndb/test/run-test/daily-basic-tests.txt
=== modified file 'mysql-test/suite/ndb/r/ndb_index.result'
--- a/mysql-test/suite/ndb/r/ndb_index.result 2010-03-01 21:19:10 +0000
+++ b/mysql-test/suite/ndb/r/ndb_index.result 2010-11-25 14:42:27 +0000
@@ -288,3 +288,93 @@ b
5
6
drop table t1;
+create table t1(vc varchar(16), i int, vc2 varchar(1024)
+, PRIMARY KEY(vc,vc2) USING HASH
+, KEY i1(i)
+, KEY i2(vc)
+) ENGINE=ndbcluster;
+insert into t1 values
+('1',1,'1'), ('2',2,'2'), ('3',3,'3'), ('4',1,'4'), ('5',2,'5'),
+('6',3,'6'), ('7',1,'7'), ('8',2,'8'), ('9',3,'9'), ('10',1,'10'),
+('11',2,'11'), ('12',3,'12'), ('13',1,'13'), ('14',2,'14'), ('15',3,'15'),
+('16',1,'16'), ('17',2,'17'), ('x',3,'x'), ('y',1,'y'), ('z',2,'z'),
+('1000',3,'1000'), ('2000',3,'2000'), ('10000',3,'10000');
+analyze table t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status OK
+explain
+select i,vc from t1
+where i>=1 or vc > '0';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index_merge PRIMARY,i1,i2 i1,i2 5,18 NULL 20 Using sort_union(i1,i2); Using where with pushed condition
+select i,vc from t1
+where i>=1 or vc > '0';
+i vc
+1 1
+1 10
+1 13
+1 16
+1 4
+1 7
+1 y
+2 11
+2 14
+2 17
+2 2
+2 5
+2 8
+2 z
+3 1000
+3 10000
+3 12
+3 15
+3 2000
+3 3
+3 6
+3 9
+3 x
+create table t2(vc varchar(16), i int, vc2 varchar(1024)
+, KEY i1(i)
+, KEY i2(vc)
+) ENGINE=ndbcluster;
+insert into t2 values
+('1',1,'1'), ('2',2,'2'), ('3',3,'3'), ('4',1,'4'), ('5',2,'5'),
+('6',3,'6'), ('7',1,'7'), ('8',2,'8'), ('9',3,'9'), ('10',1,'10'),
+('11',2,'11'), ('12',3,'12'), ('13',1,'13'), ('14',2,'14'), ('15',3,'15'),
+('16',1,'16'), ('17',2,'17'), ('x',3,'x'), ('y',1,'y'), ('z',2,'z'),
+('1000',3,'1000'), ('2000',3,'2000'), ('10000',3,'10000');
+analyze table t2;
+Table Op Msg_type Msg_text
+test.t2 analyze status OK
+explain
+select i,vc from t2
+where i>=1 or vc > '0';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t2 index_merge i1,i2 i1,i2 5,19 NULL 20 Using sort_union(i1,i2); Using where with pushed condition
+select i,vc from t2
+where i>=1 or vc > '0';
+i vc
+1 1
+1 10
+1 13
+1 16
+1 4
+1 7
+1 y
+2 11
+2 14
+2 17
+2 2
+2 5
+2 8
+2 z
+3 1000
+3 10000
+3 12
+3 15
+3 2000
+3 3
+3 6
+3 9
+3 x
+drop table t1, t2;
=== modified file 'mysql-test/suite/ndb/r/ndb_read_multi_range.result'
--- a/mysql-test/suite/ndb/r/ndb_read_multi_range.result 2010-10-15 13:49:39 +0000
+++ b/mysql-test/suite/ndb/r/ndb_read_multi_range.result 2010-11-25 14:42:27 +0000
@@ -599,12 +599,12 @@ t1.a + t2.a*10 + t3.a*100 + t4.a*1000,
(t1.a + t2.a*10 + t3.a*100 + t4.a*1000) / 1000
from
t2 as t1, t2 as t2, t2 as t3, t2 as t4
-where (t1.a + t2.a*10 + t3.a*100 + t4.a*1000) < 4000;
+where (t1.a + t2.a*10 + t3.a*100 + t4.a*1000) < 3000;
explain
SELECT DISTINCT STRAIGHT_JOIN t1.pk FROM
t1 LEFT JOIN t2 ON t2.a = t1.a AND t2.pk != 6;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 4000 Using temporary
+1 SIMPLE t1 ALL NULL NULL NULL NULL 3000 Using temporary
1 SIMPLE t2 range PRIMARY PRIMARY 4 NULL 2 Using where; Distinct
SELECT DISTINCT STRAIGHT_JOIN t1.pk FROM
t1 LEFT JOIN t2 ON t2.a = t1.a AND t2.pk != 6;
=== modified file 'mysql-test/suite/ndb/t/ndb_index.test'
--- a/mysql-test/suite/ndb/t/ndb_index.test 2010-03-01 20:10:49 +0000
+++ b/mysql-test/suite/ndb/t/ndb_index.test 2010-11-24 17:45:27 +0000
@@ -192,3 +192,50 @@ select distinct b from t1;
select distinct b from t1 group by b;
drop table t1;
+
+# bug#58280
+create table t1(vc varchar(16), i int, vc2 varchar(1024)
+ , PRIMARY KEY(vc,vc2) USING HASH
+ , KEY i1(i)
+ , KEY i2(vc)
+ ) ENGINE=ndbcluster;
+
+insert into t1 values
+('1',1,'1'), ('2',2,'2'), ('3',3,'3'), ('4',1,'4'), ('5',2,'5'),
+('6',3,'6'), ('7',1,'7'), ('8',2,'8'), ('9',3,'9'), ('10',1,'10'),
+('11',2,'11'), ('12',3,'12'), ('13',1,'13'), ('14',2,'14'), ('15',3,'15'),
+('16',1,'16'), ('17',2,'17'), ('x',3,'x'), ('y',1,'y'), ('z',2,'z'),
+('1000',3,'1000'), ('2000',3,'2000'), ('10000',3,'10000');
+
+analyze table t1;
+explain
+select i,vc from t1
+ where i>=1 or vc > '0';
+
+--sorted_result
+select i,vc from t1
+ where i>=1 or vc > '0';
+
+# also test with hidden primary key
+create table t2(vc varchar(16), i int, vc2 varchar(1024)
+ , KEY i1(i)
+ , KEY i2(vc)
+ ) ENGINE=ndbcluster;
+
+insert into t2 values
+('1',1,'1'), ('2',2,'2'), ('3',3,'3'), ('4',1,'4'), ('5',2,'5'),
+('6',3,'6'), ('7',1,'7'), ('8',2,'8'), ('9',3,'9'), ('10',1,'10'),
+('11',2,'11'), ('12',3,'12'), ('13',1,'13'), ('14',2,'14'), ('15',3,'15'),
+('16',1,'16'), ('17',2,'17'), ('x',3,'x'), ('y',1,'y'), ('z',2,'z'),
+('1000',3,'1000'), ('2000',3,'2000'), ('10000',3,'10000');
+
+analyze table t2;
+explain
+select i,vc from t2
+ where i>=1 or vc > '0';
+
+--sorted_result
+select i,vc from t2
+ where i>=1 or vc > '0';
+
+drop table t1, t2;
=== modified file 'mysql-test/suite/ndb/t/ndb_read_multi_range.test'
--- a/mysql-test/suite/ndb/t/ndb_read_multi_range.test 2010-10-15 13:49:39 +0000
+++ b/mysql-test/suite/ndb/t/ndb_read_multi_range.test 2010-11-25 14:42:27 +0000
@@ -460,7 +460,7 @@ insert into t1
(t1.a + t2.a*10 + t3.a*100 + t4.a*1000) / 1000
from
t2 as t1, t2 as t2, t2 as t3, t2 as t4
-where (t1.a + t2.a*10 + t3.a*100 + t4.a*1000) < 4000;
+where (t1.a + t2.a*10 + t3.a*100 + t4.a*1000) < 3000;
# Execute a 'scan(t1) join mrr(t2)'
=== modified file 'mysql-test/suite/rpl/t/disabled.def'
--- a/mysql-test/suite/rpl/t/disabled.def 2010-10-12 11:54:35 +0000
+++ b/mysql-test/suite/rpl/t/disabled.def 2010-11-23 14:12:50 +0000
@@ -10,7 +10,6 @@
#
##############################################################################
-rpl_geometry : bug#51996
rpl_row_create_table : Bug#51574 Feb 27 2010 andrei failed different way than earlier with bug#45576
rpl_log_pos : BUG#55675 Sep 10 2010 27 2010 alfranio rpl.rpl_log_pos fails sporadically with error binlog truncated in the middle
=== modified file 'sql/ha_ndbcluster.cc'
--- a/sql/ha_ndbcluster.cc 2010-11-23 10:05:44 +0000
+++ b/sql/ha_ndbcluster.cc 2010-11-25 14:42:27 +0000
@@ -7823,7 +7823,7 @@ int ha_ndbcluster::rnd_next(uchar *buf)
error= next_result(buf);
else
error= full_table_scan(NULL, NULL, NULL, buf);
-
+
table->status= error ? STATUS_NOT_FOUND: 0;
DBUG_RETURN(error);
}
@@ -7990,6 +7990,44 @@ void ha_ndbcluster::position(const uchar
DBUG_VOID_RETURN;
}
+int
+ha_ndbcluster::cmp_ref(const uchar * ref1, const uchar * ref2)
+{
+ DBUG_ENTER("cmp_ref");
+
+ if (table_share->primary_key != MAX_KEY)
+ {
+ KEY *key_info= table->key_info + table_share->primary_key;
+ KEY_PART_INFO *key_part= key_info->key_part;
+ KEY_PART_INFO *end= key_part + key_info->key_parts;
+
+ for (; key_part != end; key_part++)
+ {
+ // NOTE: No need to check for null since PK is not-null
+
+ Field *field= key_part->field;
+ int result= field->key_cmp(ref1, ref2);
+ if (result)
+ {
+ DBUG_RETURN(result);
+ }
+
+ if (field->type() == MYSQL_TYPE_VARCHAR)
+ {
+ ref1+= 2;
+ ref2+= 2;
+ }
+
+ ref1+= key_part->length;
+ ref2+= key_part->length;
+ }
+ DBUG_RETURN(0);
+ }
+ else
+ {
+ DBUG_RETURN(memcmp(ref1, ref2, ref_length));
+ }
+}
int ha_ndbcluster::info(uint flag)
{
@@ -14058,8 +14096,7 @@ ha_ndbcluster::read_multi_range_first(KE
}
/**
- * There may still be an open m_multi_cursor from the previous
- * mrr access on this handler.
+ * There may still be an open m_multi_cursor from the previous mrr access on this handler.
* Close it now to free up resources for this NdbScanOperation.
*/
if (unlikely((error= close_scan())))
=== modified file 'sql/ha_ndbcluster.h'
--- a/sql/ha_ndbcluster.h 2010-11-15 10:26:48 +0000
+++ b/sql/ha_ndbcluster.h 2010-11-25 14:42:27 +0000
@@ -451,6 +451,7 @@ class ha_ndbcluster: public handler
int rnd_pos(uchar *buf, uchar *pos);
void position(const uchar *record);
int read_first_row(uchar *buf, uint primary_key);
+ virtual int cmp_ref(const uchar * ref1, const uchar * ref2);
int read_range_first(const key_range *start_key,
const key_range *end_key,
bool eq_range, bool sorted);
=== modified file 'sql/rpl_utility.cc'
--- a/sql/rpl_utility.cc 2010-11-09 09:29:29 +0000
+++ b/sql/rpl_utility.cc 2010-11-23 14:45:43 +0000
@@ -995,6 +995,7 @@ table_def::table_def(unsigned char *type
case MYSQL_TYPE_LONG_BLOB:
case MYSQL_TYPE_DOUBLE:
case MYSQL_TYPE_FLOAT:
+ case MYSQL_TYPE_GEOMETRY:
{
/*
These types store a single byte.
=== modified file 'storage/ndb/src/kernel/blocks/ERROR_codes.txt'
--- a/storage/ndb/src/kernel/blocks/ERROR_codes.txt 2010-10-29 20:51:26 +0000
+++ b/storage/ndb/src/kernel/blocks/ERROR_codes.txt 2010-11-25 14:42:27 +0000
@@ -3,7 +3,7 @@ Next NDBCNTR 1002
Next NDBFS 2000
Next DBACC 3002
Next DBTUP 4035
-Next DBLQH 5061
+Next DBLQH 5064
Next DBDICT 6026
Next DBDIH 7229
Next DBTC 8088
=== modified file 'storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp 2010-10-29 20:45:08 +0000
+++ b/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp 2010-11-25 14:42:27 +0000
@@ -1714,6 +1714,17 @@ void Dbdih::execNDB_STTOR(Signal* signal
break;
case ZNDB_SPH5:
jam();
+ if (m_gcp_monitor.m_micro_gcp.m_max_lag > 0)
+ {
+ infoEvent("GCP Monitor: Computed max GCP_SAVE lag to %u seconds",
+ m_gcp_monitor.m_gcp_save.m_max_lag / 10);
+ infoEvent("GCP Monitor: Computed max GCP_COMMIT lag to %u seconds",
+ m_gcp_monitor.m_micro_gcp.m_max_lag / 10);
+ }
+ else
+ {
+ infoEvent("GCP Monitor: unlimited lags allowed");
+ }
switch(typestart){
case NodeState::ST_INITIAL_START:
case NodeState::ST_SYSTEM_RESTART:
@@ -5851,6 +5862,17 @@ void Dbdih::MASTER_GCPhandling(Signal* s
m_micro_gcp.m_master.m_start_time = 0;
m_gcp_save.m_master.m_start_time = 0;
+ if (m_gcp_monitor.m_micro_gcp.m_max_lag > 0)
+ {
+ infoEvent("GCP Monitor: Computed max GCP_SAVE lag to %u seconds",
+ m_gcp_monitor.m_gcp_save.m_max_lag / 10);
+ infoEvent("GCP Monitor: Computed max GCP_COMMIT lag to %u seconds",
+ m_gcp_monitor.m_micro_gcp.m_max_lag / 10);
+ }
+ else
+ {
+ infoEvent("GCP Monitor: unlimited lags allowed");
+ }
bool ok = false;
switch(m_micro_gcp.m_master.m_state){
@@ -13948,11 +13970,29 @@ void Dbdih::checkGcpStopLab(Signal* sign
if (m_gcp_monitor.m_gcp_save.m_gci == m_gcp_save.m_gci)
{
jam();
- if (cnt0 == m_gcp_monitor.m_gcp_save.m_max_lag)
+ if (m_gcp_monitor.m_gcp_save.m_max_lag &&
+ cnt0 == m_gcp_monitor.m_gcp_save.m_max_lag)
{
crashSystemAtGcpStop(signal, false);
return;
}
+
+ Uint32 threshold = 60; // seconds
+ if (cnt0 && ((cnt0 % (threshold * 10)) == 0))
+ {
+ if (m_gcp_monitor.m_gcp_save.m_max_lag)
+ {
+ warningEvent("GCP Monitor: GCP_SAVE lag %u seconds"
+ " (max lag: %us)",
+ cnt0/10, m_gcp_monitor.m_gcp_save.m_max_lag/10);
+ }
+ else
+ {
+ warningEvent("GCP Monitor: GCP_SAVE lag %u seconds"
+ " (no max lag)",
+ cnt0/10);
+ }
+ }
}
else
{
@@ -13968,11 +14008,28 @@ void Dbdih::checkGcpStopLab(Signal* sign
m_gcp_monitor.m_micro_gcp.m_max_lag :
m_gcp_monitor.m_gcp_save.m_max_lag;
- if (cnt1 == cmp)
+ if (cmp && cnt1 == cmp)
{
crashSystemAtGcpStop(signal, false);
return;
}
+
+ Uint32 threshold = 10; // seconds
+ if (cnt1 && ((cnt0 % (threshold * 10)) == 0))
+ {
+ if (m_gcp_monitor.m_micro_gcp.m_max_lag)
+ {
+ warningEvent("GCP Monitor: GCP_COMMIT lag %u seconds"
+ " (max lag: %u)",
+ cnt1/10, m_gcp_monitor.m_micro_gcp.m_max_lag/10);
+ }
+ else
+ {
+ warningEvent("GCP Monitor: GCP_COMMIT lag %u seconds"
+ " (no max lag)",
+ cnt1/10);
+ }
+ }
}
else
{
@@ -14933,9 +14990,19 @@ void Dbdih::initCommonData()
{ // Set time-between epochs timeout
Uint32 tmp = 4000;
ndb_mgm_get_int_parameter(p, CFG_DB_MICRO_GCP_TIMEOUT, &tmp);
- tmp += max_failure_time;
- m_gcp_monitor.m_micro_gcp.m_max_lag =
- (m_micro_gcp.m_master.m_time_between_gcp + tmp) / 100;
+ if (tmp != 0)
+ {
+ jam();
+ tmp += max_failure_time;
+ m_gcp_monitor.m_micro_gcp.m_max_lag =
+ (m_micro_gcp.m_master.m_time_between_gcp + tmp) / 100;
+ }
+ else
+ {
+ jam();
+ m_gcp_monitor.m_gcp_save.m_max_lag = 0;
+ m_gcp_monitor.m_micro_gcp.m_max_lag = 0;
+ }
}
}
}//Dbdih::initCommonData()
=== modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2010-11-04 09:41:08 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2010-11-25 14:42:27 +0000
@@ -3104,7 +3104,11 @@ void Dblqh::execPACKED_SIGNAL(Signal* si
TcommitLen = 4;
Tgci_lo_mask = 0;
}
-
+
+#ifdef ERROR_INSERT
+ Uint32 senderBlockRef = signal->getSendersBlockRef();
+#endif
+
ndbrequire(Tlength <= 25);
MEMCOPY_NO_WORDS(&TpackedData[0], &signal->theData[0], Tlength);
while (Tlength > Tstep) {
@@ -3173,6 +3177,9 @@ void Dblqh::execPACKED_SIGNAL(Signal* si
ndbrequire(false);
return;
}//switch
+#ifdef ERROR_INSERT
+ signal->header.theSendersBlockRef = senderBlockRef;
+#endif
}//while
ndbrequire(Tlength == Tstep);
return;
@@ -7176,6 +7183,24 @@ void Dblqh::execCOMMIT(Signal* signal)
sendSignalWithDelay(cownref, GSN_COMMIT, signal, 2000,signal->getLength());
return;
}//if
+ if (ERROR_INSERTED(5062) &&
+ ((refToMain(signal->getSendersBlockRef()) == DBTC) ||
+ signal->getSendersBlockRef() == reference()))
+ {
+ Uint32 save = signal->getSendersBlockRef();
+ ndbout_c("Delaying execCOMMIT");
+ sendSignalWithDelay(cownref, GSN_COMMIT, signal, 2000, signal->getLength());
+
+ if (refToMain(save) == DBTC)
+ {
+ ndbout_c("killing %u", refToNode(save));
+ signal->theData[0] = 9999;
+ sendSignal(numberToRef(CMVMI, refToNode(save)),
+ GSN_NDB_TAMPER, signal, 1, JBB);
+ }
+ return;
+ }
+
tcConnectptr.i = tcIndex;
ptrAss(tcConnectptr, regTcConnectionrec);
if ((tcConnectptr.p->transid[0] == transid1) &&
@@ -7313,6 +7338,24 @@ void Dblqh::execCOMPLETE(Signal* signal)
sendSignalWithDelay(cownref, GSN_COMPLETE, signal, 2000, 3);
return;
}//if
+ if (ERROR_INSERTED(5063) &&
+ ((refToMain(signal->getSendersBlockRef()) == DBTC) ||
+ signal->getSendersBlockRef() == reference()))
+ {
+ Uint32 save = signal->getSendersBlockRef();
+ ndbout_c("Delaying execCOMPLETE");
+ sendSignalWithDelay(cownref, GSN_COMPLETE,signal, 2000,signal->getLength());
+
+ if (refToMain(save) == DBTC)
+ {
+ ndbout_c("killing %u", refToNode(save));
+ signal->theData[0] = 9999;
+ sendSignal(numberToRef(CMVMI, refToNode(save)),
+ GSN_NDB_TAMPER, signal, 1, JBB);
+ }
+ return;
+ }
+
tcConnectptr.i = tcIndex;
ptrAss(tcConnectptr, regTcConnectionrec);
if ((tcConnectptr.p->transactionState == TcConnectionrec::COMMITTED) &&
@@ -7871,8 +7914,6 @@ void Dblqh::commitReplyLab(Signal* signa
sendSignal(tcConnectptr.p->reqBlockref, GSN_COMMITCONF, signal, 4, JBB);
} else {
ndbrequire(regTcPtr->abortState == TcConnectionrec::NEW_FROM_TC);
- jam();
- sendLqhTransconf(signal, LqhTransConf::Committed);
}//if
return;
}//Dblqh::commitReplyLab()
@@ -7925,7 +7966,6 @@ void Dblqh::completeUnusualLab(Signal* s
sendAborted(signal);
} else if (regTcPtr->abortState == TcConnectionrec::NEW_FROM_TC) {
jam();
- sendLqhTransconf(signal, LqhTransConf::Committed);
} else {
ndbrequire(regTcPtr->abortState == TcConnectionrec::REQ_FROM_TC);
jam();
@@ -8387,6 +8427,7 @@ void Dblqh::abortStateHandlerLab(Signal*
/*WE ARE ONLY CHECKING THE STATUS OF THE TRANSACTION. IT IS COMMITTING. */
/*COMPLETE THE COMMIT LOCALLY AND THEN SEND REPORT OF COMMITTED TO THE NEW TC*/
/* ------------------------------------------------------------------------- */
+ sendLqhTransconf(signal, LqhTransConf::Committed);
return;
break;
case TcConnectionrec::COMMITTED:
@@ -8900,6 +8941,29 @@ void Dblqh::lqhTransNextLab(Signal* sign
* now scan markers
*/
#ifdef ERROR_INSERT
+ if (ERROR_INSERTED(5061))
+ {
+ CLEAR_ERROR_INSERT_VALUE;
+ for (Uint32 i = 0; i < cnoOfNodes; i++)
+ {
+ Uint32 node = cnodeData[i];
+ if (node != getOwnNodeId() && cnodeStatus[i] == ZNODE_UP)
+ {
+ ndbout_c("clearing ERROR_INSERT in LQH:%u", node);
+ signal->theData[0] = 0;
+ sendSignal(numberToRef(DBLQH, node), GSN_NDB_TAMPER,
+ signal, 1, JBB);
+ }
+ }
+
+ signal->theData[0] = ZSCAN_MARKERS;
+ signal->theData[1] = tcNodeFailptr.i;
+ signal->theData[2] = 0;
+ signal->theData[3] = RNIL;
+ sendSignalWithDelay(cownref, GSN_CONTINUEB, signal, 5000, 4);
+ return;
+ }
+
if (ERROR_INSERTED(5050))
{
ndbout_c("send ZSCAN_MARKERS with 5s delay and killing master");
=== modified file 'storage/ndb/src/kernel/vm/GlobalData.hpp'
--- a/storage/ndb/src/kernel/vm/GlobalData.hpp 2010-04-28 12:21:54 +0000
+++ b/storage/ndb/src/kernel/vm/GlobalData.hpp 2010-11-25 12:53:32 +0000
@@ -96,6 +96,7 @@ struct GlobalData {
SimulatedBlock * getBlockInstance(BlockNumber fullBlockNo) {
return getBlock(blockToMain(fullBlockNo), blockToInstance(fullBlockNo));
}
+ SimulatedBlock * mt_getBlock(BlockNumber blockNo, Uint32 instanceNo);
void incrementWatchDogCounter(Uint32 place);
Uint32 * getWatchDogPtr();
=== modified file 'storage/ndb/src/kernel/vm/mt.cpp'
--- a/storage/ndb/src/kernel/vm/mt.cpp 2010-11-10 08:01:00 +0000
+++ b/storage/ndb/src/kernel/vm/mt.cpp 2010-11-25 14:42:27 +0000
@@ -34,6 +34,16 @@
#include "mt-asm.h"
+inline
+SimulatedBlock*
+GlobalData::mt_getBlock(BlockNumber blockNo, Uint32 instanceNo)
+{
+ SimulatedBlock* b = getBlock(blockNo);
+ if (b != 0 && instanceNo != 0)
+ b = b->getInstance(instanceNo);
+ return b;
+}
+
#ifdef __GNUC__
/* Provides a small (but noticeable) speedup in benchmarks. */
#define memcpy __builtin_memcpy
@@ -2395,7 +2405,7 @@ execute_signals(thr_data *selfptr, thr_j
}
Uint32 bno = blockToMain(s->theReceiversBlockNumber);
Uint32 ino = map_instance(s);
- SimulatedBlock* block = globalData.getBlock(bno, ino);
+ SimulatedBlock* block = globalData.mt_getBlock(bno, ino);
assert(block != 0);
Uint32 gsn = s->theVerId_signalNumber;
=== modified file 'storage/ndb/src/mgmsrv/ConfigInfo.cpp'
--- a/storage/ndb/src/mgmsrv/ConfigInfo.cpp 2010-10-28 13:24:21 +0000
+++ b/storage/ndb/src/mgmsrv/ConfigInfo.cpp 2010-11-22 14:27:12 +0000
@@ -1038,7 +1038,7 @@ const ConfigInfo::ParamInfo ConfigInfo::
ConfigInfo::CI_INT,
"4000",
"0",
- "32000" },
+ "256000" },
{
CFG_DB_MAX_BUFFERED_EPOCHS,
=== modified file 'storage/ndb/test/ndbapi/testNdbApi.cpp'
--- a/storage/ndb/test/ndbapi/testNdbApi.cpp 2010-11-10 12:28:34 +0000
+++ b/storage/ndb/test/ndbapi/testNdbApi.cpp 2010-11-24 12:42:48 +0000
@@ -3104,7 +3104,8 @@ int runBulkPkReads(NDBT_Context* ctx, ND
hugoOps.closeTransaction(otherNdb);
- if ((err.code == 4010) || // Node failure
+ if ((err.code == 4002) || // send failed
+ (err.code == 4010) || // Node failure
(err.code == 4025) || // Node failure
(err.code == 1218)) // Send buffer overload (reading larger tables)
{
=== modified file 'storage/ndb/test/ndbapi/testNodeRestart.cpp'
--- a/storage/ndb/test/ndbapi/testNodeRestart.cpp 2010-10-28 12:59:31 +0000
+++ b/storage/ndb/test/ndbapi/testNodeRestart.cpp 2010-11-24 12:16:55 +0000
@@ -4127,6 +4127,59 @@ runForceStopAndRestart(NDBT_Context* ctx
return NDBT_OK;
}
+int
+runBug58453(NDBT_Context* ctx, NDBT_Step* step)
+{
+ NdbRestarter res;
+ if (res.getNumDbNodes() < 4)
+ return NDBT_OK;
+
+ Ndb* pNdb = GETNDB(step);
+ HugoOperations hugoOps(*ctx->getTab());
+
+ int loops = ctx->getNumLoops();
+ while (loops--)
+ {
+ if (hugoOps.startTransaction(pNdb) != 0)
+ return NDBT_FAILED;
+
+ if (hugoOps.pkInsertRecord(pNdb, 0, 128 /* records */) != 0)
+ return NDBT_FAILED;
+
+ int err = 5062;
+ switch(loops & 1){
+ case 0:
+ err = 5062;
+ break;
+ case 1:
+ err = 5063;
+ break;
+ }
+ int node = (int)hugoOps.getTransaction()->getConnectedNodeId();
+ int node0 = res.getRandomNodeOtherNodeGroup(node, rand());
+ int node1 = res.getRandomNodeSameNodeGroup(node0, rand());
+
+ ndbout_c("node %u err: %u, node: %u err: %u",
+ node0, 5061, node1, err);
+
+ int val2[] = { DumpStateOrd::CmvmiSetRestartOnErrorInsert, 1 };
+
+ res.dumpStateOneNode(node, val2, 2);
+ res.insertErrorInNode(node0, 5061);
+ res.insertErrorInNode(node1, err);
+
+ hugoOps.execute_Commit(pNdb);
+ hugoOps.closeTransaction(pNdb);
+
+ res.waitNodesNoStart(&node, 1);
+ res.startNodes(&node, 1);
+ res.waitClusterStarted();
+ hugoOps.clearTable(pNdb);
+ }
+
+ return NDBT_OK;
+}
+
NDBT_TESTSUITE(testNodeRestart);
TESTCASE("NoLoad",
"Test that one node at a time can be stopped and then restarted "\
@@ -4609,6 +4662,10 @@ TESTCASE("Bug42422", ""){
TESTCASE("Bug43224", ""){
INITIALIZER(runBug43224);
}
+TESTCASE("Bug58453", "")
+{
+ INITIALIZER(runBug58453);
+}
TESTCASE("Bug43888", ""){
INITIALIZER(runBug43888);
}
=== modified file 'storage/ndb/test/run-test/daily-basic-tests.txt'
--- a/storage/ndb/test/run-test/daily-basic-tests.txt 2010-11-03 14:11:46 +0000
+++ b/storage/ndb/test/run-test/daily-basic-tests.txt 2010-11-25 14:42:27 +0000
@@ -1387,6 +1387,10 @@ cmd: testNodeRestart
args: -n Bug36245 T1
max-time: 300
+cmd: testNodeRestart
+args: -n Bug58453 T1
+
+max-time: 300
cmd: test_event
args: -n Bug34853 T1
No bundle (reason: revision is a merge).
| Thread |
|---|
| • bzr commit into mysql-5.1-telco-7.0-spj-scan-vs-scan branch(ole.john.aske:3379) | Ole John Aske | 25 Nov |