Description:
Ndb::startTransaction(table,keyData,keyLen) chooses invalid nodeid(ex nodeid: 1150).
How to repeat:
1. config.ini
[NDBD DEFAULT]
NoOFReplicas=2
[NDB_MGMD]
HostName=192.168.0.128
[NDBD]
Id=2
HostName=192.168.0.2
[NDBD]
Id=3
HostName=192.168.0.2
[MYSQLD]
Id=4
[MYSQLD]
Id=5
2. CREATE TABLE tbl1(id INTEGER PRIMARY KEY, val INTEGER) ENGINE=NDBCLUSTER;
3. INSERT INTO tbl1 VALUES(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10);
4. run the following program using NDBAPI
----
#include <NdbApi.hpp>
#include <mysql.h>
#include <iostream>
#define PRINT_ERROR(code,msg) \
std::cout << "Error in " << __FILE__ << ", line: " << __LINE__ \
<< ", code: " << code \
<< ", msg: " << msg << "." << std::endl
#define APIERROR(error) \
{ std::cout << "API ERROR: " << error.code << " " << error.message \
<< std::endl \
<< " " << "Status: " << error.status \
<< ", Classification: " << error.classification << std::endl\
<< " " << "File: " << __FILE__ \
<< " (Line: " << __LINE__ << ")" << std::endl \
; \
}
int main(int argc, char **argv)
{
ndb_init();
mysql_debug("d:t:O,/tmp/tcselect.trace");
Ndb_cluster_connection *cluster_connection =
new Ndb_cluster_connection(argv[1]);
// Connect to cluster management server (ndb_mgmd)
if (cluster_connection->connect(4 /* retries */,
5 /* delay between retries */,
1 /* verbose */))
{
std::cout << "Cluster management server was not ready within 30 secs.\n";
exit(-1);
}
// Optionally connect and wait for the storage nodes (ndbd's)
if (cluster_connection->wait_until_ready(30,0) < 0)
{
std::cout << "Cluster was not ready within 30 secs.\n";
exit(-1);
}
Ndb *ndb = new Ndb(cluster_connection,"test");
if (ndb->init() == -1) {
APIERROR(ndb->getNdbError());
exit(-1);
}
const NdbDictionary::Dictionary* dict= ndb->getDictionary();
const NdbDictionary::Table *table= dict->getTable("tbl1");
if (table == NULL)
APIERROR(dict->getNdbError());
for (Uint32 i = 1; i <= 10; i++) {
//NdbTransaction *transaction= ndb->startTransaction();
NdbTransaction *transaction= ndb->startTransaction(table,(const char*)&i,4);
if (transaction == NULL) APIERROR(ndb->getNdbError());
NdbOperation *operation= transaction->getNdbOperation(table);
if (operation == NULL) APIERROR(transaction->getNdbError());
operation->readTuple(NdbOperation::LM_CommittedRead);
operation->equal("id", i);
NdbRecAttr *recAttr= operation->getValue("val", NULL);
if (recAttr == NULL) APIERROR(transaction->getNdbError());
if(transaction->execute( NdbTransaction::Commit ) == -1)
APIERROR(transaction->getNdbError());
ndb->closeTransaction(transaction);
}
delete ndb;
delete cluster_connection;
return 0;
}
---
5. check the debug log
...
>Ndb::startTransaction
| >Ndb::checkFailedNode
| <Ndb::checkFailedNode
| >Ndb::startTransactionLocal
| | enter: nodeid: 3
| | >Ndb::doConnect
| | | >Ndb::NDB_connect
| | | <Ndb::NDB_connect
| | <Ndb::doConnect
| <Ndb::startTransactionLocal
| exit: start trans: 0x9b345d0 transid: 0x3
<Ndb::startTransaction
...
>Ndb::startTransaction
| >Ndb::checkFailedNode
| <Ndb::checkFailedNode
| >Ndb::startTransactionLocal
| | enter: nodeid: 1150
| | >Ndb::doConnect
| | | >Ndb::NDB_connect
| | | <Ndb::NDB_connect
| | | >Ndb::NDB_connect
| | | <Ndb::NDB_connect
| | <Ndb::doConnect
| <Ndb::startTransactionLocal
| exit: start trans: 0x9b345d0 transid: 0x9
<Ndb::startTransaction
...