Commit 477f1e2f authored by unknown's avatar unknown

Merge joreland@bk-internal.mysql.com:/home/bk/mysql-5.0

into mysql.com:/home/jonas/src/mysql-5.0

parents b85705cc a2037c67
...@@ -40,3 +40,22 @@ p u o ...@@ -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; ...@@ -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: ...@@ -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;
......
...@@ -352,11 +352,11 @@ Logger::log(LoggerLevel logLevel, const char* pMsg, va_list ap) const ...@@ -352,11 +352,11 @@ Logger::log(LoggerLevel logLevel, const char* pMsg, va_list ap) const
{ {
if (m_logLevels[LL_ON] && m_logLevels[logLevel]) if (m_logLevels[LL_ON] && m_logLevels[logLevel])
{ {
char buf[MAX_LOG_MESSAGE_SIZE];
BaseString::vsnprintf(buf, sizeof(buf), pMsg, ap);
LogHandler* pHandler = NULL; LogHandler* pHandler = NULL;
while ( (pHandler = m_pHandlerList->next()) != NULL) while ( (pHandler = m_pHandlerList->next()) != NULL)
{ {
char buf[MAX_LOG_MESSAGE_SIZE];
BaseString::vsnprintf(buf, sizeof(buf), pMsg, ap);
pHandler->append(m_pCategory, logLevel, buf); pHandler->append(m_pCategory, logLevel, buf);
} }
} }
......
...@@ -32,10 +32,9 @@ ...@@ -32,10 +32,9 @@
#include "common.hpp" #include "common.hpp"
static const char *work_dir = CPCD_DEFAULT_WORK_DIR; static const char *work_dir = CPCD_DEFAULT_WORK_DIR;
static short unsigned int port; static int unsigned port;
static int use_syslog; static int use_syslog;
static const char *logfile = NULL; static const char *logfile = NULL;
static const char *config_file = CPCD_DEFAULT_CONFIG_FILE;
static const char *user = 0; static const char *user = 0;
static struct my_option my_long_options[] = static struct my_option my_long_options[] =
...@@ -55,9 +54,6 @@ static struct my_option my_long_options[] = ...@@ -55,9 +54,6 @@ static struct my_option my_long_options[] =
{ "debug", 'D', "Enable debug mode", { "debug", 'D', "Enable debug mode",
(gptr*) &debug, (gptr*) &debug, 0, (gptr*) &debug, (gptr*) &debug, 0,
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 }, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
{ "config", 'c', "Config file",
(gptr*) &config_file, (gptr*) &config_file, 0,
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
{ "user", 'u', "Run as user", { "user", 'u', "Run as user",
(gptr*) &user, (gptr*) &user, 0, (gptr*) &user, (gptr*) &user, 0,
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
...@@ -142,7 +138,8 @@ int main(int argc, char** argv){ ...@@ -142,7 +138,8 @@ int main(int argc, char** argv){
SocketServer * ss = new SocketServer(); SocketServer * ss = new SocketServer();
CPCDAPIService * serv = new CPCDAPIService(cpcd); CPCDAPIService * serv = new CPCDAPIService(cpcd);
if(!ss->setup(serv, &port)){ unsigned short real_port= port; // correct type
if(!ss->setup(serv, &real_port)){
logger.critical("Cannot setup server: %s", strerror(errno)); logger.critical("Cannot setup server: %s", strerror(errno));
sleep(1); sleep(1);
delete ss; delete ss;
......
...@@ -425,12 +425,20 @@ Ndb::startTransactionLocal(Uint32 aPriority, Uint32 nodeId) ...@@ -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) ...@@ -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 ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -93,7 +93,6 @@ Ndb::createConIdleList(int aNrOfCon)
} }
tNdbCon->Status(NdbTransaction::NotConnected); tNdbCon->Status(NdbTransaction::NotConnected);
} }
theNoOfAllocatedTransactions = aNrOfCon;
return aNrOfCon; return aNrOfCon;
} }
...@@ -193,16 +192,10 @@ Ndb::getNdbCon() ...@@ -193,16 +192,10 @@ 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; return NULL;
}//if }//if
theNoOfAllocatedTransactions++;
} else {
ndbout << "theNoOfAllocatedTransactions = " << theNoOfAllocatedTransactions << " theMaxNoOfTransactions = " << theMaxNoOfTransactions << endl;
return NULL;
}//if
tNdbCon->next(NULL); tNdbCon->next(NULL);
} else } else
{ {
......
...@@ -1543,11 +1543,11 @@ testperf() ...@@ -1543,11 +1543,11 @@ testperf()
} }
if (n != 0) { if (n != 0) {
CHK(g_con->execute(Commit) == 0); CHK(g_con->execute(Commit) == 0);
g_ndb->closeTransaction(g_con); g_con = 0;
n = 0; n = 0;
} }
g_bh1 = 0; g_bh1 = 0;
g_opr = 0; g_opr = 0;
g_con = 0;
} }
// pk read char (one trans) // pk read char (one trans)
{ {
...@@ -1571,7 +1571,7 @@ testperf() ...@@ -1571,7 +1571,7 @@ testperf()
t1.off(g_opt.m_rowsperf); t1.off(g_opt.m_rowsperf);
DBG(t1.time()); DBG(t1.time());
g_opr = 0; g_opr = 0;
g_con = 0; g_ndb->closeTransaction(g_con); g_con = 0;
} }
// pk read text (one trans) // pk read text (one trans)
{ {
...@@ -1596,7 +1596,7 @@ testperf() ...@@ -1596,7 +1596,7 @@ testperf()
CHK(g_con->execute(Commit) == 0); CHK(g_con->execute(Commit) == 0);
t2.off(g_opt.m_rowsperf); t2.off(g_opt.m_rowsperf);
DBG(t2.time()); DBG(t2.time());
g_opr = 0; g_ndb->closeTransaction(g_con); g_opr = 0;
g_con = 0; g_con = 0;
} }
// pk read overhead // pk read overhead
...@@ -1629,7 +1629,7 @@ testperf() ...@@ -1629,7 +1629,7 @@ testperf()
CHK(n == g_opt.m_rowsperf); CHK(n == g_opt.m_rowsperf);
t1.off(g_opt.m_rowsperf); t1.off(g_opt.m_rowsperf);
DBG(t1.time()); DBG(t1.time());
g_ops = 0; g_ndb->closeTransaction(g_con); g_ops = 0;
g_con = 0; g_con = 0;
} }
// scan read text // scan read text
...@@ -1662,7 +1662,7 @@ testperf() ...@@ -1662,7 +1662,7 @@ testperf()
DBG(t2.time()); DBG(t2.time());
g_bh1 = 0; g_bh1 = 0;
g_ops = 0; g_ops = 0;
g_con = 0; g_ndb->closeTransaction(g_con); g_con = 0;
} }
// scan read overhead // scan read overhead
DBG("scan read overhead: " << t2.over(t1)); DBG("scan read overhead: " << t2.over(t1));
......
...@@ -1269,6 +1269,101 @@ int runBug_11133(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -1269,6 +1269,101 @@ 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(&ctx->m_cluster_connection, "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<NdbScanOperation*> 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;
}
if (pOp->readTuples() != 0){
pNdb->closeTransaction(pCon);
ERR(pOp->getNdbError());
delete pNdb;
return NDBT_FAILED;
}
scans.push_back(pOp);
}
// 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++)
{
NdbScanOperation* pOp= scans[i];
while((check= pOp->nextResult()) == 0);
if(check != 1)
{
ERR(pOp->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<NdbScanOperation*>;
NDBT_TESTSUITE(testNdbApi); NDBT_TESTSUITE(testNdbApi);
...@@ -1351,6 +1446,12 @@ TESTCASE("Bug_11133", ...@@ -1351,6 +1446,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 ...@@ -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
......
...@@ -20,40 +20,40 @@ add_procs(){ ...@@ -20,40 +20,40 @@ add_procs(){
} }
add_proc (){ add_proc (){
dir=""
conf=""
case $type in case $type in
mgm) mgm)
dir="ndb_mgmd" echo "$proc_no.ndb_mgmd" >> $dir_file
conf="[ndb_mgmd]\nId: $node_id\nHostName: $2\n" echo "[ndb_mgmd]" >> $config_file
echo "Id: $node_id" >> $config_file
echo "HostName: $2" >> $config_file
node_id=`expr $node_id + 1` node_id=`expr $node_id + 1`
;; ;;
api) api)
dir="ndb_api" echo "$proc_no.ndb_api" >> $dir_file
conf="[api]\nId: $node_id\nHostName: $2\n" echo "[api]" >> $config_file
echo "Id: $node_id" >> $config_file
echo "HostName: $2" >> $config_file
node_id=`expr $node_id + 1` node_id=`expr $node_id + 1`
;; ;;
ndb) ndb)
dir="ndbd" echo "$proc_no.ndbd" >> $dir_file
conf="[ndbd]\nId: $node_id\nHostName: $2\n" echo "[ndbd]" >> $config_file
echo "Id: $node_id" >> $config_file
echo "HostName: $2" >> $config_file
node_id=`expr $node_id + 1` node_id=`expr $node_id + 1`
;; ;;
mysqld) mysqld)
dir="mysqld" echo "$proc_no.mysqld" >> $dir_file
conf="[mysqld]\nId: $node_id\nHostName: $2\n" echo "[ndb_mgmd]" >> $config_file
echo "Id: $node_id" >> $config_file
echo "HostName: $2" >> $config_file
node_id=`expr $node_id + 1` node_id=`expr $node_id + 1`
;; ;;
mysql) mysql)
dir="mysql" echo "$proc_no.mysql" >> $dir_file
;; ;;
esac esac
dir="$proc_no.$dir"
proc_no=`expr $proc_no + 1` proc_no=`expr $proc_no + 1`
echo -e $dir >> $dir_file
if [ "$conf" ]
then
echo -e $conf >> $config_file
fi
} }
......
...@@ -66,7 +66,7 @@ done ...@@ -66,7 +66,7 @@ done
if [ -f $conf ] if [ -f $conf ]
then then
. $conf . ./$conf
else else
echo "Can't find config file: $conf" echo "Can't find config file: $conf"
exit exit
...@@ -131,8 +131,10 @@ echo "$DATE $RUN" > $LOCK ...@@ -131,8 +131,10 @@ echo "$DATE $RUN" > $LOCK
# trap them, and remove the # # trap them, and remove the #
# Lock file before exit # # Lock file before exit #
############################# #############################
if [ `uname -s` != "SunOS" ]
trap "rm -f $LOCK" ERR then
trap "rm -f $LOCK" ERR
fi
# You can add more to this path# # You can add more to this path#
################################ ################################
...@@ -191,7 +193,7 @@ then ...@@ -191,7 +193,7 @@ then
else else
echo $VERSION > /tmp/version.$$ echo $VERSION > /tmp/version.$$
fi fi
match=`grep -c "$VERSION" /tmp/version.$$` match=`grep -c "$VERSION" /tmp/version.$$ | xargs echo`
rm -f /tmp/version.$$ rm -f /tmp/version.$$
if [ $match -eq 0 ] if [ $match -eq 0 ]
then then
...@@ -229,7 +231,7 @@ filter(){ ...@@ -229,7 +231,7 @@ filter(){
shift shift
while [ $# -gt 0 ] while [ $# -gt 0 ]
do do
if [ `grep -c $1 $neg` -eq 0 ] ; then echo $1; fi if [ `grep -c $1 $neg | xargs echo` -eq 0 ] ; then echo $1; fi
shift shift
done done
} }
...@@ -294,13 +296,12 @@ choose_conf(){ ...@@ -294,13 +296,12 @@ choose_conf(){
if [ -f $test_dir/conf-$1-$HOST.txt ] if [ -f $test_dir/conf-$1-$HOST.txt ]
then then
echo "$test_dir/conf-$1-$HOST.txt" echo "$test_dir/conf-$1-$HOST.txt"
echo "$test_dir/conf-$1-$host.txt"
elif [ -f $test_dir/conf-$1.txt ] elif [ -f $test_dir/conf-$1.txt ]
then then
echo "$test_dir/conf-$1.txt" echo "$test_dir/conf-$1.txt"
else else
echo "Unable to find conf file looked for" 1>&2 echo "Unable to find conf file looked for" 1>&2
echo "$testdir/conf-$1-host.txt and" 1>&2 echo "$testdir/conf-$1-$HOST.txt and" 1>&2
echo "$testdir/conf-$1.txt" 1>&2 echo "$testdir/conf-$1.txt" 1>&2
exit exit
fi fi
...@@ -343,7 +344,7 @@ start(){ ...@@ -343,7 +344,7 @@ start(){
count_hosts(){ count_hosts(){
cnt=`grep "CHOOSE_host" $1 | awk '{for(i=1; i<=NF;i++) \ cnt=`grep "CHOOSE_host" $1 | awk '{for(i=1; i<=NF;i++) \
if(match($i, "CHOOSE_host") > 0) print $i;}' | sort | uniq | wc -l` if(index($i, "CHOOSE_host") > 0) print $i;}' | sort | uniq | wc -l`
echo $cnt echo $cnt
} }
####################################################### #######################################################
......
...@@ -301,12 +301,11 @@ void BackupRestore::tuple_a(restore_callback_t *cb) ...@@ -301,12 +301,11 @@ void BackupRestore::tuple_a(restore_callback_t *cb)
cb->connection = m_ndb->startTransaction(); cb->connection = m_ndb->startTransaction();
if (cb->connection == NULL) if (cb->connection == NULL)
{ {
/*
if (errorHandler(cb)) if (errorHandler(cb))
{ {
m_ndb->sendPollNdb(3000, 1);
continue; continue;
} }
*/
exitHandler(); exitHandler();
} // if } // if
...@@ -423,9 +422,17 @@ void BackupRestore::cback(int result, restore_callback_t *cb) ...@@ -423,9 +422,17 @@ void BackupRestore::cback(int result, restore_callback_t *cb)
*/ */
bool BackupRestore::errorHandler(restore_callback_t *cb) bool BackupRestore::errorHandler(restore_callback_t *cb)
{ {
NdbError error= cb->connection->getNdbError(); NdbError error;
if(cb->connection)
{
error= cb->connection->getNdbError();
m_ndb->closeTransaction(cb->connection); m_ndb->closeTransaction(cb->connection);
cb->connection= 0; cb->connection= 0;
}
else
{
error= m_ndb->getNdbError();
}
Uint32 sleepTime = 100 + cb->retries * 300; Uint32 sleepTime = 100 + cb->retries * 300;
...@@ -440,6 +447,7 @@ bool BackupRestore::errorHandler(restore_callback_t *cb) ...@@ -440,6 +447,7 @@ bool BackupRestore::errorHandler(restore_callback_t *cb)
break; break;
case NdbError::TemporaryError: case NdbError::TemporaryError:
err << "Temporary error: " << error << endl;
NdbSleep_MilliSleep(sleepTime); NdbSleep_MilliSleep(sleepTime);
return true; return true;
// RETRY // RETRY
......
...@@ -41,7 +41,7 @@ static const int parallelism= 0; ...@@ -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";
......
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