mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
merge
ndb/include/ndbapi/Ndb.hpp: Auto merged ndb/src/ndbapi/Ndbif.cpp: Auto merged ndb/src/ndbapi/Ndbinit.cpp: Auto merged ndb/test/ndbapi/testNdbApi.cpp: Auto merged ndb/test/run-test/daily-basic-tests.txt: Auto merged sql/ha_ndbcluster.cc: Auto merged
This commit is contained in:
@ -40,3 +40,22 @@ p u o
|
|||||||
5 5 5
|
5 5 5
|
||||||
drop table t1;
|
drop table t1;
|
||||||
drop table t2;
|
drop table t2;
|
||||||
|
create table t1 (p int not null primary key, u int not null) engine=ndb;
|
||||||
|
insert into t1 values (1,1),(2,2),(3,3);
|
||||||
|
create table t2 as
|
||||||
|
select t1.*
|
||||||
|
from t1 as t1, t1 as t2, t1 as t3, t1 as t4, t1 as t5, t1 as t6, t1 as t7, t1 as t8
|
||||||
|
where t1.u = t2.u
|
||||||
|
and t2.u = t3.u
|
||||||
|
and t3.u = t4.u
|
||||||
|
and t4.u = t5.u
|
||||||
|
and t5.u = t6.u
|
||||||
|
and t6.u = t7.u
|
||||||
|
and t7.u = t8.u;
|
||||||
|
select * from t2 order by 1;
|
||||||
|
p u
|
||||||
|
1 1
|
||||||
|
2 2
|
||||||
|
3 3
|
||||||
|
drop table t1;
|
||||||
|
drop table t2;
|
||||||
|
@ -37,3 +37,26 @@ drop table t1;
|
|||||||
drop table t2;
|
drop table t2;
|
||||||
# bug#5367
|
# bug#5367
|
||||||
##########
|
##########
|
||||||
|
|
||||||
|
###
|
||||||
|
# bug#11205
|
||||||
|
create table t1 (p int not null primary key, u int not null) engine=ndb;
|
||||||
|
insert into t1 values (1,1),(2,2),(3,3);
|
||||||
|
|
||||||
|
create table t2 as
|
||||||
|
select t1.*
|
||||||
|
from t1 as t1, t1 as t2, t1 as t3, t1 as t4, t1 as t5, t1 as t6, t1 as t7, t1 as t8
|
||||||
|
where t1.u = t2.u
|
||||||
|
and t2.u = t3.u
|
||||||
|
and t3.u = t4.u
|
||||||
|
and t4.u = t5.u
|
||||||
|
and t5.u = t6.u
|
||||||
|
and t6.u = t7.u
|
||||||
|
and t7.u = t8.u;
|
||||||
|
|
||||||
|
select * from t2 order by 1;
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
drop table t2;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1614,7 +1614,7 @@ private:
|
|||||||
Uint32 theNoOfPreparedTransactions;
|
Uint32 theNoOfPreparedTransactions;
|
||||||
Uint32 theNoOfSentTransactions;
|
Uint32 theNoOfSentTransactions;
|
||||||
Uint32 theNoOfCompletedTransactions;
|
Uint32 theNoOfCompletedTransactions;
|
||||||
Uint32 theNoOfAllocatedTransactions;
|
Uint32 theRemainingStartTransactions;
|
||||||
Uint32 theMaxNoOfTransactions;
|
Uint32 theMaxNoOfTransactions;
|
||||||
Uint32 theMinNoOfEventsToWakeUp;
|
Uint32 theMinNoOfEventsToWakeUp;
|
||||||
|
|
||||||
|
@ -425,12 +425,20 @@ Ndb::startTransactionLocal(Uint32 aPriority, Uint32 nodeId)
|
|||||||
DBUG_ENTER("Ndb::startTransactionLocal");
|
DBUG_ENTER("Ndb::startTransactionLocal");
|
||||||
DBUG_PRINT("enter", ("nodeid: %d", nodeId));
|
DBUG_PRINT("enter", ("nodeid: %d", nodeId));
|
||||||
|
|
||||||
|
if(unlikely(theRemainingStartTransactions == 0))
|
||||||
|
{
|
||||||
|
theError.code = 4006;
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
|
||||||
NdbTransaction* tConnection;
|
NdbTransaction* tConnection;
|
||||||
Uint64 tFirstTransId = theFirstTransId;
|
Uint64 tFirstTransId = theFirstTransId;
|
||||||
tConnection = doConnect(nodeId);
|
tConnection = doConnect(nodeId);
|
||||||
if (tConnection == NULL) {
|
if (tConnection == NULL) {
|
||||||
DBUG_RETURN(NULL);
|
DBUG_RETURN(NULL);
|
||||||
}//if
|
}//if
|
||||||
|
|
||||||
|
theRemainingStartTransactions--;
|
||||||
NdbTransaction* tConNext = theTransactionList;
|
NdbTransaction* tConNext = theTransactionList;
|
||||||
tConnection->init();
|
tConnection->init();
|
||||||
theTransactionList = tConnection; // into a transaction list.
|
theTransactionList = tConnection; // into a transaction list.
|
||||||
@ -481,6 +489,7 @@ Ndb::closeTransaction(NdbTransaction* aConnection)
|
|||||||
CHECK_STATUS_MACRO_VOID;
|
CHECK_STATUS_MACRO_VOID;
|
||||||
|
|
||||||
tCon = theTransactionList;
|
tCon = theTransactionList;
|
||||||
|
theRemainingStartTransactions++;
|
||||||
|
|
||||||
DBUG_PRINT("info",("close trans: 0x%x transid: 0x%llx",
|
DBUG_PRINT("info",("close trans: 0x%x transid: 0x%llx",
|
||||||
aConnection, aConnection->getTransactionId()));
|
aConnection, aConnection->getTransactionId()));
|
||||||
|
@ -89,15 +89,18 @@ int
|
|||||||
NdbScanOperation::init(const NdbTableImpl* tab, NdbTransaction* myConnection)
|
NdbScanOperation::init(const NdbTableImpl* tab, NdbTransaction* myConnection)
|
||||||
{
|
{
|
||||||
m_transConnection = myConnection;
|
m_transConnection = myConnection;
|
||||||
//NdbTransaction* aScanConnection = theNdb->startTransaction(myConnection);
|
//NdbConnection* aScanConnection = theNdb->startTransaction(myConnection);
|
||||||
|
theNdb->theRemainingStartTransactions++; // will be checked in hupp...
|
||||||
NdbTransaction* aScanConnection = theNdb->hupp(myConnection);
|
NdbTransaction* aScanConnection = theNdb->hupp(myConnection);
|
||||||
if (!aScanConnection){
|
if (!aScanConnection){
|
||||||
|
theNdb->theRemainingStartTransactions--;
|
||||||
setErrorCodeAbort(theNdb->getNdbError().code);
|
setErrorCodeAbort(theNdb->getNdbError().code);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE! The hupped trans becomes the owner of the operation
|
// NOTE! The hupped trans becomes the owner of the operation
|
||||||
if(NdbOperation::init(tab, aScanConnection) != 0){
|
if(NdbOperation::init(tab, aScanConnection) != 0){
|
||||||
|
theNdb->theRemainingStartTransactions--;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -675,6 +678,7 @@ void NdbScanOperation::close(bool forceSend, bool releaseOp)
|
|||||||
|
|
||||||
tCon->theScanningOp = 0;
|
tCon->theScanningOp = 0;
|
||||||
theNdb->closeTransaction(tCon);
|
theNdb->closeTransaction(tCon);
|
||||||
|
theNdb->theRemainingStartTransactions--;
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,12 +107,10 @@ Ndb::init(int aMaxNoOfTransactions)
|
|||||||
goto error_handler;
|
goto error_handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
tMaxNoOfTransactions = aMaxNoOfTransactions * 3;
|
|
||||||
if (tMaxNoOfTransactions > 1024) {
|
|
||||||
tMaxNoOfTransactions = 1024;
|
|
||||||
}//if
|
|
||||||
theMaxNoOfTransactions = tMaxNoOfTransactions;
|
|
||||||
|
|
||||||
|
tMaxNoOfTransactions = aMaxNoOfTransactions;
|
||||||
|
theMaxNoOfTransactions = tMaxNoOfTransactions;
|
||||||
|
theRemainingStartTransactions= tMaxNoOfTransactions;
|
||||||
thePreparedTransactionsArray = new NdbTransaction* [tMaxNoOfTransactions];
|
thePreparedTransactionsArray = new NdbTransaction* [tMaxNoOfTransactions];
|
||||||
theSentTransactionsArray = new NdbTransaction* [tMaxNoOfTransactions];
|
theSentTransactionsArray = new NdbTransaction* [tMaxNoOfTransactions];
|
||||||
theCompletedTransactionsArray = new NdbTransaction* [tMaxNoOfTransactions];
|
theCompletedTransactionsArray = new NdbTransaction* [tMaxNoOfTransactions];
|
||||||
|
@ -59,7 +59,7 @@ void Ndb::setup(Ndb_cluster_connection *ndb_cluster_connection,
|
|||||||
theNoOfPreparedTransactions= 0;
|
theNoOfPreparedTransactions= 0;
|
||||||
theNoOfSentTransactions= 0;
|
theNoOfSentTransactions= 0;
|
||||||
theNoOfCompletedTransactions= 0;
|
theNoOfCompletedTransactions= 0;
|
||||||
theNoOfAllocatedTransactions= 0;
|
theRemainingStartTransactions= 0;
|
||||||
theMaxNoOfTransactions= 0;
|
theMaxNoOfTransactions= 0;
|
||||||
theMinNoOfEventsToWakeUp= 0;
|
theMinNoOfEventsToWakeUp= 0;
|
||||||
theConIdleList= NULL;
|
theConIdleList= NULL;
|
||||||
|
@ -93,7 +93,6 @@ Ndb::createConIdleList(int aNrOfCon)
|
|||||||
}
|
}
|
||||||
tNdbCon->Status(NdbTransaction::NotConnected);
|
tNdbCon->Status(NdbTransaction::NotConnected);
|
||||||
}
|
}
|
||||||
theNoOfAllocatedTransactions = aNrOfCon;
|
|
||||||
return aNrOfCon;
|
return aNrOfCon;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,14 +192,8 @@ Ndb::getNdbCon()
|
|||||||
{
|
{
|
||||||
NdbTransaction* tNdbCon;
|
NdbTransaction* tNdbCon;
|
||||||
if ( theConIdleList == NULL ) {
|
if ( theConIdleList == NULL ) {
|
||||||
if (theNoOfAllocatedTransactions < theMaxNoOfTransactions) {
|
tNdbCon = new NdbTransaction(this);
|
||||||
tNdbCon = new NdbTransaction(this);
|
if (tNdbCon == NULL) {
|
||||||
if (tNdbCon == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}//if
|
|
||||||
theNoOfAllocatedTransactions++;
|
|
||||||
} else {
|
|
||||||
ndbout << "theNoOfAllocatedTransactions = " << theNoOfAllocatedTransactions << " theMaxNoOfTransactions = " << theMaxNoOfTransactions << endl;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}//if
|
}//if
|
||||||
tNdbCon->next(NULL);
|
tNdbCon->next(NULL);
|
||||||
|
@ -1269,6 +1269,102 @@ int runBug_11133(NDBT_Context* ctx, NDBT_Step* step){
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int runScan_4006(NDBT_Context* ctx, NDBT_Step* step){
|
||||||
|
int result = NDBT_OK;
|
||||||
|
const Uint32 max= 5;
|
||||||
|
const NdbDictionary::Table* pTab = ctx->getTab();
|
||||||
|
|
||||||
|
Ndb* pNdb = new Ndb("TEST_DB");
|
||||||
|
if (pNdb == NULL){
|
||||||
|
ndbout << "pNdb == NULL" << endl;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
if (pNdb->init(max)){
|
||||||
|
ERR(pNdb->getNdbError());
|
||||||
|
delete pNdb;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
NdbConnection* pCon = pNdb->startTransaction();
|
||||||
|
if (pCon == NULL){
|
||||||
|
pNdb->closeTransaction(pCon);
|
||||||
|
delete pNdb;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint32 i;
|
||||||
|
Vector<NdbResultSet*> scans;
|
||||||
|
for(i = 0; i<10*max; i++)
|
||||||
|
{
|
||||||
|
NdbScanOperation* pOp = pCon->getNdbScanOperation(pTab->getName());
|
||||||
|
if (pOp == NULL){
|
||||||
|
ERR(pCon->getNdbError());
|
||||||
|
pNdb->closeTransaction(pCon);
|
||||||
|
delete pNdb;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
NdbResultSet* rs;
|
||||||
|
if ((rs= pOp->readTuples()) == 0){
|
||||||
|
pNdb->closeTransaction(pCon);
|
||||||
|
ERR(pOp->getNdbError());
|
||||||
|
delete pNdb;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
scans.push_back(rs);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dont' call any equal or setValues
|
||||||
|
|
||||||
|
// Execute should not work
|
||||||
|
int check = pCon->execute(NoCommit);
|
||||||
|
if (check == 0){
|
||||||
|
ndbout << "execute worked" << endl;
|
||||||
|
} else {
|
||||||
|
ERR(pCon->getNdbError());
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i= 0; i<scans.size(); i++)
|
||||||
|
{
|
||||||
|
NdbResultSet* pOp= scans[i];
|
||||||
|
while((check= pOp->nextResult()) == 0);
|
||||||
|
if(check != 1)
|
||||||
|
{
|
||||||
|
ERR(pOp->getOperation()->getNdbError());
|
||||||
|
pNdb->closeTransaction(pCon);
|
||||||
|
delete pNdb;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pNdb->closeTransaction(pCon);
|
||||||
|
|
||||||
|
Vector<NdbConnection*> cons;
|
||||||
|
for(i= 0; i<10*max; i++)
|
||||||
|
{
|
||||||
|
pCon= pNdb->startTransaction();
|
||||||
|
if(pCon)
|
||||||
|
cons.push_back(pCon);
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i= 0; i<cons.size(); i++)
|
||||||
|
{
|
||||||
|
cons[i]->close();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cons.size() != max)
|
||||||
|
{
|
||||||
|
result= NDBT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete pNdb;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
template class Vector<NdbResultSet*>;
|
||||||
|
|
||||||
|
|
||||||
NDBT_TESTSUITE(testNdbApi);
|
NDBT_TESTSUITE(testNdbApi);
|
||||||
@ -1351,6 +1447,12 @@ TESTCASE("Bug_11133",
|
|||||||
INITIALIZER(runBug_11133);
|
INITIALIZER(runBug_11133);
|
||||||
FINALIZER(runClearTable);
|
FINALIZER(runClearTable);
|
||||||
}
|
}
|
||||||
|
TESTCASE("Scan_4006",
|
||||||
|
"Check that getNdbScanOperation does not get 4006\n"){
|
||||||
|
INITIALIZER(runLoadTable);
|
||||||
|
INITIALIZER(runScan_4006);
|
||||||
|
FINALIZER(runClearTable);
|
||||||
|
}
|
||||||
NDBT_TESTSUITE_END(testNdbApi);
|
NDBT_TESTSUITE_END(testNdbApi);
|
||||||
|
|
||||||
int main(int argc, const char** argv){
|
int main(int argc, const char** argv){
|
||||||
|
@ -520,6 +520,10 @@ max-time: 500
|
|||||||
cmd: testNdbApi
|
cmd: testNdbApi
|
||||||
args: -n Bug_11133 T1
|
args: -n Bug_11133 T1
|
||||||
|
|
||||||
|
max-time: 500
|
||||||
|
cmd: testNdbApi
|
||||||
|
args: -n Scan_4006 T1
|
||||||
|
|
||||||
#max-time: 500
|
#max-time: 500
|
||||||
#cmd: testInterpreter
|
#cmd: testInterpreter
|
||||||
#args: T1
|
#args: T1
|
||||||
|
@ -13,7 +13,7 @@ save_args=$*
|
|||||||
VERSION="ndb-autotest.sh version 1.04"
|
VERSION="ndb-autotest.sh version 1.04"
|
||||||
|
|
||||||
DATE=`date '+%Y-%m-%d'`
|
DATE=`date '+%Y-%m-%d'`
|
||||||
HOST=`hostname -s`
|
HOST=`hostname`
|
||||||
export DATE HOST
|
export DATE HOST
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
@ -330,7 +330,10 @@ start(){
|
|||||||
tar cfz /tmp/res.$2.$$.tgz `basename $p2`/$DATE
|
tar cfz /tmp/res.$2.$$.tgz `basename $p2`/$DATE
|
||||||
scp /tmp/res.$2.$$.tgz \
|
scp /tmp/res.$2.$$.tgz \
|
||||||
$result_host:$result_path/res.$DATE.$HOST.$2.$$.tgz
|
$result_host:$result_path/res.$DATE.$HOST.$2.$$.tgz
|
||||||
rm -f /tmp/res.$2.$$.tgz
|
if [ $? -eq 0 ]
|
||||||
|
then
|
||||||
|
rm -f /tmp/res.$2.$$.tgz
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ static const int parallelism= 0;
|
|||||||
|
|
||||||
// Default value for max number of transactions
|
// Default value for max number of transactions
|
||||||
// createable against NDB from this handler
|
// createable against NDB from this handler
|
||||||
static const int max_transactions= 256;
|
static const int max_transactions= 2;
|
||||||
|
|
||||||
static const char *ha_ndb_ext=".ndb";
|
static const char *ha_ndb_ext=".ndb";
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user