ndb - bug#29176 missing stack pruning in drop_page

parent 1c8219c5
...@@ -1871,6 +1871,11 @@ Pgman::free_data_file(Uint32 file_no, Uint32 fd) ...@@ -1871,6 +1871,11 @@ Pgman::free_data_file(Uint32 file_no, Uint32 fd)
int int
Pgman::drop_page(Ptr<Page_entry> ptr) Pgman::drop_page(Ptr<Page_entry> ptr)
{ {
#ifdef VM_TRACE
debugOut << "PGMAN: drop_page" << endl;
debugOut << "PGMAN: " << ptr << endl;
#endif
Page_stack& pl_stack = m_page_stack; Page_stack& pl_stack = m_page_stack;
Page_queue& pl_queue = m_page_queue; Page_queue& pl_queue = m_page_queue;
...@@ -1883,8 +1888,14 @@ Pgman::drop_page(Ptr<Page_entry> ptr) ...@@ -1883,8 +1888,14 @@ Pgman::drop_page(Ptr<Page_entry> ptr)
if (state & Page_entry::ONSTACK) if (state & Page_entry::ONSTACK)
{ {
jam(); jam();
bool at_bottom = ! pl_stack.hasPrev(ptr);
pl_stack.remove(ptr); pl_stack.remove(ptr);
state &= ~ Page_entry::ONSTACK; state &= ~ Page_entry::ONSTACK;
if (at_bottom && (state & Page_entry::HOT))
{
jam();
lirs_stack_prune();
}
} }
if (state & Page_entry::ONQUEUE) if (state & Page_entry::ONQUEUE)
...@@ -2298,6 +2309,13 @@ operator<<(NdbOut& out, Ptr<Pgman::Page_entry> ptr) ...@@ -2298,6 +2309,13 @@ operator<<(NdbOut& out, Ptr<Pgman::Page_entry> ptr)
out << " lsn=" << dec << pe.m_lsn; out << " lsn=" << dec << pe.m_lsn;
out << " busy_count=" << dec << pe.m_busy_count; out << " busy_count=" << dec << pe.m_busy_count;
#ifdef VM_TRACE #ifdef VM_TRACE
{
Pgman::Page_stack& pl_stack = pe.m_this->m_page_stack;
if (! pl_stack.hasNext(ptr))
out << " top";
if (! pl_stack.hasPrev(ptr))
out << " bottom";
}
{ {
Pgman::Local_page_request_list Pgman::Local_page_request_list
req_list(ptr.p->m_this->m_page_request_pool, ptr.p->m_requests); req_list(ptr.p->m_this->m_page_request_pool, ptr.p->m_requests);
......
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