Commit f87e68e4 authored by unknown's avatar unknown

Bug #19395 mysqld does not always detect cluster shutdown

    Bug #17610 ndbapi: dropEventOperation leaves object behind, memleak


mysql-test/r/ndb_autodiscover3.result:
  Bug #19395 mysqld does not always detect cluster shutdown
mysql-test/t/disabled.def:
  Bug #19395 mysqld does not always detect cluster shutdown
mysql-test/t/ndb_autodiscover3.test:
  Bug #19395 mysqld does not always detect cluster shutdown
sql/ha_ndbcluster_binlog.cc:
  Bug #19395 mysqld does not always detect cluster shutdown
storage/ndb/include/ndbapi/Ndb.hpp:
  Bug #19395 mysqld does not always detect cluster shutdown
storage/ndb/include/ndbapi/NdbDictionary.hpp:
  Bug #17610 ndbapi: dropEventOperation leaves object behind, memleak
storage/ndb/src/kernel/blocks/suma/Suma.cpp:
  Bug #17610 ndbapi: dropEventOperation leaves object behind, memleak
storage/ndb/src/ndbapi/Ndb.cpp:
  Bug #19395 mysqld does not always detect cluster shutdown
storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp:
  Bug #17610 ndbapi: dropEventOperation leaves object behind, memleak
storage/ndb/src/ndbapi/NdbEventOperationImpl.hpp:
  Bug #17610 ndbapi: dropEventOperation leaves object behind, memleak
parent ea7cc4af
...@@ -18,6 +18,7 @@ select * from t2; ...@@ -18,6 +18,7 @@ select * from t2;
ERROR 42S02: Table 'test.t2' doesn't exist ERROR 42S02: Table 'test.t2' doesn't exist
show tables like 't2'; show tables like 't2';
Tables_in_test (t2) Tables_in_test (t2)
reset master;
create table t2 (a int key) engine=ndbcluster; create table t2 (a int key) engine=ndbcluster;
insert into t2 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); insert into t2 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
select * from t2 order by a limit 3; select * from t2 order by a limit 3;
...@@ -30,10 +31,12 @@ a ...@@ -30,10 +31,12 @@ a
1 1
2 2
3 3
reset master;
select * from t2; select * from t2;
ERROR 42S02: Table 'test.t2' doesn't exist ERROR 42S02: Table 'test.t2' doesn't exist
show tables like 't2'; show tables like 't2';
Tables_in_test (t2) Tables_in_test (t2)
reset master;
create table t2 (a int key) engine=ndbcluster; create table t2 (a int key) engine=ndbcluster;
insert into t2 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); insert into t2 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
select * from t2 order by a limit 3; select * from t2 order by a limit 3;
...@@ -46,4 +49,5 @@ a ...@@ -46,4 +49,5 @@ a
1 1
2 2
3 3
reset master;
drop table t2; drop table t2;
...@@ -16,7 +16,7 @@ events_scheduling : BUG#19170 2006-04-26 andrey Test case of 19170 fails ...@@ -16,7 +16,7 @@ events_scheduling : BUG#19170 2006-04-26 andrey Test case of 19170 fails
events_logs_tests : BUG#17619 2006-05-16 andrey Test case problems events_logs_tests : BUG#17619 2006-05-16 andrey Test case problems
ndb_autodiscover : BUG#18952 2006-02-16 jmiller Needs to be fixed w.r.t binlog ndb_autodiscover : BUG#18952 2006-02-16 jmiller Needs to be fixed w.r.t binlog
ndb_autodiscover2 : BUG#18952 2006-02-16 jmiller Needs to be fixed w.r.t binlog ndb_autodiscover2 : BUG#18952 2006-02-16 jmiller Needs to be fixed w.r.t binlog
ndb_binlog_discover : BUG#19395 2006-04-28 tomas/knielsen mysqld does not always detect cluster shutdown #ndb_binlog_discover : BUG#19395 2006-04-28 tomas/knielsen mysqld does not always detect cluster shutdown
#ndb_cache2 : BUG#18597 2006-03-28 brian simultaneous drop table and ndb statistics update triggers node failure #ndb_cache2 : BUG#18597 2006-03-28 brian simultaneous drop table and ndb statistics update triggers node failure
#ndb_cache_multi2 : BUG#18597 2006-04-10 kent simultaneous drop table and ndb statistics update triggers node failure #ndb_cache_multi2 : BUG#18597 2006-04-10 kent simultaneous drop table and ndb statistics update triggers node failure
ndb_load : BUG#17233 2006-05-04 tomas failed load data from infile causes mysqld dbug_assert, binlog not flushed ndb_load : BUG#17233 2006-05-04 tomas failed load data from infile causes mysqld dbug_assert, binlog not flushed
......
...@@ -43,6 +43,7 @@ select * from t2 order by a limit 3; ...@@ -43,6 +43,7 @@ select * from t2 order by a limit 3;
--error ER_NO_SUCH_TABLE --error ER_NO_SUCH_TABLE
select * from t2; select * from t2;
show tables like 't2'; show tables like 't2';
reset master;
create table t2 (a int key) engine=ndbcluster; create table t2 (a int key) engine=ndbcluster;
insert into t2 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); insert into t2 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
select * from t2 order by a limit 3; select * from t2 order by a limit 3;
...@@ -50,6 +51,7 @@ select * from t2 order by a limit 3; ...@@ -50,6 +51,7 @@ select * from t2 order by a limit 3;
# server 1 should have a stale cache, and in this case wrong frm, transaction must be retried # server 1 should have a stale cache, and in this case wrong frm, transaction must be retried
--connection server1 --connection server1
select * from t2 order by a limit 3; select * from t2 order by a limit 3;
reset master;
--exec $NDB_MGM --no-defaults -e "all restart -i" >> $NDB_TOOLS_OUTPUT --exec $NDB_MGM --no-defaults -e "all restart -i" >> $NDB_TOOLS_OUTPUT
--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults >> $NDB_TOOLS_OUTPUT --exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults >> $NDB_TOOLS_OUTPUT
...@@ -60,6 +62,7 @@ select * from t2 order by a limit 3; ...@@ -60,6 +62,7 @@ select * from t2 order by a limit 3;
--error ER_NO_SUCH_TABLE --error ER_NO_SUCH_TABLE
select * from t2; select * from t2;
show tables like 't2'; show tables like 't2';
reset master;
create table t2 (a int key) engine=ndbcluster; create table t2 (a int key) engine=ndbcluster;
insert into t2 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); insert into t2 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
select * from t2 order by a limit 3; select * from t2 order by a limit 3;
...@@ -67,6 +70,7 @@ select * from t2 order by a limit 3; ...@@ -67,6 +70,7 @@ select * from t2 order by a limit 3;
# server 2 should have a stale cache, but with right frm, transaction need not be retried # server 2 should have a stale cache, but with right frm, transaction need not be retried
--connection server2 --connection server2
select * from t2 order by a limit 3; select * from t2 order by a limit 3;
reset master;
drop table t2; drop table t2;
# End of 4.1 tests # End of 4.1 tests
...@@ -3321,6 +3321,9 @@ pthread_handler_t ndb_binlog_thread_func(void *arg) ...@@ -3321,6 +3321,9 @@ pthread_handler_t ndb_binlog_thread_func(void *arg)
DBUG_PRINT("info", ("schema_res: %d schema_gci: %d", schema_res, schema_gci)); DBUG_PRINT("info", ("schema_res: %d schema_gci: %d", schema_res, schema_gci));
if (schema_res > 0) if (schema_res > 0)
{ {
i_ndb->pollEvents(0);
i_ndb->flushIncompleteEvents(schema_gci);
s_ndb->flushIncompleteEvents(schema_gci);
if (schema_gci < ndb_latest_handled_binlog_epoch) if (schema_gci < ndb_latest_handled_binlog_epoch)
{ {
sql_print_error("NDB Binlog: cluster has been restarted --initial or with older filesystem. " sql_print_error("NDB Binlog: cluster has been restarted --initial or with older filesystem. "
......
...@@ -1262,6 +1262,7 @@ public: ...@@ -1262,6 +1262,7 @@ public:
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
int flushIncompleteEvents(Uint64 gci);
NdbEventOperation *getEventOperation(NdbEventOperation* eventOp= 0); NdbEventOperation *getEventOperation(NdbEventOperation* eventOp= 0);
Uint64 getLatestGCI(); Uint64 getLatestGCI();
void forceGCP(); void forceGCP();
......
...@@ -1132,7 +1132,8 @@ public: ...@@ -1132,7 +1132,8 @@ public:
_TE_NODE_FAILURE=10, _TE_NODE_FAILURE=10,
_TE_SUBSCRIBE=11, _TE_SUBSCRIBE=11,
_TE_UNSUBSCRIBE=12, _TE_UNSUBSCRIBE=12,
_TE_NUL=13 // internal (e.g. INS o DEL within same GCI) _TE_NUL=13, // internal (e.g. INS o DEL within same GCI)
_TE_ACTIVE=14 // internal (node becomes active)
}; };
#endif #endif
/** /**
......
...@@ -2649,6 +2649,22 @@ Suma::reportAllSubscribers(Signal *signal, ...@@ -2649,6 +2649,22 @@ Suma::reportAllSubscribers(Signal *signal,
SubscriptionPtr subPtr, SubscriptionPtr subPtr,
SubscriberPtr subbPtr) SubscriberPtr subbPtr)
{ {
SubTableData * data = (SubTableData*)signal->getDataPtrSend();
if (table_event == NdbDictionary::Event::_TE_SUBSCRIBE)
{
data->gci = m_last_complete_gci + 1;
data->tableId = subPtr.p->m_tableId;
data->operation = NdbDictionary::Event::_TE_ACTIVE;
data->ndbd_nodeid = refToNode(reference());
data->changeMask = 0;
data->totalLen = 0;
data->req_nodeid = refToNode(subbPtr.p->m_senderRef);
data->senderData = subbPtr.p->m_senderData;
sendSignal(subbPtr.p->m_senderRef, GSN_SUB_TABLE_DATA, signal,
SubTableData::SignalLength, JBB);
}
if (!(subPtr.p->m_options & Subscription::REPORT_SUBSCRIBE)) if (!(subPtr.p->m_options & Subscription::REPORT_SUBSCRIBE))
{ {
return; return;
...@@ -2663,7 +2679,6 @@ Suma::reportAllSubscribers(Signal *signal, ...@@ -2663,7 +2679,6 @@ Suma::reportAllSubscribers(Signal *signal,
ndbout_c("reportAllSubscribers subPtr.i: %d subPtr.p->n_subscribers: %d", ndbout_c("reportAllSubscribers subPtr.i: %d subPtr.p->n_subscribers: %d",
subPtr.i, subPtr.p->n_subscribers); subPtr.i, subPtr.p->n_subscribers);
//#endif //#endif
SubTableData * data = (SubTableData*)signal->getDataPtrSend();
data->gci = m_last_complete_gci + 1; data->gci = m_last_complete_gci + 1;
data->tableId = subPtr.p->m_tableId; data->tableId = subPtr.p->m_tableId;
data->operation = table_event; data->operation = table_event;
......
...@@ -1324,6 +1324,12 @@ Ndb::pollEvents(int aMillisecondNumber, Uint64 *latestGCI) ...@@ -1324,6 +1324,12 @@ Ndb::pollEvents(int aMillisecondNumber, Uint64 *latestGCI)
return theEventBuffer->pollEvents(aMillisecondNumber, latestGCI); return theEventBuffer->pollEvents(aMillisecondNumber, latestGCI);
} }
int
Ndb::flushIncompleteEvents(Uint64 gci)
{
return theEventBuffer->flushIncompleteEvents(gci);
}
NdbEventOperation *Ndb::nextEvent() NdbEventOperation *Ndb::nextEvent()
{ {
return theEventBuffer->nextEvent(); return theEventBuffer->nextEvent();
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include <UtilBuffer.hpp> #include <UtilBuffer.hpp>
#define NDB_EVENT_OP_MAGIC_NUMBER 0xA9F301B4 #define NDB_EVENT_OP_MAGIC_NUMBER 0xA9F301B4
//#define EVENT_DEBUG #define EVENT_DEBUG
#ifdef EVENT_DEBUG #ifdef EVENT_DEBUG
#define DBUG_ENTER_EVENT(A) DBUG_ENTER(A) #define DBUG_ENTER_EVENT(A) DBUG_ENTER(A)
#define DBUG_RETURN_EVENT(A) DBUG_RETURN(A) #define DBUG_RETURN_EVENT(A) DBUG_RETURN(A)
...@@ -367,6 +367,8 @@ public: ...@@ -367,6 +367,8 @@ public:
Uint32 m_eventId; Uint32 m_eventId;
Uint32 m_oid; Uint32 m_oid;
Bitmask<(unsigned int)_NDB_NODE_BITMASK_SIZE> m_node_bit_mask;
int m_ref_count;
bool m_mergeEvents; bool m_mergeEvents;
EventBufData *m_data_item; EventBufData *m_data_item;
...@@ -406,10 +408,10 @@ public: ...@@ -406,10 +408,10 @@ public:
void dropEventOperation(NdbEventOperation *); void dropEventOperation(NdbEventOperation *);
static NdbEventOperationImpl* getEventOperationImpl(NdbEventOperation* tOp); static NdbEventOperationImpl* getEventOperationImpl(NdbEventOperation* tOp);
void add_drop_lock(); void add_drop_lock() { NdbMutex_Lock(p_add_drop_mutex); }
void add_drop_unlock(); void add_drop_unlock() { NdbMutex_Unlock(p_add_drop_mutex); }
void lock(); void lock() { NdbMutex_Lock(m_mutex); }
void unlock(); void unlock() { NdbMutex_Unlock(m_mutex); }
void add_op(); void add_op();
void remove_op(); void remove_op();
...@@ -430,9 +432,11 @@ public: ...@@ -430,9 +432,11 @@ public:
Uint32 getEventId(int bufferId); Uint32 getEventId(int bufferId);
int pollEvents(int aMillisecondNumber, Uint64 *latestGCI= 0); int pollEvents(int aMillisecondNumber, Uint64 *latestGCI= 0);
int flushIncompleteEvents(Uint64 gci);
NdbEventOperation *nextEvent(); NdbEventOperation *nextEvent();
NdbEventOperationImpl* getGCIEventOperations(Uint32* iter, NdbEventOperationImpl* getGCIEventOperations(Uint32* iter,
Uint32* event_types); Uint32* event_types);
void NdbEventBuffer::deleteUsedEventOperations();
NdbEventOperationImpl *move_data(); NdbEventOperationImpl *move_data();
......
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