Commit 3e1b05e8 authored by unknown's avatar unknown

ndb: fix assertion code in event code during cluster shutdown

parent 6f3f1863
...@@ -1519,30 +1519,18 @@ NdbEventBuffer::completeClusterFailed() ...@@ -1519,30 +1519,18 @@ NdbEventBuffer::completeClusterFailed()
{ {
NdbEventOperationImpl* impl= &op->m_impl; NdbEventOperationImpl* impl= &op->m_impl;
data.senderData = impl->m_oid; data.senderData = impl->m_oid;
insertDataL(impl, &data, ptr); insertDataL(impl, &data, ptr);
} while((op = m_ndb->getEventOperation(op))); } while((op = m_ndb->getEventOperation(op)));
/** /**
* Find min not completed GCI * Release all GCI's with m_gci > gci
*/ */
Uint32 i; Uint32 i;
Uint32 sz= m_active_gci.size(); Uint32 sz= m_active_gci.size();
Uint64 gci= ~0; Uint64 gci= data.gci;
Gci_container* bucket = 0; Gci_container* bucket = 0;
Gci_container* array = (Gci_container*)m_active_gci.getBase(); Gci_container* array = (Gci_container*)m_active_gci.getBase();
for(i = 0; i < sz; i++) for(i = 0; i < sz; i++)
{
if(array[i].m_gcp_complete_rep_count && array[i].m_gci < gci)
{
bucket= array + i;
gci = bucket->m_gci;
}
}
/**
* Release all GCI's with m_gci > gci
*/
for(i = 0; i < sz; i++)
{ {
Gci_container* tmp = array + i; Gci_container* tmp = array + i;
if (tmp->m_gci > gci) if (tmp->m_gci > gci)
...@@ -1554,9 +1542,31 @@ NdbEventBuffer::completeClusterFailed() ...@@ -1554,9 +1542,31 @@ NdbEventBuffer::completeClusterFailed()
tmp->~Gci_container(); tmp->~Gci_container();
bzero(tmp, sizeof(Gci_container)); bzero(tmp, sizeof(Gci_container));
} }
else if (tmp->m_gcp_complete_rep_count)
{
if (tmp->m_gci == gci)
{
bucket= tmp;
continue;
}
// we have found an old not-completed gci
// something is wrong, assert in debug, but try so salvage
// in release
ndbout_c("out of order bucket detected at cluster disconnect, "
"data.gci: %u. tmp->m_gci: %u",
(unsigned)data.gci, (unsigned)tmp->m_gci);
assert(false);
if(!tmp->m_data.is_empty())
{
free_list(tmp->m_data);
}
tmp->~Gci_container();
bzero(tmp, sizeof(Gci_container));
}
} }
assert(bucket != 0 && data.gci == gci); assert(bucket != 0);
const Uint32 cnt= bucket->m_gcp_complete_rep_count = 1; const Uint32 cnt= bucket->m_gcp_complete_rep_count = 1;
bucket->m_gci = gci; bucket->m_gci = gci;
bucket->m_gcp_complete_rep_count = cnt; bucket->m_gcp_complete_rep_count = cnt;
......
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