mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 19:11:46 +01:00
Merge lzhou@bk-internal.mysql.com:/home/bk/mysql-5.1-new-ndb-bj
into dev3-63.(none):/home/zhl/mysql/mysql-5.1/bug29186
This commit is contained in:
commit
2310bf1c98
7 changed files with 217 additions and 1 deletions
|
@ -163,7 +163,8 @@ struct CreateFileImplRef {
|
||||||
InvalidFileMetadata = 1510,
|
InvalidFileMetadata = 1510,
|
||||||
OutOfMemory = 1511,
|
OutOfMemory = 1511,
|
||||||
FileReadError = 1512,
|
FileReadError = 1512,
|
||||||
FilegroupNotOnline = 1513
|
FilegroupNotOnline = 1513,
|
||||||
|
FileSizeTooLarge = 1515
|
||||||
};
|
};
|
||||||
|
|
||||||
Uint32 senderData;
|
Uint32 senderData;
|
||||||
|
|
|
@ -12,6 +12,8 @@ Next BACKUP 10038
|
||||||
Next DBUTIL 11002
|
Next DBUTIL 11002
|
||||||
Next DBTUX 12008
|
Next DBTUX 12008
|
||||||
Next SUMA 13001
|
Next SUMA 13001
|
||||||
|
Next LGMAN 15001
|
||||||
|
Next TSMAN 16001
|
||||||
|
|
||||||
TESTING NODE FAILURE, ARBITRATION
|
TESTING NODE FAILURE, ARBITRATION
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
@ -535,3 +537,11 @@ NDBCNTR:
|
||||||
|
|
||||||
1000: Crash insertion on SystemError::CopyFragRef
|
1000: Crash insertion on SystemError::CopyFragRef
|
||||||
1001: Delay sending NODE_FAILREP (to own node), until error is cleared
|
1001: Delay sending NODE_FAILREP (to own node), until error is cleared
|
||||||
|
|
||||||
|
LGMAN:
|
||||||
|
-----
|
||||||
|
15000: Fail to create log file
|
||||||
|
|
||||||
|
TSMAN:
|
||||||
|
-----
|
||||||
|
16000: Fail to create data file
|
||||||
|
|
|
@ -8286,6 +8286,12 @@ void Dbdih::execDIHNDBTAMPER(Signal* signal)
|
||||||
} else if (tuserpointer < 15000) {
|
} else if (tuserpointer < 15000) {
|
||||||
jam();
|
jam();
|
||||||
tuserblockref = DBDICT_REF;
|
tuserblockref = DBDICT_REF;
|
||||||
|
} else if (tuserpointer < 16000) {
|
||||||
|
jam();
|
||||||
|
tuserblockref = LGMAN_REF;
|
||||||
|
} else if (tuserpointer < 17000) {
|
||||||
|
jam();
|
||||||
|
tuserblockref = TSMAN_REF;
|
||||||
} else if (tuserpointer < 30000) {
|
} else if (tuserpointer < 30000) {
|
||||||
/*--------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------*/
|
||||||
// Ignore errors in the 20000-range.
|
// Ignore errors in the 20000-range.
|
||||||
|
|
|
@ -547,6 +547,22 @@ Lgman::execCREATE_FILE_REQ(Signal* signal)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(ERROR_INSERTED(15000) ||
|
||||||
|
(sizeof(void*) == 4 && req->file_size_hi & 0xFFFFFFFF))
|
||||||
|
{
|
||||||
|
jam();
|
||||||
|
if(signal->getNoOfSections())
|
||||||
|
releaseSections(signal);
|
||||||
|
|
||||||
|
CreateFileImplRef* ref= (CreateFileImplRef*)signal->getDataPtr();
|
||||||
|
ref->senderData = senderData;
|
||||||
|
ref->senderRef = reference();
|
||||||
|
ref->errorCode = CreateFileImplRef::FileSizeTooLarge;
|
||||||
|
sendSignal(senderRef, GSN_CREATE_FILE_REF, signal,
|
||||||
|
CreateFileImplRef::SignalLength, JBB);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
new (file_ptr.p) Undofile(req, ptr.i);
|
new (file_ptr.p) Undofile(req, ptr.i);
|
||||||
|
|
||||||
Local_undofile_list tmp(m_file_pool, ptr.p->m_meta_files);
|
Local_undofile_list tmp(m_file_pool, ptr.p->m_meta_files);
|
||||||
|
|
|
@ -523,6 +523,22 @@ Tsman::execCREATE_FILE_REQ(Signal* signal){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(ERROR_INSERTED(16000) ||
|
||||||
|
(sizeof(void*) == 4 && req->file_size_hi & 0xFFFFFFFF))
|
||||||
|
{
|
||||||
|
jam();
|
||||||
|
if(signal->getNoOfSections())
|
||||||
|
releaseSections(signal);
|
||||||
|
|
||||||
|
CreateFileImplRef* ref= (CreateFileImplRef*)signal->getDataPtr();
|
||||||
|
ref->senderData = senderData;
|
||||||
|
ref->senderRef = reference();
|
||||||
|
ref->errorCode = CreateFileImplRef::FileSizeTooLarge;
|
||||||
|
sendSignal(senderRef, GSN_CREATE_FILE_REF, signal,
|
||||||
|
CreateFileImplRef::SignalLength, JBB);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
new (file_ptr.p) Datafile(req);
|
new (file_ptr.p) Datafile(req);
|
||||||
Local_datafile_list tmp(m_file_pool, ptr.p->m_meta_files);
|
Local_datafile_list tmp(m_file_pool, ptr.p->m_meta_files);
|
||||||
tmp.add(file_ptr);
|
tmp.add(file_ptr);
|
||||||
|
|
|
@ -426,6 +426,7 @@ ErrorBundle ErrorCodes[] = {
|
||||||
{ 1512, DMEC, SE, "File read error" },
|
{ 1512, DMEC, SE, "File read error" },
|
||||||
{ 1513, DMEC, IE, "Filegroup not online" },
|
{ 1513, DMEC, IE, "Filegroup not online" },
|
||||||
{ 1514, DMEC, SE, "Currently there is a limit of one logfile group" },
|
{ 1514, DMEC, SE, "Currently there is a limit of one logfile group" },
|
||||||
|
{ 1515, DMEC, SE, "Currently there is a 4G limit of one undo/data-file in 32-bit host" },
|
||||||
|
|
||||||
{ 773, DMEC, SE, "Out of string memory, please modify StringMemory config parameter" },
|
{ 773, DMEC, SE, "Out of string memory, please modify StringMemory config parameter" },
|
||||||
{ 775, DMEC, SE, "Create file is not supported when Diskless=1" },
|
{ 775, DMEC, SE, "Create file is not supported when Diskless=1" },
|
||||||
|
|
|
@ -2357,6 +2357,168 @@ runBug24631(NDBT_Context* ctx, NDBT_Step* step)
|
||||||
return NDBT_OK;
|
return NDBT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
runBug29186(NDBT_Context* ctx, NDBT_Step* step)
|
||||||
|
{
|
||||||
|
int lgError = 15000;
|
||||||
|
int tsError = 16000;
|
||||||
|
int res;
|
||||||
|
char lgname[256];
|
||||||
|
char ufname[256];
|
||||||
|
char tsname[256];
|
||||||
|
char dfname[256];
|
||||||
|
|
||||||
|
NdbRestarter restarter;
|
||||||
|
|
||||||
|
if (restarter.getNumDbNodes() < 2){
|
||||||
|
ctx->stopTest();
|
||||||
|
return NDBT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ndb* pNdb = GETNDB(step);
|
||||||
|
NdbDictionary::Dictionary* pDict = pNdb->getDictionary();
|
||||||
|
NdbDictionary::Dictionary::List list;
|
||||||
|
|
||||||
|
if (pDict->listObjects(list) == -1)
|
||||||
|
return NDBT_FAILED;
|
||||||
|
|
||||||
|
// 1.create logfile group
|
||||||
|
const char * lgfound = 0;
|
||||||
|
|
||||||
|
for (Uint32 i = 0; i<list.count; i++)
|
||||||
|
{
|
||||||
|
switch(list.elements[i].type){
|
||||||
|
case NdbDictionary::Object::LogfileGroup:
|
||||||
|
lgfound = list.elements[i].name;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (lgfound)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lgfound == 0)
|
||||||
|
{
|
||||||
|
BaseString::snprintf(lgname, sizeof(lgname), "LG-%u", rand());
|
||||||
|
NdbDictionary::LogfileGroup lg;
|
||||||
|
|
||||||
|
lg.setName(lgname);
|
||||||
|
lg.setUndoBufferSize(8*1024*1024);
|
||||||
|
if(pDict->createLogfileGroup(lg) != 0)
|
||||||
|
{
|
||||||
|
g_err << "Failed to create logfilegroup:"
|
||||||
|
<< endl << pDict->getNdbError() << endl;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BaseString::snprintf(lgname, sizeof(lgname), "%s", lgfound);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(restarter.waitClusterStarted(60)){
|
||||||
|
g_err << "waitClusterStarted failed"<< endl;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(restarter.insertErrorInAllNodes(lgError) != 0){
|
||||||
|
g_err << "failed to set error insert"<< endl;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_info << "error inserted" << endl;
|
||||||
|
g_info << "waiting some before add log file" << endl;
|
||||||
|
g_info << "starting create log file group" << endl;
|
||||||
|
|
||||||
|
NdbDictionary::Undofile uf;
|
||||||
|
BaseString::snprintf(ufname, sizeof(ufname), "%s-%u", lgname, rand());
|
||||||
|
uf.setPath(ufname);
|
||||||
|
uf.setSize(2*1024*1024);
|
||||||
|
uf.setLogfileGroup(lgname);
|
||||||
|
|
||||||
|
if(pDict->createUndofile(uf) == 0)
|
||||||
|
{
|
||||||
|
g_err << "Create log file group should fail on error_insertion " << lgError << endl;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
//clear lg error
|
||||||
|
if(restarter.insertErrorInAllNodes(15099) != 0){
|
||||||
|
g_err << "failed to set error insert"<< endl;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
NdbSleep_SecSleep(5);
|
||||||
|
|
||||||
|
//lg error has been cleared, so we can add undo file
|
||||||
|
if(pDict->createUndofile(uf) != 0)
|
||||||
|
{
|
||||||
|
g_err << "Failed to create undofile:"
|
||||||
|
<< endl << pDict->getNdbError() << endl;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(restarter.waitClusterStarted(60)){
|
||||||
|
g_err << "waitClusterStarted failed"<< endl;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(restarter.insertErrorInAllNodes(tsError) != 0){
|
||||||
|
g_err << "failed to set error insert"<< endl;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
g_info << "error inserted" << endl;
|
||||||
|
g_info << "waiting some before create table space" << endl;
|
||||||
|
g_info << "starting create table space" << endl;
|
||||||
|
|
||||||
|
//r = runCreateTablespace(ctx, step);
|
||||||
|
BaseString::snprintf(tsname, sizeof(tsname), "TS-%u", rand());
|
||||||
|
BaseString::snprintf(dfname, sizeof(dfname), "%s-%u-1.dat", tsname, rand());
|
||||||
|
|
||||||
|
NdbDictionary::Tablespace ts;
|
||||||
|
ts.setName(tsname);
|
||||||
|
ts.setExtentSize(1024*1024);
|
||||||
|
ts.setDefaultLogfileGroup(lgname);
|
||||||
|
|
||||||
|
if(pDict->createTablespace(ts) != 0)
|
||||||
|
{
|
||||||
|
g_err << "Failed to create tablespace:"
|
||||||
|
<< endl << pDict->getNdbError() << endl;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
NdbDictionary::Datafile df;
|
||||||
|
df.setPath(dfname);
|
||||||
|
df.setSize(1*1024*1024);
|
||||||
|
df.setTablespace(tsname);
|
||||||
|
|
||||||
|
if(pDict->createDatafile(df) == 0)
|
||||||
|
{
|
||||||
|
g_err << "Create table space should fail on error_insertion " << tsError << endl;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
//Clear the inserted error
|
||||||
|
if(restarter.insertErrorInAllNodes(16099) != 0){
|
||||||
|
g_err << "failed to set error insert"<< endl;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
NdbSleep_SecSleep(5);
|
||||||
|
|
||||||
|
if (pDict->dropTablespace(pDict->getTablespace(tsname)) != 0)
|
||||||
|
{
|
||||||
|
g_err << "Failed to drop tablespace: " << pDict->getNdbError() << endl;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lgfound == 0)
|
||||||
|
{
|
||||||
|
if (pDict->dropLogfileGroup(pDict->getLogfileGroup(lgname)) != 0)
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NDBT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
struct RandSchemaOp
|
struct RandSchemaOp
|
||||||
{
|
{
|
||||||
struct Obj
|
struct Obj
|
||||||
|
@ -2864,6 +3026,10 @@ TESTCASE("Bug24631",
|
||||||
""){
|
""){
|
||||||
INITIALIZER(runBug24631);
|
INITIALIZER(runBug24631);
|
||||||
}
|
}
|
||||||
|
TESTCASE("Bug29186",
|
||||||
|
""){
|
||||||
|
INITIALIZER(runBug29186);
|
||||||
|
}
|
||||||
NDBT_TESTSUITE_END(testDict);
|
NDBT_TESTSUITE_END(testDict);
|
||||||
|
|
||||||
int main(int argc, const char** argv){
|
int main(int argc, const char** argv){
|
||||||
|
|
Loading…
Add table
Reference in a new issue