Commit 6d8f22ef authored by unknown's avatar unknown

ndb -

  fix memory corruption in event-api
  maybe bug fix for 18621, 19154, 19172, 19174


storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp:
  Make sure that nasty c++ features arent run on Gci_container as it's supposed to be POD!
storage/ndb/src/ndbapi/NdbEventOperationImpl.hpp:
  Make sure that nasty c++ features arent run on Gci_container as it's supposed to be POD!
parent 52b0bb6e
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
#include <EventLogger.hpp> #include <EventLogger.hpp>
extern EventLogger g_eventLogger; extern EventLogger g_eventLogger;
static Gci_container g_empty_gci_container; static Gci_container_pod g_empty_gci_container;
static const Uint32 ACTIVE_GCI_DIRECTORY_SIZE = 4; static const Uint32 ACTIVE_GCI_DIRECTORY_SIZE = 4;
static const Uint32 ACTIVE_GCI_MASK = ACTIVE_GCI_DIRECTORY_SIZE - 1; static const Uint32 ACTIVE_GCI_MASK = ACTIVE_GCI_DIRECTORY_SIZE - 1;
...@@ -1223,12 +1223,22 @@ operator<<(NdbOut& out, const Gci_container& gci) ...@@ -1223,12 +1223,22 @@ operator<<(NdbOut& out, const Gci_container& gci)
return out; return out;
} }
static
NdbOut&
operator<<(NdbOut& out, const Gci_container_pod& gci)
{
Gci_container* ptr = (Gci_container*)&gci;
out << *ptr;
return out;
}
static static
Gci_container* Gci_container*
find_bucket_chained(Vector<Gci_container> * active, Uint64 gci) find_bucket_chained(Vector<Gci_container_pod> * active, Uint64 gci)
{ {
Uint32 pos = (gci & ACTIVE_GCI_MASK); Uint32 pos = (gci & ACTIVE_GCI_MASK);
Gci_container *bucket= active->getBase() + pos; Gci_container *bucket= ((Gci_container*)active->getBase()) + pos;
if(gci > bucket->m_gci) if(gci > bucket->m_gci)
{ {
...@@ -1237,8 +1247,9 @@ find_bucket_chained(Vector<Gci_container> * active, Uint64 gci) ...@@ -1237,8 +1247,9 @@ find_bucket_chained(Vector<Gci_container> * active, Uint64 gci)
do do
{ {
active->fill(move_pos, g_empty_gci_container); active->fill(move_pos, g_empty_gci_container);
bucket = active->getBase() + pos; // Needs to recomputed after fill // Needs to recomputed after fill
move = active->getBase() + move_pos; bucket = ((Gci_container*)active->getBase()) + pos;
move = ((Gci_container*)active->getBase()) + move_pos;
if(move->m_gcp_complete_rep_count == 0) if(move->m_gcp_complete_rep_count == 0)
{ {
memcpy(move, bucket, sizeof(Gci_container)); memcpy(move, bucket, sizeof(Gci_container));
...@@ -1269,10 +1280,10 @@ find_bucket_chained(Vector<Gci_container> * active, Uint64 gci) ...@@ -1269,10 +1280,10 @@ find_bucket_chained(Vector<Gci_container> * active, Uint64 gci)
inline inline
Gci_container* Gci_container*
find_bucket(Vector<Gci_container> * active, Uint64 gci) find_bucket(Vector<Gci_container_pod> * active, Uint64 gci)
{ {
Uint32 pos = (gci & ACTIVE_GCI_MASK); Uint32 pos = (gci & ACTIVE_GCI_MASK);
Gci_container *bucket= active->getBase() + pos; Gci_container *bucket= ((Gci_container*)active->getBase()) + pos;
if(likely(gci == bucket->m_gci)) if(likely(gci == bucket->m_gci))
return bucket; return bucket;
...@@ -1370,7 +1381,8 @@ NdbEventBuffer::execSUB_GCP_COMPLETE_REP(const SubGcpCompleteRep * const rep) ...@@ -1370,7 +1381,8 @@ NdbEventBuffer::execSUB_GCP_COMPLETE_REP(const SubGcpCompleteRep * const rep)
{ {
/** out of order something */ /** out of order something */
ndbout_c("out of order bucket: %d gci: %lld m_latestGCI: %lld", ndbout_c("out of order bucket: %d gci: %lld m_latestGCI: %lld",
bucket-m_active_gci.getBase(), gci, m_latestGCI); bucket-(Gci_container*)m_active_gci.getBase(),
gci, m_latestGCI);
bucket->m_state = Gci_container::GC_COMPLETE; bucket->m_state = Gci_container::GC_COMPLETE;
bucket->m_gcp_complete_rep_count = 1; // Prevent from being reused bucket->m_gcp_complete_rep_count = 1; // Prevent from being reused
m_latest_complete_GCI = gci; m_latest_complete_GCI = gci;
...@@ -1387,7 +1399,7 @@ NdbEventBuffer::complete_outof_order_gcis() ...@@ -1387,7 +1399,7 @@ NdbEventBuffer::complete_outof_order_gcis()
Uint64 stop_gci = m_latest_complete_GCI; Uint64 stop_gci = m_latest_complete_GCI;
const Uint32 size = m_active_gci.size(); const Uint32 size = m_active_gci.size();
Gci_container* array= m_active_gci.getBase(); Gci_container* array= (Gci_container*)m_active_gci.getBase();
ndbout_c("complete_outof_order_gcis"); ndbout_c("complete_outof_order_gcis");
for(Uint32 i = 0; i<size; i++) for(Uint32 i = 0; i<size; i++)
...@@ -1490,7 +1502,7 @@ NdbEventBuffer::completeClusterFailed() ...@@ -1490,7 +1502,7 @@ NdbEventBuffer::completeClusterFailed()
Uint32 sz= m_active_gci.size(); Uint32 sz= m_active_gci.size();
Uint64 gci= ~0; Uint64 gci= ~0;
Gci_container* bucket = 0; Gci_container* bucket = 0;
Gci_container* array = m_active_gci.getBase(); Gci_container* array = (Gci_container*)m_active_gci.getBase();
for(Uint32 i = 0; i<sz; i++) for(Uint32 i = 0; i<sz; i++)
{ {
if(array[i].m_gcp_complete_rep_count && array[i].m_gci < gci) if(array[i].m_gcp_complete_rep_count && array[i].m_gci < gci)
...@@ -2538,5 +2550,5 @@ EventBufData_hash::search(Pos& hpos, NdbEventOperationImpl* op, LinearSectionPtr ...@@ -2538,5 +2550,5 @@ EventBufData_hash::search(Pos& hpos, NdbEventOperationImpl* op, LinearSectionPtr
DBUG_VOID_RETURN_EVENT; DBUG_VOID_RETURN_EVENT;
} }
template class Vector<Gci_container>; template class Vector<Gci_container_pod>;
template class Vector<NdbEventBuffer::EventBufData_chunk*>; template class Vector<NdbEventBuffer::EventBufData_chunk*>;
...@@ -272,6 +272,11 @@ struct Gci_container ...@@ -272,6 +272,11 @@ struct Gci_container
EventBufData_hash m_data_hash; EventBufData_hash m_data_hash;
}; };
struct Gci_container_pod
{
char data[sizeof(Gci_container)];
};
class NdbEventOperationImpl : public NdbEventOperation { class NdbEventOperationImpl : public NdbEventOperation {
public: public:
NdbEventOperationImpl(NdbEventOperation &f, NdbEventOperationImpl(NdbEventOperation &f,
...@@ -365,7 +370,7 @@ public: ...@@ -365,7 +370,7 @@ public:
~NdbEventBuffer(); ~NdbEventBuffer();
const Uint32 &m_system_nodes; const Uint32 &m_system_nodes;
Vector<Gci_container> m_active_gci; Vector<Gci_container_pod> m_active_gci;
NdbEventOperation *createEventOperation(const char* eventName, NdbEventOperation *createEventOperation(const char* eventName,
NdbError &); NdbError &);
NdbEventOperationImpl *createEventOperation(NdbEventImpl& evnt, NdbEventOperationImpl *createEventOperation(NdbEventImpl& evnt,
......
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