Commit fc174af2 authored by tomas@poseidon.(none)'s avatar tomas@poseidon.(none)

new method to set size of local table data

clearer configure description texts
changed Ndb_local_table_info to use create, destroy metods and hidden constructor/destructor
move definition if Thd_ndb to .h file and changes seize/release to operate on Thd_ndb instead of Ndb objects
moved allocation/deletion of Ndb objects to Thd_ndb
parent 24ceb26d
......@@ -1068,6 +1068,7 @@ public:
const char * tableName);
public:
const Table * getTable(const char * name, void **data);
void set_local_table_data_size(unsigned sz);
};
};
......
This diff is collapsed.
......@@ -21,19 +21,29 @@
#include <NdbCondition.h>
#include <NdbSleep.h>
Ndb_local_table_info::Ndb_local_table_info(NdbTableImpl *table_impl, Uint32 sz)
Ndb_local_table_info *
Ndb_local_table_info::create(NdbTableImpl *table_impl, Uint32 sz)
{
void *data= malloc(sizeof(NdbTableImpl)+sz-1);
if (data == 0)
return 0;
memset(data,0,sizeof(NdbTableImpl)+sz-1);
new (data) Ndb_local_table_info(table_impl);
return (Ndb_local_table_info *) data;
}
void Ndb_local_table_info::destroy(Ndb_local_table_info *info)
{
free((void *)info);
}
Ndb_local_table_info::Ndb_local_table_info(NdbTableImpl *table_impl)
{
m_table_impl= table_impl;
if (sz)
m_local_data= malloc(sz);
else
m_local_data= 0;
}
Ndb_local_table_info::~Ndb_local_table_info()
{
if (m_local_data)
free(m_local_data);
}
LocalDictCache::LocalDictCache(){
......@@ -61,7 +71,7 @@ void
LocalDictCache::drop(const char * name){
Ndb_local_table_info *info= m_tableHash.deleteKey(name, strlen(name));
DBUG_ASSERT(info != 0);
delete info;
Ndb_local_table_info::destroy(info);
}
/*****************************************************************
......
......@@ -29,12 +29,13 @@
class Ndb_local_table_info {
public:
Ndb_local_table_info(NdbTableImpl *table_impl, Uint32 sz=0);
~Ndb_local_table_info();
static Ndb_local_table_info *create(NdbTableImpl *table_impl, Uint32 sz=0);
static void destroy(Ndb_local_table_info *);
NdbTableImpl *m_table_impl;
Uint64 m_first_tuple_id;
Uint64 m_last_tuple_id;
void *m_local_data;
char m_local_data[1];
private:
Ndb_local_table_info(NdbTableImpl *table_impl);
~Ndb_local_table_info();
};
/**
......
......@@ -688,6 +688,11 @@ NdbDictionary::Dictionary::getTable(const char * name, void **data){
return 0;
}
void NdbDictionary::Dictionary::set_local_table_data_size(unsigned sz)
{
m_impl.m_local_table_data_size= sz;
}
const NdbDictionary::Table *
NdbDictionary::Dictionary::getTable(const char * name){
return getTable(name, 0);
......
......@@ -589,6 +589,7 @@ NdbDictionaryImpl::NdbDictionaryImpl(Ndb &ndb,
m_ndb(ndb)
{
m_globalHash = 0;
m_local_table_data_size= 0;
}
static int f_dictionary_count = 0;
......@@ -600,7 +601,7 @@ NdbDictionaryImpl::~NdbDictionaryImpl()
while(curr != 0){
m_globalHash->lock();
m_globalHash->release(curr->theData->m_table_impl);
delete curr->theData;
Ndb_local_table_info::destroy(curr->theData);
m_globalHash->unlock();
curr = m_localHash.m_tableHash.getNext(curr);
......@@ -641,9 +642,7 @@ NdbDictionaryImpl::fetchGlobalTableImpl(const char * internalTableName)
}
}
Ndb_local_table_info *info= new Ndb_local_table_info(impl, 32);
info->m_first_tuple_id= ~0;
info->m_last_tuple_id= ~0;
Ndb_local_table_info *info= Ndb_local_table_info::create(impl, m_local_table_data_size);
m_localHash.put(internalTableName, info);
......
......@@ -400,6 +400,7 @@ public:
const NdbError & getNdbError() const;
NdbError m_error;
Uint32 m_local_table_data_size;
LocalDictCache m_localHash;
GlobalDictCache * m_globalHash;
......
......@@ -142,24 +142,17 @@ static int ndb_to_mysql_error(const NdbError *err)
Place holder for ha_ndbcluster thread specific data
*/
class Thd_ndb {
public:
Thd_ndb();
~Thd_ndb();
Ndb *ndb;
ulong count;
uint lock_count;
};
Thd_ndb::Thd_ndb()
{
ndb= 0;
ndb= new Ndb(g_ndb_cluster_connection, "");
lock_count= 0;
count= 0;
}
Thd_ndb::~Thd_ndb()
{
if (ndb)
delete ndb;
}
/*
......@@ -168,7 +161,7 @@ Thd_ndb::~Thd_ndb()
struct Ndb_table_local_info {
int no_uncommitted_rows_count;
ulong transaction_count;
ulong last_count;
ha_rows records;
};
......@@ -195,9 +188,9 @@ void ha_ndbcluster::no_uncommitted_rows_init(THD *thd)
DBUG_ENTER("ha_ndbcluster::no_uncommitted_rows_init");
struct Ndb_table_local_info *info= (struct Ndb_table_local_info *)m_table_info;
Thd_ndb *thd_ndb= (Thd_ndb *)thd->transaction.thd_ndb;
if (info->transaction_count != thd_ndb->count)
if (info->last_count != thd_ndb->count)
{
info->transaction_count = thd_ndb->count;
info->last_count = thd_ndb->count;
info->no_uncommitted_rows_count= 0;
info->records= ~(ha_rows)0;
DBUG_PRINT("info", ("id=%d, no_uncommitted_rows_count=%d",
......@@ -3346,10 +3339,7 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg):
m_tabname[0]= '\0';
m_dbname[0]= '\0';
// TODO Adjust number of records and other parameters for proper
// selection of scan/pk access
// records= 100;
records= 0;
records= ~(ha_rows)0; // uninitialized
block_size= 1024;
for (i= 0; i < MAX_KEY; i++)
......@@ -3444,41 +3434,44 @@ int ha_ndbcluster::close(void)
}
Ndb* ha_ndbcluster::seize_ndb()
Thd_ndb* ha_ndbcluster::seize_thd_ndb()
{
Ndb* ndb;
DBUG_ENTER("seize_ndb");
Thd_ndb *thd_ndb;
DBUG_ENTER("seize_thd_ndb");
#ifdef USE_NDB_POOL
// Seize from pool
ndb= Ndb::seize();
xxxxxxxxxxxxxx error
#else
ndb= new Ndb(g_ndb_cluster_connection, "");
thd_ndb= new Thd_ndb();
#endif
if (ndb->init(max_transactions) != 0)
thd_ndb->ndb->getDictionary()->set_local_table_data_size(sizeof(Ndb_table_local_info));
if (thd_ndb->ndb->init(max_transactions) != 0)
{
ERR_PRINT(ndb->getNdbError());
ERR_PRINT(thd_ndb->ndb->getNdbError());
/*
TODO
Alt.1 If init fails because to many allocated Ndb
wait on condition for a Ndb object to be released.
Alt.2 Seize/release from pool, wait until next release
*/
delete ndb;
ndb= NULL;
delete thd_ndb;
thd_ndb= NULL;
}
DBUG_RETURN(ndb);
DBUG_RETURN(thd_ndb);
}
void ha_ndbcluster::release_ndb(Ndb* ndb)
void ha_ndbcluster::release_thd_ndb(Thd_ndb* thd_ndb)
{
DBUG_ENTER("release_ndb");
DBUG_ENTER("release_thd_ndb");
#ifdef USE_NDB_POOL
// Release to pool
Ndb::release(ndb);
xxxxxxxxxxxx error
#else
delete ndb;
delete thd_ndb;
#endif
DBUG_VOID_RETURN;
}
......@@ -3497,19 +3490,18 @@ void ha_ndbcluster::release_ndb(Ndb* ndb)
int ha_ndbcluster::check_ndb_connection()
{
THD* thd= current_thd;
Ndb* ndb;
THD *thd= current_thd;
Thd_ndb *thd_ndb= (Thd_ndb*)thd->transaction.thd_ndb;
DBUG_ENTER("check_ndb_connection");
if (!thd->transaction.thd_ndb)
if (!thd_ndb)
{
ndb= seize_ndb();
if (!ndb)
thd_ndb= seize_thd_ndb();
if (!thd_ndb)
DBUG_RETURN(2);
thd->transaction.thd_ndb= new Thd_ndb();
((Thd_ndb *)thd->transaction.thd_ndb)->ndb= ndb;
thd->transaction.thd_ndb= thd_ndb;
}
m_ndb= ((Thd_ndb*)thd->transaction.thd_ndb)->ndb;
m_ndb= thd_ndb->ndb;
m_ndb->setDatabaseName(m_dbname);
DBUG_RETURN(0);
}
......@@ -3517,12 +3509,10 @@ int ha_ndbcluster::check_ndb_connection()
void ndbcluster_close_connection(THD *thd)
{
Thd_ndb *thd_ndb= (Thd_ndb*)thd->transaction.thd_ndb;
Ndb* ndb;
DBUG_ENTER("ndbcluster_close_connection");
if (thd_ndb)
{
ha_ndbcluster::release_ndb(thd_ndb->ndb);
delete thd_ndb;
ha_ndbcluster::release_thd_ndb(thd_ndb);
thd->transaction.thd_ndb= NULL;
}
DBUG_VOID_RETURN;
......@@ -3543,6 +3533,7 @@ int ndbcluster_discover(const char *dbname, const char *name,
DBUG_PRINT("enter", ("db: %s, name: %s", dbname, name));
Ndb ndb(g_ndb_cluster_connection, dbname);
ndb.getDictionary()->set_local_table_data_size(sizeof(Ndb_table_local_info));
if (ndb.init())
ERR_RETURN(ndb.getNdbError());
......@@ -3633,6 +3624,7 @@ bool ndbcluster_init()
// Create a Ndb object to open the connection to NDB
g_ndb= new Ndb(g_ndb_cluster_connection, "sys");
g_ndb->getDictionary()->set_local_table_data_size(sizeof(Ndb_table_local_info));
if (g_ndb->init() != 0)
{
ERR_PRINT (g_ndb->getNdbError());
......
......@@ -63,6 +63,19 @@ typedef struct st_ndbcluster_share {
uint table_name_length,use_count;
} NDB_SHARE;
/*
Place holder for ha_ndbcluster thread specific data
*/
class Thd_ndb {
public:
Thd_ndb();
~Thd_ndb();
Ndb *ndb;
ulong count;
uint lock_count;
};
class ha_ndbcluster: public handler
{
public:
......@@ -147,8 +160,8 @@ class ha_ndbcluster: public handler
void start_bulk_insert(ha_rows rows);
int end_bulk_insert();
static Ndb* seize_ndb();
static void release_ndb(Ndb* ndb);
static Thd_ndb* seize_thd_ndb();
static void release_thd_ndb(Thd_ndb* thd_ndb);
uint8 table_cache_type() { return HA_CACHE_TBL_NOCACHE; }
private:
......
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