Commit 2119a88a authored by jonas@perch.ndb.mysql.com's avatar jonas@perch.ndb.mysql.com

Merge perch.ndb.mysql.com:/home/jonas/src/mysql-4.1

into  perch.ndb.mysql.com:/home/jonas/src/mysql-5.0
parents e813de68 668a192c
......@@ -984,10 +984,10 @@ class BaseString;
class NdbEventOperation;
class NdbBlob;
class NdbReceiver;
template <class T> struct Ndb_free_list_t;
typedef void (* NdbEventCallback)(NdbEventOperation*, Ndb*, void*);
#if defined NDB_OSE
/**
* Default time to wait for response after request has been sent to
......@@ -1457,8 +1457,20 @@ public:
*/
NdbTransaction* hupp( NdbTransaction* );
Uint32 getReference() const { return theMyRef;}
struct Free_list_usage
{
const char * m_name;
Uint32 m_created;
Uint32 m_free;
Uint32 m_sizeof;
};
Free_list_usage * get_free_list_usage(Free_list_usage*);
#endif
/*****************************************************************************
* These are service routines used by the other classes in the NDBAPI.
****************************************************************************/
......@@ -1630,22 +1642,8 @@ private:
class NdbDictionaryImpl* theDictionary;
class NdbGlobalEventBufferHandle* theGlobalEventBufferHandle;
NdbTransaction* theConIdleList; // First connection in idle list.
NdbOperation* theOpIdleList; // First operation in the idle list.
NdbIndexScanOperation* theScanOpIdleList; // First scan operation in the idle list.
NdbIndexOperation* theIndexOpIdleList; // First index operation in the idle list.
NdbTransaction* theTransactionList;
NdbTransaction** theConnectionArray;
NdbRecAttr* theRecAttrIdleList;
NdbApiSignal* theSignalIdleList; // First signal in idlelist.
NdbLabel* theLabelList; // First label descriptor in list
NdbBranch* theBranchList; // First branch descriptor in list
NdbSubroutine* theSubroutineList; // First subroutine descriptor in
NdbCall* theCallList; // First call descriptor in list
NdbReceiver* theScanList;
NdbBlob* theNdbBlobIdleList;
Uint32 theMyRef; // My block reference
Uint32 theNode; // The node number of our node
......
......@@ -277,7 +277,7 @@ private:
// for keeping in lists
NdbBlob* theNext;
// initialization
NdbBlob();
NdbBlob(Ndb*);
void init();
void release();
// classify operations
......@@ -329,6 +329,10 @@ private:
int getOperationType() const;
friend class NdbOut& operator<<(NdbOut&, const NdbBlob&);
#endif
void next(NdbBlob* obj) { theNext= obj;}
NdbBlob* next() { return theNext;}
friend struct Ndb_free_list_t<NdbBlob>;
};
#endif
......@@ -181,6 +181,7 @@ private:
// Private attributes
const NdbIndexImpl* m_theIndex;
friend struct Ndb_free_list_t<NdbIndexOperation>;
};
#endif
......@@ -165,9 +165,10 @@ private:
int compare(Uint32 key, Uint32 cols, const NdbReceiver*, const NdbReceiver*);
Uint32 m_sort_columns;
Uint32 m_this_bound_start;
Uint32 * m_first_bound_word;
friend struct Ndb_free_list_t<NdbIndexScanOperation>;
};
#endif
......@@ -22,6 +22,7 @@
#include "NdbError.hpp"
#include "NdbReceiver.hpp"
#include "NdbDictionary.hpp"
#include "Ndb.hpp"
class Ndb;
class NdbApiSignal;
......@@ -756,8 +757,6 @@ protected:
/******************************************************************************
* These are the methods used to create and delete the NdbOperation objects.
*****************************************************************************/
NdbOperation(Ndb* aNdb);
virtual ~NdbOperation();
bool needReply();
/******************************************************************************
......@@ -769,6 +768,8 @@ protected:
int init(const class NdbTableImpl*, NdbTransaction* aCon);
void initInterpreter();
NdbOperation(Ndb* aNdb);
virtual ~NdbOperation();
void next(NdbOperation*); // Set next pointer
NdbOperation* next(); // Get next pointer
public:
......@@ -965,6 +966,8 @@ protected:
* IgnoreError on connection level.
*/
Int8 m_abortOption;
friend struct Ndb_free_list_t<NdbOperation>;
};
#ifdef NDB_NO_DROPPED_SIGNAL
......
......@@ -17,7 +17,8 @@
#ifndef NdbRecAttr_H
#define NdbRecAttr_H
#include <NdbDictionary.hpp>
#include "NdbDictionary.hpp"
#include "Ndb.hpp"
class NdbOperation;
......@@ -248,7 +249,6 @@ public:
const NdbRecAttr* next() const;
#endif
private:
NdbRecAttr();
Uint32 attrId() const; /* Get attribute id */
bool setNULL(); /* Set NULL indicator */
......@@ -258,6 +258,7 @@ private:
void release(); /* Release memory if allocated */
void init(); /* Initialise object when allocated */
NdbRecAttr(Ndb*);
void next(NdbRecAttr* aRecAttr);
NdbRecAttr* next();
......@@ -280,6 +281,8 @@ private:
Uint32 theAttrSize;
Uint32 theArraySize;
const NdbDictionary::Column* m_column;
friend struct Ndb_free_list_t<NdbRecAttr>;
};
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
......
......@@ -18,8 +18,9 @@
#define NdbTransaction_H
#include <ndb_types.h>
#include <NdbError.hpp>
#include <NdbDictionary.hpp>
#include "NdbError.hpp"
#include "NdbDictionary.hpp"
#include "Ndb.hpp"
class NdbTransaction;
class NdbOperation;
......@@ -581,9 +582,7 @@ private:
/**************************************************************************
* These are the create and delete methods of this class. *
**************************************************************************/
NdbTransaction(Ndb* aNdb);
~NdbTransaction();
void init(); // Initialize connection object for new transaction
......@@ -807,6 +806,7 @@ private:
void define_scan_op(NdbIndexScanOperation*);
friend class HugoOperations;
friend struct Ndb_free_list_t<NdbConnection>;
};
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
......
......@@ -62,6 +62,25 @@ NdbApiSignal::NdbApiSignal(BlockReference ref)
theNextSignal = 0;
}
NdbApiSignal::NdbApiSignal(Ndb* ndb)
{
BlockReference ref = ndb->theMyRef;
theVerId_signalNumber = 0; // 4 bit ver id - 16 bit gsn
theReceiversBlockNumber = 0; // Only 16 bit blocknum
theSendersBlockRef = refToBlock(ref);
theLength = 0;
theSendersSignalId = 0;
theSignalId = 0;
theTrace = 0;
m_noOfSections = 0;
m_fragmentInfo = 0;
for (int i = 0; i < 25; i++)
theData[i] = 0x13579753;
setDataPtr(&theData[0]);
theNextSignal = 0;
}
/**
* Copy constructor
*/
......
......@@ -46,7 +46,8 @@
class NdbApiSignal : public SignalHeader
{
public:
NdbApiSignal(BlockReference myRef);
NdbApiSignal(Ndb* ndb);
NdbApiSignal(BlockReference ref);
NdbApiSignal(const NdbApiSignal &);
NdbApiSignal(const SignalHeader &header)
: SignalHeader(header), theNextSignal(0), theRealData(0) {};
......
......@@ -111,7 +111,7 @@ NdbBlob::getBlobTable(NdbTableImpl& bt, const NdbTableImpl* t, const NdbColumnIm
// initialization
NdbBlob::NdbBlob()
NdbBlob::NdbBlob(Ndb*)
{
init();
}
......
......@@ -32,6 +32,21 @@
#include "NdbDictionaryImpl.hpp"
#include "ObjectMap.hpp"
template <class T>
struct Ndb_free_list_t
{
Ndb_free_list_t();
~Ndb_free_list_t();
void fill(Ndb*, Uint32 cnt);
T* seize(Ndb*);
void release(T*);
void clear();
Uint32 get_sizeof() const { return sizeof(T); }
T * m_free_list;
Uint32 m_alloc_cnt, m_free_cnt;
};
/**
* Private parts of the Ndb object (corresponding to Ndb.hpp in public API)
*/
......@@ -60,7 +75,6 @@ public:
int m_optimized_node_selection;
BaseString m_dbname; // Database name
BaseString m_schemaname; // Schema name
......@@ -72,6 +86,22 @@ public:
m_schemaname.c_str(), table_name_separator);
}
/**
* NOTE free lists must be _after_ theNdbObjectIdMap take
* assure that destructors are run in correct order
*/
Ndb_free_list_t<NdbTransaction> theConIdleList;
Ndb_free_list_t<NdbOperation> theOpIdleList;
Ndb_free_list_t<NdbIndexScanOperation> theScanOpIdleList;
Ndb_free_list_t<NdbIndexOperation> theIndexOpIdleList;
Ndb_free_list_t<NdbRecAttr> theRecAttrIdleList;
Ndb_free_list_t<NdbApiSignal> theSignalIdleList;
Ndb_free_list_t<NdbLabel> theLabelList;
Ndb_free_list_t<NdbBranch> theBranchList;
Ndb_free_list_t<NdbSubroutine> theSubroutineList;
Ndb_free_list_t<NdbCall> theCallList;
Ndb_free_list_t<NdbBlob> theNdbBlobIdleList;
Ndb_free_list_t<NdbReceiver> theScanList;
};
#ifdef VM_TRACE
......@@ -146,4 +176,91 @@ enum LockMode {
Delete
};
template<class T>
inline
Ndb_free_list_t<T>::Ndb_free_list_t()
{
m_free_list= 0;
m_alloc_cnt= m_free_cnt= 0;
}
template<class T>
inline
Ndb_free_list_t<T>::~Ndb_free_list_t()
{
clear();
}
template<class T>
inline
void
Ndb_free_list_t<T>::fill(Ndb* ndb, Uint32 cnt)
{
if (m_free_list == 0)
{
m_free_cnt++;
m_alloc_cnt++;
m_free_list = new T(ndb);
}
while(m_alloc_cnt < cnt)
{
T* obj= new T(ndb);
if(obj == 0)
return;
obj->next(m_free_list);
m_free_cnt++;
m_alloc_cnt++;
m_free_list = obj;
}
}
template<class T>
inline
T*
Ndb_free_list_t<T>::seize(Ndb* ndb)
{
T* tmp = m_free_list;
if (tmp)
{
m_free_list = (T*)tmp->next();
tmp->next(NULL);
m_free_cnt--;
return tmp;
}
if((tmp = new T(ndb)))
{
m_alloc_cnt++;
}
return tmp;
}
template<class T>
inline
void
Ndb_free_list_t<T>::release(T* obj)
{
obj->next(m_free_list);
m_free_list = obj;
m_free_cnt++;
}
template<class T>
inline
void
Ndb_free_list_t<T>::clear()
{
T* obj = m_free_list;
while(obj)
{
T* curr = obj;
obj = (T*)obj->next();
delete curr;
m_alloc_cnt--;
}
}
#endif
......@@ -22,7 +22,7 @@
#include "NdbDictionaryImpl.hpp"
#include <NdbTCP.h>
NdbRecAttr::NdbRecAttr()
NdbRecAttr::NdbRecAttr(Ndb*)
{
init();
}
......@@ -98,7 +98,7 @@ NdbRecAttr::copyout()
NdbRecAttr *
NdbRecAttr::clone() const {
NdbRecAttr * ret = new NdbRecAttr();
NdbRecAttr * ret = new NdbRecAttr(0);
ret->theAttrId = theAttrId;
ret->theNULLind = theNULLind;
......
......@@ -30,8 +30,7 @@ Comment:
#include "NdbUtil.hpp"
NdbLabel::NdbLabel() :
theNext(NULL)
NdbLabel::NdbLabel(Ndb*)
{
}
......@@ -39,8 +38,7 @@ NdbLabel::~NdbLabel()
{
}
NdbSubroutine::NdbSubroutine() :
theNext(NULL)
NdbSubroutine::NdbSubroutine(Ndb*)
{
}
......@@ -48,9 +46,8 @@ NdbSubroutine::~NdbSubroutine()
{
}
NdbBranch::NdbBranch() :
theSignal(NULL),
theNext(NULL)
NdbBranch::NdbBranch(Ndb*) :
theSignal(NULL)
{
}
......@@ -58,9 +55,8 @@ NdbBranch::~NdbBranch()
{
}
NdbCall::NdbCall() :
theSignal(NULL),
theNext(NULL)
NdbCall::NdbCall(Ndb*) :
theSignal(NULL)
{
}
......
......@@ -34,41 +34,49 @@ Comment:
class NdbApiSignal;
class NdbOperation;
class NdbLabel
template<class T>
struct Free_list_element
{
Free_list_element() { theNext = 0;}
void next(T* obj) { theNext = obj;}
T* next() { return theNext;}
T* theNext;
};
class NdbLabel : public Free_list_element<NdbLabel>
{
friend class NdbOperation;
friend class Ndb;
private:
NdbLabel();
public:
NdbLabel(Ndb*);
~NdbLabel();
NdbLabel* theNext;
private:
Uint32 theSubroutine[16];
Uint32 theLabelAddress[16];
Uint32 theLabelNo[16];
};
class NdbSubroutine
class NdbSubroutine : public Free_list_element<NdbSubroutine>
{
friend class NdbOperation;
friend class Ndb;
private:
NdbSubroutine();
public:
NdbSubroutine(Ndb*);
~NdbSubroutine();
NdbSubroutine* theNext;
Uint32 theSubroutineAddress[16];
};
class NdbBranch
class NdbBranch : public Free_list_element<NdbBranch>
{
friend class NdbOperation;
friend class Ndb;
private:
NdbBranch();
public:
NdbBranch(Ndb*);
~NdbBranch();
NdbApiSignal* theSignal;
......@@ -76,22 +84,20 @@ private:
Uint32 theBranchAddress;
Uint32 theBranchLabel;
Uint32 theSubroutine;
NdbBranch* theNext;
};
class NdbCall
class NdbCall : public Free_list_element<NdbCall>
{
friend class NdbOperation;
friend class Ndb;
private:
NdbCall();
public:
NdbCall(Ndb*);
~NdbCall();
NdbApiSignal* theSignal;
Uint32 theSignalAddress;
Uint32 theSubroutine;
NdbCall* theNext;
};
#endif
......@@ -141,15 +141,6 @@ Ndb::init(int aMaxNoOfTransactions)
error_handler:
ndbout << "error_handler" << endl;
releaseTransactionArrays();
while ( theConIdleList != NULL )
freeNdbCon();
while ( theSignalIdleList != NULL )
freeSignal();
while (theRecAttrIdleList != NULL)
freeRecAttr();
while (theOpIdleList != NULL)
freeOperation();
delete theDictionary;
TransporterFacade::instance()->close(theNdbBlockNumber, 0);
DBUG_RETURN(-1);
......
......@@ -62,20 +62,8 @@ void Ndb::setup(Ndb_cluster_connection *ndb_cluster_connection,
theRemainingStartTransactions= 0;
theMaxNoOfTransactions= 0;
theMinNoOfEventsToWakeUp= 0;
theConIdleList= NULL;
theOpIdleList= NULL;
theScanOpIdleList= NULL;
theIndexOpIdleList= NULL;
theTransactionList= NULL;
theConnectionArray= NULL;
theRecAttrIdleList= NULL;
theSignalIdleList= NULL;
theLabelList= NULL;
theBranchList= NULL;
theSubroutineList= NULL;
theCallList= NULL;
theScanList= NULL;
theNdbBlobIdleList= NULL;
the_last_check_time= 0;
theFirstTransId= 0;
theRestartGCI= 0;
......@@ -150,33 +138,6 @@ Ndb::~Ndb()
TransporterFacade::instance()->close(theNdbBlockNumber, theFirstTransId);
}
// if (theSchemaConToNdbList != NULL)
// closeSchemaTransaction(theSchemaConToNdbList);
while ( theConIdleList != NULL )
freeNdbCon();
while (theOpIdleList != NULL)
freeOperation();
while (theScanOpIdleList != NULL)
freeScanOperation();
while (theIndexOpIdleList != NULL)
freeIndexOperation();
while (theLabelList != NULL)
freeNdbLabel();
while (theBranchList != NULL)
freeNdbBranch();
while (theSubroutineList != NULL)
freeNdbSubroutine();
while (theCallList != NULL)
freeNdbCall();
while (theScanList != NULL)
freeNdbScanRec();
while (theNdbBlobIdleList != NULL)
freeNdbBlob();
while (theRecAttrIdleList != NULL)
freeRecAttr();
while ( theSignalIdleList != NULL )
freeSignal();
releaseTransactionArrays();
delete []theConnectionArray;
......
This diff is collapsed.
......@@ -869,7 +869,7 @@ operator<<(NdbOut& ndbout, const AttributeS& attr){
return ndbout;
}
NdbRecAttr tmprec;
NdbRecAttr tmprec(0);
tmprec.setup(desc.m_column, (char *)data.void_value);
ndbout << tmprec;
......
......@@ -7392,4 +7392,50 @@ ha_ndbcluster::generate_scan_filter(Ndb_cond_stack *ndb_cond_stack,
DBUG_RETURN(0);
}
int
ndbcluster_show_status(THD* thd)
{
Protocol *protocol= thd->protocol;
DBUG_ENTER("ndbcluster_show_status");
if (have_ndbcluster != SHOW_OPTION_YES)
{
my_message(ER_NOT_SUPPORTED_YET,
"Cannot call SHOW NDBCLUSTER STATUS because skip-ndbcluster is defined",
MYF(0));
DBUG_RETURN(TRUE);
}
List<Item> field_list;
field_list.push_back(new Item_empty_string("free_list", 255));
field_list.push_back(new Item_return_int("created", 10,MYSQL_TYPE_LONG));
field_list.push_back(new Item_return_int("free", 10,MYSQL_TYPE_LONG));
field_list.push_back(new Item_return_int("sizeof", 10,MYSQL_TYPE_LONG));
if (protocol->send_fields(&field_list, 1))
DBUG_RETURN(TRUE);
if (thd->transaction.thd_ndb &&
((Thd_ndb*)thd->transaction.thd_ndb)->ndb)
{
Ndb* ndb= ((Thd_ndb*)thd->transaction.thd_ndb)->ndb;
Ndb::Free_list_usage tmp; tmp.m_name= 0;
while (ndb->get_free_list_usage(&tmp))
{
protocol->prepare_for_resend();
protocol->store(tmp.m_name, &my_charset_bin);
protocol->store((uint)tmp.m_created);
protocol->store((uint)tmp.m_free);
protocol->store((uint)tmp.m_sizeof);
if (protocol->write())
DBUG_RETURN(TRUE);
}
}
send_eof(thd);
DBUG_RETURN(FALSE);
}
#endif /* HAVE_NDBCLUSTER_DB */
......@@ -728,3 +728,5 @@ int ndbcluster_table_exists_in_engine(THD* thd,
int ndbcluster_drop_database(const char* path);
void ndbcluster_print_error(int error, const NdbOperation *error_op);
int ndbcluster_show_status(THD*);
......@@ -5818,6 +5818,7 @@ struct show_var_st status_vars[]= {
{"Com_show_fields", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_FIELDS]), SHOW_LONG_STATUS},
{"Com_show_grants", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_GRANTS]), SHOW_LONG_STATUS},
{"Com_show_innodb_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_INNODB_STATUS]), SHOW_LONG_STATUS},
{"Com_show_ndb_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_NDBCLUSTER_STATUS]), SHOW_LONG_STATUS},
{"Com_show_keys", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_KEYS]), SHOW_LONG_STATUS},
{"Com_show_logs", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_LOGS]), SHOW_LONG_STATUS},
{"Com_show_master_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_MASTER_STAT]), SHOW_LONG_STATUS},
......
......@@ -53,7 +53,7 @@ enum enum_sql_command {
SQLCOM_SHOW_DATABASES, SQLCOM_SHOW_TABLES, SQLCOM_SHOW_FIELDS,
SQLCOM_SHOW_KEYS, SQLCOM_SHOW_VARIABLES, SQLCOM_SHOW_LOGS, SQLCOM_SHOW_STATUS,
SQLCOM_SHOW_INNODB_STATUS, SQLCOM_SHOW_MUTEX_STATUS,
SQLCOM_SHOW_INNODB_STATUS, SQLCOM_SHOW_NDBCLUSTER_STATUS, SQLCOM_SHOW_MUTEX_STATUS,
SQLCOM_SHOW_PROCESSLIST, SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT,
SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE, SQLCOM_SHOW_CHARSETS,
SQLCOM_SHOW_COLLATIONS, SQLCOM_SHOW_CREATE_DB, SQLCOM_SHOW_TABLE_STATUS,
......
......@@ -25,6 +25,10 @@
#include "ha_innodb.h"
#endif
#ifdef HAVE_NDBCLUSTER_DB
#include "ha_ndbcluster.h"
#endif
#include "sp_head.h"
#include "sp.h"
#include "sp_cache.h"
......@@ -2669,6 +2673,13 @@ mysql_execute_command(THD *thd)
res = load_master_data(thd);
break;
#endif /* HAVE_REPLICATION */
#ifdef HAVE_NDBCLUSTER_DB
case SQLCOM_SHOW_NDBCLUSTER_STATUS:
{
res = ndbcluster_show_status(thd);
break;
}
#endif
#ifdef HAVE_INNOBASE_DB
case SQLCOM_SHOW_INNODB_STATUS:
{
......
......@@ -6648,6 +6648,9 @@ show_engine_param:
STATUS_SYM
{
switch (Lex->create_info.db_type) {
case DB_TYPE_NDBCLUSTER:
Lex->sql_command = SQLCOM_SHOW_NDBCLUSTER_STATUS;
break;
case DB_TYPE_INNODB:
Lex->sql_command = SQLCOM_SHOW_INNODB_STATUS;
break;
......
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