Commit 67da3a64 authored by jonas@perch.ndb.mysql.com's avatar jonas@perch.ndb.mysql.com
Browse files

ndb - fix dd drop table race condition

  add list of pages being unmaped, so we can wait for it to be empty before dropping extents
parent 48847b36
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -563,6 +563,8 @@ typedef Ptr<Fragoperrec> FragoperrecPtr;
     */
    Page_request_list::Head m_page_requests[MAX_FREE_LIST];

    DLList<Page>::Head m_unmap_pages;

    /**
     * Current extent
     */
+6 −0
Original line number Diff line number Diff line
@@ -956,7 +956,9 @@ Dbtup::disk_page_unmap_callback(Uint32 when,

    ArrayPool<Page> *pool= (ArrayPool<Page>*)&m_global_page_pool;
    LocalDLList<Page> list(*pool, alloc.m_dirty_pages[idx]);
    LocalDLList<Page> list2(*pool, alloc.m_unmap_pages);
    list.remove(pagePtr);
    list2.add(pagePtr);

    if (dirty_count == 0)
    {
@@ -999,6 +1001,10 @@ Dbtup::disk_page_unmap_callback(Uint32 when,
	     << " cnt: " << dirty_count << " " << (idx & ~0x8000) << endl;
    }

    ArrayPool<Page> *pool= (ArrayPool<Page>*)&m_global_page_pool;
    LocalDLList<Page> list(*pool, alloc.m_unmap_pages);
    list.remove(pagePtr);

    Tablespace_client tsman(0, c_tsman,
			    fragPtr.p->fragTableId,
			    fragPtr.p->fragmentId,
+13 −0
Original line number Diff line number Diff line
@@ -1005,7 +1005,20 @@ Dbtup::drop_fragment_unmap_pages(Signal *signal,
{
  if (tabPtr.p->m_no_of_disk_attributes)
  {
    jam();
    Disk_alloc_info& alloc_info= fragPtr.p->m_disk_alloc_info;

    if (!alloc_info.m_unmap_pages.isEmpty())
    {
      jam();
      ndbout_c("waiting for unmape pages");
      signal->theData[0] = ZUNMAP_PAGES;
      signal->theData[1] = tabPtr.i;
      signal->theData[2] = fragPtr.i;
      signal->theData[3] = pos;
      sendSignal(cownref, GSN_CONTINUEB, signal, 4, JBB);  
      return;
    }
    while(alloc_info.m_dirty_pages[pos].isEmpty() && pos < MAX_FREE_LIST)
      pos++;