mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.0-ndb
into poseidon.mysql.com:/home/tomas/mysql-5.0-ndb
This commit is contained in:
commit
68d074d073
15 changed files with 218 additions and 26 deletions
|
|
@ -1398,18 +1398,19 @@ id val
|
|||
1 test1
|
||||
2 test2
|
||||
INSERT INTO t1 VALUES (2,'test2') ON DUPLICATE KEY UPDATE val=VALUES(val);
|
||||
INSERT INTO t1 VALUES (3,'test3') ON DUPLICATE KEY UPDATE val=VALUES(val);
|
||||
INSERT INTO t1 VALUES (2,'test3') ON DUPLICATE KEY UPDATE val=VALUES(val);
|
||||
INSERT INTO t1 VALUES (3,'test4') ON DUPLICATE KEY UPDATE val=VALUES(val);
|
||||
SELECT * FROM t1;
|
||||
id val
|
||||
1 test1
|
||||
2 test2
|
||||
3 test3
|
||||
2 test3
|
||||
3 test4
|
||||
SELECT * FROM t2;
|
||||
id val
|
||||
1 test1
|
||||
2 test2
|
||||
3 test2
|
||||
4 test3
|
||||
3 test3
|
||||
4 test4
|
||||
DROP TRIGGER trg27006_a_insert;
|
||||
DROP TRIGGER trg27006_a_update;
|
||||
drop table t1,t2;
|
||||
|
|
|
|||
|
|
@ -1700,8 +1700,7 @@ DROP PROCEDURE bug22580_proc_1;
|
|||
DROP PROCEDURE bug22580_proc_2;
|
||||
|
||||
#
|
||||
# Bug#27006: AFTER UPDATE triggers not fired with INSERT ... ON DUPLICATE KEY
|
||||
# UPDATE if the row wasn't actually changed.
|
||||
# Bug#27006: AFTER UPDATE triggers not fired with INSERT ... ON DUPLICATE
|
||||
#
|
||||
--disable_warnings
|
||||
DROP TRIGGER IF EXISTS trg27006_a_update;
|
||||
|
|
@ -1730,7 +1729,8 @@ INSERT INTO t1(val) VALUES ('test1'),('test2');
|
|||
SELECT * FROM t1;
|
||||
SELECT * FROM t2;
|
||||
INSERT INTO t1 VALUES (2,'test2') ON DUPLICATE KEY UPDATE val=VALUES(val);
|
||||
INSERT INTO t1 VALUES (3,'test3') ON DUPLICATE KEY UPDATE val=VALUES(val);
|
||||
INSERT INTO t1 VALUES (2,'test3') ON DUPLICATE KEY UPDATE val=VALUES(val);
|
||||
INSERT INTO t1 VALUES (3,'test4') ON DUPLICATE KEY UPDATE val=VALUES(val);
|
||||
SELECT * FROM t1;
|
||||
SELECT * FROM t2;
|
||||
DROP TRIGGER trg27006_a_insert;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ Next DBACC 3002
|
|||
Next DBTUP 4014
|
||||
Next DBLQH 5043
|
||||
Next DBDICT 6007
|
||||
Next DBDIH 7181
|
||||
Next DBDIH 7183
|
||||
Next DBTC 8039
|
||||
Next CMVMI 9000
|
||||
Next BACKUP 10022
|
||||
|
|
@ -489,3 +489,15 @@ Dbdict:
|
|||
6003 Crash in participant @ CreateTabReq::Prepare
|
||||
6004 Crash in participant @ CreateTabReq::Commit
|
||||
6005 Crash in participant @ CreateTabReq::CreateDrop
|
||||
|
||||
TUP:
|
||||
----
|
||||
|
||||
4025: Fail all inserts with out of memory
|
||||
4026: Fail one insert with oom
|
||||
4027: Fail inserts randomly with oom
|
||||
4028: Fail one random insert with oom
|
||||
|
||||
NDBCNTR:
|
||||
|
||||
1000: Crash insertion on SystemError::CopyFragRef
|
||||
|
|
|
|||
|
|
@ -4811,6 +4811,15 @@ void Dbdih::execMASTER_GCPREQ(Signal* signal)
|
|||
} else {
|
||||
ndbrequire(failedNodePtr.p->nodeStatus == NodeRecord::DYING);
|
||||
}//if
|
||||
|
||||
if (ERROR_INSERTED(7181))
|
||||
{
|
||||
ndbout_c("execGCP_TCFINISHED in MASTER_GCPREQ");
|
||||
CLEAR_ERROR_INSERT_VALUE;
|
||||
signal->theData[1] = coldgcp;
|
||||
execGCP_TCFINISHED(signal);
|
||||
}
|
||||
|
||||
MasterGCPConf::State gcpState;
|
||||
switch (cgcpParticipantState) {
|
||||
case GCP_PARTICIPANT_READY:
|
||||
|
|
@ -4877,6 +4886,14 @@ void Dbdih::execMASTER_GCPREQ(Signal* signal)
|
|||
masterGCPConf->lcpActive[i] = SYSFILE->lcpActive[i];
|
||||
sendSignal(newMasterBlockref, GSN_MASTER_GCPCONF, signal,
|
||||
MasterGCPConf::SignalLength, JBB);
|
||||
|
||||
if (ERROR_INSERTED(7182))
|
||||
{
|
||||
ndbout_c("execGCP_TCFINISHED in MASTER_GCPREQ");
|
||||
CLEAR_ERROR_INSERT_VALUE;
|
||||
signal->theData[1] = coldgcp;
|
||||
execGCP_TCFINISHED(signal);
|
||||
}
|
||||
}//Dbdih::execMASTER_GCPREQ()
|
||||
|
||||
void Dbdih::execMASTER_GCPCONF(Signal* signal)
|
||||
|
|
@ -7549,10 +7566,10 @@ void Dbdih::execGCP_NODEFINISH(Signal* signal)
|
|||
} else if (cmasterState == MASTER_TAKE_OVER_GCP) {
|
||||
jam();
|
||||
//-------------------------------------------------------------
|
||||
// We are currently taking over as master. We will delay the
|
||||
// signal until we have completed the take over gcp handling.
|
||||
// We are currently taking over as master. Ignore
|
||||
// signal in this case since we will discover it in reception of
|
||||
// MASTER_GCPCONF.
|
||||
//-------------------------------------------------------------
|
||||
sendSignalWithDelay(reference(), GSN_GCP_NODEFINISH, signal, 20, 3);
|
||||
return;
|
||||
} else {
|
||||
ndbrequire(cmasterState == MASTER_ACTIVE);
|
||||
|
|
@ -7699,6 +7716,15 @@ void Dbdih::execGCP_TCFINISHED(Signal* signal)
|
|||
Uint32 gci = signal->theData[1];
|
||||
ndbrequire(gci == coldgcp);
|
||||
|
||||
if (ERROR_INSERTED(7181) || ERROR_INSERTED(7182))
|
||||
{
|
||||
ndbout_c("killing %d", refToNode(cmasterdihref));
|
||||
signal->theData[0] = 9999;
|
||||
sendSignal(numberToRef(CMVMI, refToNode(cmasterdihref)),
|
||||
GSN_NDB_TAMPER, signal, 1, JBB);
|
||||
return;
|
||||
}
|
||||
|
||||
cgcpParticipantState = GCP_PARTICIPANT_TC_FINISHED;
|
||||
signal->theData[0] = cownNodeId;
|
||||
signal->theData[1] = coldgcp;
|
||||
|
|
|
|||
|
|
@ -9634,6 +9634,15 @@ void Dblqh::copyCompletedLab(Signal* signal)
|
|||
closeCopyLab(signal);
|
||||
return;
|
||||
}//if
|
||||
|
||||
if (scanptr.p->scanState == ScanRecord::WAIT_LQHKEY_COPY &&
|
||||
scanptr.p->scanErrorCounter)
|
||||
{
|
||||
jam();
|
||||
closeCopyLab(signal);
|
||||
return;
|
||||
}
|
||||
|
||||
if (scanptr.p->scanState == ScanRecord::WAIT_LQHKEY_COPY) {
|
||||
jam();
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
|
@ -9710,13 +9719,16 @@ void Dblqh::continueCopyAfterBlockedLab(Signal* signal)
|
|||
void Dblqh::copyLqhKeyRefLab(Signal* signal)
|
||||
{
|
||||
ndbrequire(tcConnectptr.p->transid[1] == signal->theData[4]);
|
||||
tcConnectptr.p->copyCountWords -= signal->theData[3];
|
||||
Uint32 copyWords = signal->theData[3];
|
||||
scanptr.i = tcConnectptr.p->tcScanRec;
|
||||
c_scanRecordPool.getPtr(scanptr);
|
||||
scanptr.p->scanErrorCounter++;
|
||||
tcConnectptr.p->errorCode = terrorCode;
|
||||
closeCopyLab(signal);
|
||||
return;
|
||||
|
||||
LqhKeyConf* conf = (LqhKeyConf*)signal->getDataPtrSend();
|
||||
conf->transId1 = copyWords;
|
||||
conf->transId2 = tcConnectptr.p->transid[1];
|
||||
copyCompletedLab(signal);
|
||||
}//Dblqh::copyLqhKeyRefLab()
|
||||
|
||||
void Dblqh::closeCopyLab(Signal* signal)
|
||||
|
|
@ -9727,6 +9739,7 @@ void Dblqh::closeCopyLab(Signal* signal)
|
|||
// Wait until all of those have arrived until we start the
|
||||
// close process.
|
||||
/*---------------------------------------------------------------------------*/
|
||||
scanptr.p->scanState = ScanRecord::WAIT_LQHKEY_COPY;
|
||||
jam();
|
||||
return;
|
||||
}//if
|
||||
|
|
|
|||
|
|
@ -212,6 +212,30 @@ void Dbtup::execTUP_ALLOCREQ(Signal* signal)
|
|||
//---------------------------------------------------
|
||||
PagePtr pagePtr;
|
||||
Uint32 pageOffset;
|
||||
|
||||
if (ERROR_INSERTED(4025))
|
||||
{
|
||||
signal->theData[0] = 827;
|
||||
return;
|
||||
}
|
||||
if (ERROR_INSERTED(4026))
|
||||
{
|
||||
CLEAR_ERROR_INSERT_VALUE;
|
||||
signal->theData[0] = 827;
|
||||
return;
|
||||
}
|
||||
if (ERROR_INSERTED(4027) && (rand() % 100) > 25)
|
||||
{
|
||||
signal->theData[0] = 827;
|
||||
return;
|
||||
}
|
||||
if (ERROR_INSERTED(4028) && (rand() % 100) > 25)
|
||||
{
|
||||
CLEAR_ERROR_INSERT_VALUE;
|
||||
signal->theData[0] = 827;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!allocTh(regFragPtr.p,
|
||||
regTabPtr.p,
|
||||
NORMAL_PAGE,
|
||||
|
|
|
|||
|
|
@ -65,6 +65,7 @@ void Dbtup::initData()
|
|||
undoPage = 0;
|
||||
totNoOfPagesAllocated = 0;
|
||||
cnoOfAllocatedPages = 0;
|
||||
CLEAR_ERROR_INSERT_VALUE;
|
||||
|
||||
// Records with constant sizes
|
||||
}//Dbtup::initData()
|
||||
|
|
@ -568,7 +569,6 @@ void Dbtup::execSTTOR(Signal* signal)
|
|||
switch (startPhase) {
|
||||
case ZSTARTPHASE1:
|
||||
ljam();
|
||||
CLEAR_ERROR_INSERT_VALUE;
|
||||
cownref = calcTupBlockRef(0);
|
||||
break;
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -179,6 +179,7 @@ void Ndbcntr::execSYSTEM_ERROR(Signal* signal)
|
|||
break;
|
||||
|
||||
case SystemError::CopyFragRefError:
|
||||
CRASH_INSERTION(1000);
|
||||
BaseString::snprintf(buf, sizeof(buf),
|
||||
"Killed by node %d as "
|
||||
"copyfrag failed, error: %u",
|
||||
|
|
|
|||
|
|
@ -565,7 +565,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
|||
true,
|
||||
ConfigInfo::CI_INT,
|
||||
"0",
|
||||
"1",
|
||||
"0",
|
||||
"2" },
|
||||
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2494,6 +2494,8 @@ MgmtSrvr::startBackup(Uint32& backupId, int waitCompleted)
|
|||
ndbout_c("I'm not master resending to %d", nodeId);
|
||||
#endif
|
||||
do_send = 1; // try again
|
||||
if (!theFacade->get_node_alive(nodeId))
|
||||
m_master_node = nodeId = 0;
|
||||
continue;
|
||||
}
|
||||
event.Event = BackupEvent::BackupFailedToStart;
|
||||
|
|
|
|||
|
|
@ -1124,6 +1124,101 @@ runBug26481(NDBT_Context* ctx, NDBT_Step* step)
|
|||
return NDBT_OK;
|
||||
}
|
||||
|
||||
int
|
||||
runBug27003(NDBT_Context* ctx, NDBT_Step* step)
|
||||
{
|
||||
int result = NDBT_OK;
|
||||
int loops = ctx->getNumLoops();
|
||||
int records = ctx->getNumRecords();
|
||||
NdbRestarter res;
|
||||
|
||||
static const int errnos[] = { 4025, 4026, 4027, 4028, 0 };
|
||||
|
||||
int node = res.getRandomNotMasterNodeId(rand());
|
||||
ndbout_c("node: %d", node);
|
||||
if (res.restartOneDbNode(node, false, true, true))
|
||||
return NDBT_FAILED;
|
||||
|
||||
Uint32 pos = 0;
|
||||
for (Uint32 i = 0; i<loops; i++)
|
||||
{
|
||||
while (errnos[pos] != 0)
|
||||
{
|
||||
ndbout_c("Tesing err: %d", errnos[pos]);
|
||||
|
||||
if (res.waitNodesNoStart(&node, 1))
|
||||
return NDBT_FAILED;
|
||||
|
||||
if (res.insertErrorInNode(node, 1000))
|
||||
return NDBT_FAILED;
|
||||
|
||||
if (res.insertErrorInNode(node, errnos[pos]))
|
||||
return NDBT_FAILED;
|
||||
|
||||
int val2[] = { DumpStateOrd::CmvmiSetRestartOnErrorInsert, 1 };
|
||||
if (res.dumpStateOneNode(node, val2, 2))
|
||||
return NDBT_FAILED;
|
||||
|
||||
res.startNodes(&node, 1);
|
||||
res.waitNodesStartPhase(&node, 1, 2);
|
||||
pos++;
|
||||
}
|
||||
pos = 0;
|
||||
}
|
||||
|
||||
if (res.waitNodesNoStart(&node, 1))
|
||||
return NDBT_FAILED;
|
||||
|
||||
res.startNodes(&node, 1);
|
||||
if (res.waitClusterStarted())
|
||||
return NDBT_FAILED;
|
||||
|
||||
return NDBT_OK;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
runBug27283(NDBT_Context* ctx, NDBT_Step* step)
|
||||
{
|
||||
int result = NDBT_OK;
|
||||
int loops = ctx->getNumLoops();
|
||||
int records = ctx->getNumRecords();
|
||||
NdbRestarter res;
|
||||
|
||||
if (res.getNumDbNodes() < 2)
|
||||
{
|
||||
return NDBT_OK;
|
||||
}
|
||||
|
||||
static const int errnos[] = { 7181, 7182, 0 };
|
||||
|
||||
Uint32 pos = 0;
|
||||
for (Uint32 i = 0; i<loops; i++)
|
||||
{
|
||||
while (errnos[pos] != 0)
|
||||
{
|
||||
int master = res.getMasterNodeId();
|
||||
int next = res.getNextMasterNodeId(master);
|
||||
int next2 = res.getNextMasterNodeId(next);
|
||||
|
||||
int node = (i & 1) ? next : next2;
|
||||
ndbout_c("Tesing err: %d", errnos[pos]);
|
||||
if (res.insertErrorInNode(next, errnos[pos]))
|
||||
return NDBT_FAILED;
|
||||
|
||||
NdbSleep_SecSleep(3);
|
||||
|
||||
if (res.waitClusterStarted())
|
||||
return NDBT_FAILED;
|
||||
|
||||
pos++;
|
||||
}
|
||||
pos = 0;
|
||||
}
|
||||
|
||||
return NDBT_OK;
|
||||
}
|
||||
|
||||
NDBT_TESTSUITE(testNodeRestart);
|
||||
TESTCASE("NoLoad",
|
||||
"Test that one node at a time can be stopped and then restarted "\
|
||||
|
|
@ -1451,6 +1546,12 @@ TESTCASE("Bug26457", ""){
|
|||
TESTCASE("Bug26481", ""){
|
||||
INITIALIZER(runBug26481);
|
||||
}
|
||||
TESTCASE("Bug27003", ""){
|
||||
INITIALIZER(runBug27003);
|
||||
}
|
||||
TESTCASE("Bug27283", ""){
|
||||
INITIALIZER(runBug27283);
|
||||
}
|
||||
NDBT_TESTSUITE_END(testNodeRestart);
|
||||
|
||||
int main(int argc, const char** argv){
|
||||
|
|
|
|||
|
|
@ -425,6 +425,14 @@ max-time: 500
|
|||
cmd: testScan
|
||||
args: -n Bug24447 T1
|
||||
|
||||
max-time: 1000
|
||||
cmd: testNodeRestart
|
||||
args: -n Bug27003 T1
|
||||
|
||||
max-time: 1000
|
||||
cmd: testNodeRestart
|
||||
args: -n Bug27283 T1
|
||||
|
||||
max-time: 500
|
||||
cmd: testNodeRestart
|
||||
args: -n Bug15587 T1
|
||||
|
|
|
|||
|
|
@ -1381,6 +1381,7 @@ UtilTransactions::compare(Ndb* pNdb, const char* tab_name2, int flags){
|
|||
goto error;
|
||||
}
|
||||
|
||||
row_count= 0;
|
||||
{
|
||||
int eof;
|
||||
while((eof = pOp->nextResult(true)) == 0)
|
||||
|
|
|
|||
|
|
@ -952,7 +952,7 @@ int ha_ndbcluster::get_metadata(const char *path)
|
|||
DBUG_PRINT("enter", ("m_tabname: %s, path: %s", m_tabname, path));
|
||||
|
||||
do {
|
||||
const void *data, *pack_data;
|
||||
const void *data= NULL, *pack_data= NULL;
|
||||
uint length, pack_length;
|
||||
|
||||
if (!(tab= dict->getTable(m_tabname)))
|
||||
|
|
@ -3751,7 +3751,7 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type)
|
|||
if ((my_errno= build_index_list(ndb, table, ILBP_OPEN)))
|
||||
DBUG_RETURN(my_errno);
|
||||
|
||||
const void *data, *pack_data;
|
||||
const void *data= NULL, *pack_data= NULL;
|
||||
uint length, pack_length;
|
||||
if (readfrm(table->s->path, &data, &length) ||
|
||||
packfrm(data, length, &pack_data, &pack_length) ||
|
||||
|
|
@ -4340,7 +4340,7 @@ int ha_ndbcluster::create(const char *name,
|
|||
NDBTAB tab;
|
||||
NDBCOL col;
|
||||
uint pack_length, length, i, pk_length= 0;
|
||||
const void *data, *pack_data;
|
||||
const void *data= NULL, *pack_data= NULL;
|
||||
char name2[FN_HEADLEN];
|
||||
bool create_from_engine= (create_info->table_options & HA_OPTION_CREATE_FROM_ENGINE);
|
||||
|
||||
|
|
@ -4375,8 +4375,11 @@ int ha_ndbcluster::create(const char *name,
|
|||
if (readfrm(name, &data, &length))
|
||||
DBUG_RETURN(1);
|
||||
if (packfrm(data, length, &pack_data, &pack_length))
|
||||
{
|
||||
my_free((char*)data, MYF(0));
|
||||
DBUG_RETURN(2);
|
||||
|
||||
}
|
||||
|
||||
DBUG_PRINT("info", ("setFrm data: 0x%lx len: %d", (long) pack_data, pack_length));
|
||||
tab.setFrm(pack_data, pack_length);
|
||||
my_free((char*)data, MYF(0));
|
||||
|
|
|
|||
|
|
@ -1238,19 +1238,19 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
|
|||
if (table->next_number_field)
|
||||
table->file->adjust_next_insert_id_after_explicit_value(
|
||||
table->next_number_field->val_int());
|
||||
|
||||
info->touched++;
|
||||
|
||||
if ((table->file->table_flags() & HA_PARTIAL_COLUMN_READ) ||
|
||||
compare_record(table, thd->query_id))
|
||||
{
|
||||
info->updated++;
|
||||
trg_error= (table->triggers &&
|
||||
table->triggers->process_triggers(thd, TRG_EVENT_UPDATE,
|
||||
TRG_ACTION_AFTER,
|
||||
TRUE));
|
||||
info->copied++;
|
||||
}
|
||||
|
||||
trg_error= (table->triggers &&
|
||||
table->triggers->process_triggers(thd, TRG_EVENT_UPDATE,
|
||||
TRG_ACTION_AFTER,
|
||||
TRUE));
|
||||
goto ok_or_after_trg_err;
|
||||
}
|
||||
else /* DUP_REPLACE */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue