Commit 4b0cd131 authored by unknown's avatar unknown

Merge whalegate.ndb.mysql.com:/home/tomas/mysql-5.0-opt

into  whalegate.ndb.mysql.com:/home/tomas/mysql-5.0-ndb
parents bc8d9473 bd0754f8
...@@ -13,9 +13,11 @@ TimeBetweenGlobalCheckpoints= 500 ...@@ -13,9 +13,11 @@ TimeBetweenGlobalCheckpoints= 500
NoOfFragmentLogFiles= 3 NoOfFragmentLogFiles= 3
# #
# Increase deadlock-timeout to cater for slow test-machines # Increase timeouts to cater for slow test-machines
# (possibly running several tests in parallell) # (possibly running several tests in parallell)
# #
HeartbeatIntervalDbDb= 30000
HeartbeatIntervalDbApi= 30000
#TransactionDeadlockDetectionTimeout= 7500 #TransactionDeadlockDetectionTimeout= 7500
[ndbd] [ndbd]
......
...@@ -13,9 +13,11 @@ TimeBetweenGlobalCheckpoints= 500 ...@@ -13,9 +13,11 @@ TimeBetweenGlobalCheckpoints= 500
NoOfFragmentLogFiles= 3 NoOfFragmentLogFiles= 3
# #
# Increase deadlock-timeout to cater for slow test-machines # Increase timeouts to cater for slow test-machines
# (possibly running several tests in parallell) # (possibly running several tests in parallell)
# #
HeartbeatIntervalDbDb= 30000
HeartbeatIntervalDbApi= 30000
#TransactionDeadlockDetectionTimeout= 7500 #TransactionDeadlockDetectionTimeout= 7500
[ndbd] [ndbd]
......
...@@ -13,9 +13,11 @@ TimeBetweenGlobalCheckpoints= 500 ...@@ -13,9 +13,11 @@ TimeBetweenGlobalCheckpoints= 500
NoOfFragmentLogFiles= 3 NoOfFragmentLogFiles= 3
# #
# Increase deadlock-timeout to cater for slow test-machines # Increase timeouts to cater for slow test-machines
# (possibly running several tests in parallell) # (possibly running several tests in parallell)
# #
HeartbeatIntervalDbDb= 30000
HeartbeatIntervalDbApi= 30000
#TransactionDeadlockDetectionTimeout= 7500 #TransactionDeadlockDetectionTimeout= 7500
[ndbd] [ndbd]
......
...@@ -667,6 +667,12 @@ counter datavalue ...@@ -667,6 +667,12 @@ counter datavalue
57 newval 57 newval
58 newval 58 newval
drop table t1; drop table t1;
create table t1 (a int primary key auto_increment) engine = ndb;
insert into t1() values (),(),(),(),(),(),(),(),(),(),(),();
insert into t1(a) values (20),(28);
insert into t1() values (),(),(),(),(),(),(),(),(),(),(),();
insert into t1() values (21), (22);
drop table t1;
CREATE TABLE t1 ( b INT ) PACK_KEYS = 0 ENGINE = ndb; CREATE TABLE t1 ( b INT ) PACK_KEYS = 0 ENGINE = ndb;
select * from t1; select * from t1;
b b
......
...@@ -606,6 +606,21 @@ select * from t1 order by counter; ...@@ -606,6 +606,21 @@ select * from t1 order by counter;
drop table t1; drop table t1;
#
# bug#27437
connection con1;
create table t1 (a int primary key auto_increment) engine = ndb;
insert into t1() values (),(),(),(),(),(),(),(),(),(),(),();
connection con2;
insert into t1(a) values (20),(28);
connection con1;
insert into t1() values (),(),(),(),(),(),(),(),(),(),(),();
connection con2;
insert into t1() values (21), (22);
connection con1;
drop table t1;
# #
# BUG#14514 Creating table with packed key fails silently # BUG#14514 Creating table with packed key fails silently
# #
......
...@@ -166,6 +166,13 @@ public: ...@@ -166,6 +166,13 @@ public:
*/ */
char char_value() const; char char_value() const;
/**
* Get value stored in NdbRecAttr object.
*
* @return Int8 value.
*/
Int8 int8_value() const;
/** /**
* Get value stored in NdbRecAttr object. * Get value stored in NdbRecAttr object.
* *
...@@ -201,6 +208,13 @@ public: ...@@ -201,6 +208,13 @@ public:
*/ */
Uint8 u_char_value() const; Uint8 u_char_value() const;
/**
* Get value stored in NdbRecAttr object.
*
* @return Uint8 value.
*/
Uint8 u_8_value() const;
/** /**
* Get value stored in NdbRecAttr object. * Get value stored in NdbRecAttr object.
* *
...@@ -346,6 +360,13 @@ NdbRecAttr::char_value() const ...@@ -346,6 +360,13 @@ NdbRecAttr::char_value() const
return *(char*)theRef; return *(char*)theRef;
} }
inline
Int8
NdbRecAttr::int8_value() const
{
return *(Int8*)theRef;
}
inline inline
Uint32 Uint32
NdbRecAttr::u_32_value() const NdbRecAttr::u_32_value() const
...@@ -367,6 +388,13 @@ NdbRecAttr::u_char_value() const ...@@ -367,6 +388,13 @@ NdbRecAttr::u_char_value() const
return *(Uint8*)theRef; return *(Uint8*)theRef;
} }
inline
Uint8
NdbRecAttr::u_8_value() const
{
return *(Uint8*)theRef;
}
inline inline
void void
NdbRecAttr::release() NdbRecAttr::release()
......
...@@ -2059,6 +2059,9 @@ public: ...@@ -2059,6 +2059,9 @@ public:
Uint8 simpleRead; Uint8 simpleRead;
Uint8 seqNoReplica; Uint8 seqNoReplica;
Uint8 tcNodeFailrec; Uint8 tcNodeFailrec;
#ifdef VM_TRACE
Uint8 tupkeyref;
#endif
}; /* p2c: size = 280 bytes */ }; /* p2c: size = 280 bytes */
typedef Ptr<TcConnectionrec> TcConnectionrecPtr; typedef Ptr<TcConnectionrec> TcConnectionrecPtr;
......
...@@ -2765,6 +2765,12 @@ void Dblqh::execTUPKEYREF(Signal* signal) ...@@ -2765,6 +2765,12 @@ void Dblqh::execTUPKEYREF(Signal* signal)
tcConnectptr.i = tupKeyRef->userRef; tcConnectptr.i = tupKeyRef->userRef;
terrorCode = tupKeyRef->errorCode; terrorCode = tupKeyRef->errorCode;
ptrCheckGuard(tcConnectptr, ctcConnectrecFileSize, tcConnectionrec); ptrCheckGuard(tcConnectptr, ctcConnectrecFileSize, tcConnectionrec);
#ifdef VM_TRACE
ndbrequire(tcConnectptr.p->tupkeyref == 0);
tcConnectptr.p->tupkeyref = 1;
#endif
switch (tcConnectptr.p->transactionState) { switch (tcConnectptr.p->transactionState) {
case TcConnectionrec::WAIT_TUP: case TcConnectionrec::WAIT_TUP:
jam(); jam();
...@@ -3330,6 +3336,10 @@ void Dblqh::seizeTcrec() ...@@ -3330,6 +3336,10 @@ void Dblqh::seizeTcrec()
locTcConnectptr.p->tcTimer = cLqhTimeOutCount; locTcConnectptr.p->tcTimer = cLqhTimeOutCount;
locTcConnectptr.p->tableref = RNIL; locTcConnectptr.p->tableref = RNIL;
locTcConnectptr.p->savePointId = 0; locTcConnectptr.p->savePointId = 0;
#ifdef VM_TRACE
locTcConnectptr.p->tupkeyref = 1;
#endif
cfirstfreeTcConrec = nextTc; cfirstfreeTcConrec = nextTc;
tcConnectptr = locTcConnectptr; tcConnectptr = locTcConnectptr;
locTcConnectptr.p->connectState = TcConnectionrec::CONNECTED; locTcConnectptr.p->connectState = TcConnectionrec::CONNECTED;
...@@ -4049,6 +4059,9 @@ void Dblqh::execACCKEYCONF(Signal* signal) ...@@ -4049,6 +4059,9 @@ void Dblqh::execACCKEYCONF(Signal* signal)
tupKeyReq->tcOpIndex = tcConnectptr.p->tcOprec; tupKeyReq->tcOpIndex = tcConnectptr.p->tcOprec;
tupKeyReq->savePointId = tcConnectptr.p->savePointId; tupKeyReq->savePointId = tcConnectptr.p->savePointId;
#ifdef VM_TRACE
tcConnectptr.p->tupkeyref = 0;
#endif
EXECUTE_DIRECT(tup, GSN_TUPKEYREQ, signal, TupKeyReq::SignalLength); EXECUTE_DIRECT(tup, GSN_TUPKEYREQ, signal, TupKeyReq::SignalLength);
}//Dblqh::execACCKEYCONF() }//Dblqh::execACCKEYCONF()
...@@ -5860,6 +5873,10 @@ void Dblqh::completeUnusualLab(Signal* signal) ...@@ -5860,6 +5873,10 @@ void Dblqh::completeUnusualLab(Signal* signal)
void Dblqh::releaseTcrec(Signal* signal, TcConnectionrecPtr locTcConnectptr) void Dblqh::releaseTcrec(Signal* signal, TcConnectionrecPtr locTcConnectptr)
{ {
jam(); jam();
#ifdef VM_TRACE
locTcConnectptr.p->tupkeyref = 1;
#endif
locTcConnectptr.p->tcTimer = 0; locTcConnectptr.p->tcTimer = 0;
locTcConnectptr.p->transactionState = TcConnectionrec::TC_NOT_CONNECTED; locTcConnectptr.p->transactionState = TcConnectionrec::TC_NOT_CONNECTED;
locTcConnectptr.p->nextTcConnectrec = cfirstfreeTcConrec; locTcConnectptr.p->nextTcConnectrec = cfirstfreeTcConrec;
...@@ -5882,6 +5899,9 @@ void Dblqh::releaseTcrec(Signal* signal, TcConnectionrecPtr locTcConnectptr) ...@@ -5882,6 +5899,9 @@ void Dblqh::releaseTcrec(Signal* signal, TcConnectionrecPtr locTcConnectptr)
void Dblqh::releaseTcrecLog(Signal* signal, TcConnectionrecPtr locTcConnectptr) void Dblqh::releaseTcrecLog(Signal* signal, TcConnectionrecPtr locTcConnectptr)
{ {
jam(); jam();
#ifdef VM_TRACE
locTcConnectptr.p->tupkeyref = 1;
#endif
locTcConnectptr.p->tcTimer = 0; locTcConnectptr.p->tcTimer = 0;
locTcConnectptr.p->transactionState = TcConnectionrec::TC_NOT_CONNECTED; locTcConnectptr.p->transactionState = TcConnectionrec::TC_NOT_CONNECTED;
locTcConnectptr.p->nextTcConnectrec = cfirstfreeTcConrec; locTcConnectptr.p->nextTcConnectrec = cfirstfreeTcConrec;
...@@ -8336,8 +8356,11 @@ void Dblqh::nextScanConfLoopLab(Signal* signal) ...@@ -8336,8 +8356,11 @@ void Dblqh::nextScanConfLoopLab(Signal* signal)
tupKeyReq->tcOpIndex = tcConnectptr.p->tcOprec; tupKeyReq->tcOpIndex = tcConnectptr.p->tcOprec;
tupKeyReq->savePointId = tcConnectptr.p->savePointId; tupKeyReq->savePointId = tcConnectptr.p->savePointId;
Uint32 blockNo = refToBlock(tcConnectptr.p->tcTupBlockref); Uint32 blockNo = refToBlock(tcConnectptr.p->tcTupBlockref);
#ifdef VM_TRACE
tcConnectptr.p->tupkeyref = 0;
#endif
EXECUTE_DIRECT(blockNo, GSN_TUPKEYREQ, signal, EXECUTE_DIRECT(blockNo, GSN_TUPKEYREQ, signal,
TupKeyReq::SignalLength); TupKeyReq::SignalLength);
} }
} }
...@@ -9455,6 +9478,9 @@ void Dblqh::copySendTupkeyReqLab(Signal* signal) ...@@ -9455,6 +9478,9 @@ void Dblqh::copySendTupkeyReqLab(Signal* signal)
tupKeyReq->tcOpIndex = tcConnectptr.p->tcOprec; tupKeyReq->tcOpIndex = tcConnectptr.p->tcOprec;
tupKeyReq->savePointId = tcConnectptr.p->savePointId; tupKeyReq->savePointId = tcConnectptr.p->savePointId;
Uint32 blockNo = refToBlock(tcConnectptr.p->tcTupBlockref); Uint32 blockNo = refToBlock(tcConnectptr.p->tcTupBlockref);
#ifdef VM_TRACE
tcConnectptr.p->tupkeyref = 0;
#endif
EXECUTE_DIRECT(blockNo, GSN_TUPKEYREQ, signal, EXECUTE_DIRECT(blockNo, GSN_TUPKEYREQ, signal,
TupKeyReq::SignalLength); TupKeyReq::SignalLength);
} }
......
...@@ -1138,7 +1138,11 @@ Dbtup::updateStartLab(Signal* signal, ...@@ -1138,7 +1138,11 @@ Dbtup::updateStartLab(Signal* signal,
regOperPtr->attrinbufLen); regOperPtr->attrinbufLen);
} else { } else {
jam(); jam();
retValue = interpreterStartLab(signal, pagePtr, regOperPtr->pageOffset); if (interpreterStartLab(signal, pagePtr, regOperPtr->pageOffset) == -1)
{
jam();
return -1;
}
}//if }//if
if (retValue == -1) { if (retValue == -1) {
......
...@@ -627,6 +627,16 @@ MgmtSrvr::start(BaseString &error_string) ...@@ -627,6 +627,16 @@ MgmtSrvr::start(BaseString &error_string)
ndbout_c("This is probably a bug."); ndbout_c("This is probably a bug.");
} }
/*
set api reg req frequency quite high:
100 ms interval to make sure we have fairly up-to-date
info from the nodes. This to make sure that this info
is not dependent on heart beat settings in the
configuration
*/
theFacade->theClusterMgr->set_max_api_reg_req_interval(100);
TransporterRegistry *reg = theFacade->get_registry(); TransporterRegistry *reg = theFacade->get_registry();
for(unsigned int i=0;i<reg->m_transporter_interface.size();i++) { for(unsigned int i=0;i<reg->m_transporter_interface.size();i++) {
BaseString msg; BaseString msg;
......
...@@ -68,6 +68,7 @@ ClusterMgr::ClusterMgr(TransporterFacade & _facade): ...@@ -68,6 +68,7 @@ ClusterMgr::ClusterMgr(TransporterFacade & _facade):
clusterMgrThreadMutex = NdbMutex_Create(); clusterMgrThreadMutex = NdbMutex_Create();
waitForHBCond= NdbCondition_Create(); waitForHBCond= NdbCondition_Create();
waitingForHB= false; waitingForHB= false;
m_max_api_reg_req_interval= 0xFFFFFFFF; // MAX_INT
noOfAliveNodes= 0; noOfAliveNodes= 0;
noOfConnectedNodes= 0; noOfConnectedNodes= 0;
theClusterMgrThread= 0; theClusterMgrThread= 0;
...@@ -251,7 +252,7 @@ ClusterMgr::threadMain( ){ ...@@ -251,7 +252,7 @@ ClusterMgr::threadMain( ){
* Start of Secure area for use of Transporter * Start of Secure area for use of Transporter
*/ */
theFacade.lock_mutex(); theFacade.lock_mutex();
for (int i = 1; i < MAX_NODES; i++){ for (int i = 1; i < MAX_NDB_NODES; i++){
/** /**
* Send register request (heartbeat) to all available nodes * Send register request (heartbeat) to all available nodes
* at specified timing intervals * at specified timing intervals
...@@ -272,7 +273,8 @@ ClusterMgr::threadMain( ){ ...@@ -272,7 +273,8 @@ ClusterMgr::threadMain( ){
} }
theNode.hbCounter += timeSlept; theNode.hbCounter += timeSlept;
if (theNode.hbCounter >= theNode.hbFrequency) { if (theNode.hbCounter >= m_max_api_reg_req_interval ||
theNode.hbCounter >= theNode.hbFrequency) {
/** /**
* It is now time to send a new Heartbeat * It is now time to send a new Heartbeat
*/ */
...@@ -281,13 +283,6 @@ ClusterMgr::threadMain( ){ ...@@ -281,13 +283,6 @@ ClusterMgr::threadMain( ){
theNode.hbCounter = 0; theNode.hbCounter = 0;
} }
/**
* If the node is of type REP,
* then the receiver of the signal should be API_CLUSTERMGR
*/
if (theNode.m_info.m_type == NodeInfo::REP) {
signal.theReceiversBlockNumber = API_CLUSTERMGR;
}
#ifdef DEBUG_REG #ifdef DEBUG_REG
ndbout_c("ClusterMgr: Sending API_REGREQ to node %d", (int)nodeId); ndbout_c("ClusterMgr: Sending API_REGREQ to node %d", (int)nodeId);
#endif #endif
......
...@@ -50,6 +50,7 @@ public: ...@@ -50,6 +50,7 @@ public:
void startThread(); void startThread();
void forceHB(); void forceHB();
void set_max_api_reg_req_interval(unsigned int millisec) { m_max_api_reg_req_interval = millisec; }
private: private:
void threadMain(); void threadMain();
...@@ -83,6 +84,7 @@ public: ...@@ -83,6 +84,7 @@ public:
Uint32 m_connect_count; Uint32 m_connect_count;
private: private:
Uint32 m_max_api_reg_req_interval;
Uint32 noOfAliveNodes; Uint32 noOfAliveNodes;
Uint32 noOfConnectedNodes; Uint32 noOfConnectedNodes;
Node theNodes[MAX_NODES]; Node theNodes[MAX_NODES];
......
...@@ -272,7 +272,7 @@ ndbrecattr_print_formatted(NdbOut& out, const NdbRecAttr &r, ...@@ -272,7 +272,7 @@ ndbrecattr_print_formatted(NdbOut& out, const NdbRecAttr &r,
out << r.u_short_value(); out << r.u_short_value();
break; break;
case NdbDictionary::Column::Tinyunsigned: case NdbDictionary::Column::Tinyunsigned:
out << (unsigned) r.u_char_value(); out << (unsigned) r.u_8_value();
break; break;
case NdbDictionary::Column::Bigint: case NdbDictionary::Column::Bigint:
out << r.int64_value(); out << r.int64_value();
...@@ -287,7 +287,7 @@ ndbrecattr_print_formatted(NdbOut& out, const NdbRecAttr &r, ...@@ -287,7 +287,7 @@ ndbrecattr_print_formatted(NdbOut& out, const NdbRecAttr &r,
out << r.short_value(); out << r.short_value();
break; break;
case NdbDictionary::Column::Tinyint: case NdbDictionary::Column::Tinyint:
out << (int) r.char_value(); out << (int) r.int8_value();
break; break;
case NdbDictionary::Column::Binary: case NdbDictionary::Column::Binary:
if (!f.hex_format) if (!f.hex_format)
...@@ -413,7 +413,7 @@ ndbrecattr_print_formatted(NdbOut& out, const NdbRecAttr &r, ...@@ -413,7 +413,7 @@ ndbrecattr_print_formatted(NdbOut& out, const NdbRecAttr &r,
break; break;
case NdbDictionary::Column::Year: case NdbDictionary::Column::Year:
{ {
uint year = 1900 + r.u_char_value(); uint year = 1900 + r.u_8_value();
char buf[40]; char buf[40];
sprintf(buf, "%04d", year); sprintf(buf, "%04d", year);
out << buf; out << buf;
......
...@@ -40,6 +40,7 @@ class ha_ndbcluster_cond; ...@@ -40,6 +40,7 @@ class ha_ndbcluster_cond;
// connectstring to cluster if given by mysqld // connectstring to cluster if given by mysqld
extern const char *ndbcluster_connectstring; extern const char *ndbcluster_connectstring;
extern ulong ndb_cache_check_time; extern ulong ndb_cache_check_time;
extern char opt_ndb_constrbuf[];
typedef enum ndb_index_type { typedef enum ndb_index_type {
UNDEFINED_INDEX = 0, UNDEFINED_INDEX = 0,
......
...@@ -475,6 +475,8 @@ sys_var_thd_bool ...@@ -475,6 +475,8 @@ sys_var_thd_bool
sys_ndb_use_transactions("ndb_use_transactions", &SV::ndb_use_transactions); sys_ndb_use_transactions("ndb_use_transactions", &SV::ndb_use_transactions);
sys_var_long_ptr sys_var_long_ptr
sys_ndb_cache_check_time("ndb_cache_check_time", &ndb_cache_check_time); sys_ndb_cache_check_time("ndb_cache_check_time", &ndb_cache_check_time);
sys_var_const_str
sys_ndb_connectstring("ndb_connectstring", opt_ndb_constrbuf);
#endif #endif
/* Time/date/datetime formats */ /* Time/date/datetime formats */
...@@ -792,6 +794,7 @@ sys_var *sys_variables[]= ...@@ -792,6 +794,7 @@ sys_var *sys_variables[]=
#ifdef HAVE_NDBCLUSTER_DB #ifdef HAVE_NDBCLUSTER_DB
&sys_ndb_autoincrement_prefetch_sz, &sys_ndb_autoincrement_prefetch_sz,
&sys_ndb_cache_check_time, &sys_ndb_cache_check_time,
&sys_ndb_connectstring,
&sys_ndb_force_send, &sys_ndb_force_send,
&sys_ndb_use_exact_count, &sys_ndb_use_exact_count,
&sys_ndb_use_transactions, &sys_ndb_use_transactions,
...@@ -996,6 +999,7 @@ struct show_var_st init_vars[]= { ...@@ -996,6 +999,7 @@ struct show_var_st init_vars[]= {
{sys_ndb_use_exact_count.name,(char*) &sys_ndb_use_exact_count, SHOW_SYS}, {sys_ndb_use_exact_count.name,(char*) &sys_ndb_use_exact_count, SHOW_SYS},
{sys_ndb_use_transactions.name,(char*) &sys_ndb_use_transactions, SHOW_SYS}, {sys_ndb_use_transactions.name,(char*) &sys_ndb_use_transactions, SHOW_SYS},
{sys_ndb_cache_check_time.name,(char*) &sys_ndb_cache_check_time, SHOW_SYS}, {sys_ndb_cache_check_time.name,(char*) &sys_ndb_cache_check_time, SHOW_SYS},
{sys_ndb_connectstring.name,(char*) &sys_ndb_connectstring, SHOW_SYS},
#endif #endif
{sys_net_buffer_length.name,(char*) &sys_net_buffer_length, SHOW_SYS}, {sys_net_buffer_length.name,(char*) &sys_net_buffer_length, SHOW_SYS},
{sys_net_read_timeout.name, (char*) &sys_net_read_timeout, SHOW_SYS}, {sys_net_read_timeout.name, (char*) &sys_net_read_timeout, SHOW_SYS},
......
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