Bug #25556 Ndb::startTransaction(table,keyData,keyLen) chooses invalid nodeid
Submitted: 11 Jan 2007 21:34 Modified: 11 Jan 2007 21:48
Reporter: Yoshinori Matsunobu Email Updates:
Status: Duplicate Impact on me:
None 
Category:MySQL Cluster: NDB API Severity:S2 (Serious)
Version:5.1.14 OS:Linux (Fedora Core5)
Assigned to: Assigned Account CPU Architecture:Any

[11 Jan 2007 21:34] Yoshinori Matsunobu
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
...
[11 Jan 2007 21:48] Jonas Oreland
duplicate of http://bugs.mysql.com/bug.php?id=24914