• Marko Mäkelä's avatar
    MDEV-13328 ALTER TABLE…DISCARD TABLESPACE takes a lot of time · 51b4366b
    Marko Mäkelä authored
    With a big buffer pool that contains many data pages,
    DISCARD TABLESPACE took a long time, because it would scan the
    entire buffer pool to remove any pages that belong to the tablespace.
    With a large buffer pool, this would take a lot of time, especially
    when the table-to-discard is empty.
    
    The minimum amount of work that DISCARD TABLESPACE must do is to
    remove the pages of the to-be-discarded table from the
    buf_pool->flush_list because any writes to the data file must be
    prevented before the file is deleted.
    
    If DISCARD TABLESPACE does not evict the pages from the buffer pool,
    then IMPORT TABLESPACE must do it, because we must prevent pre-DISCARD,
    not-yet-evicted pages from being mistaken for pages of the imported
    tablespace.
    
    It would not be a useful fix to simply move the buffer pool scan to
    the IMPORT TABLESPACE step. What we can do is to actively evict those
    pages that could be mistaken for imported pages. In this way, when
    importing a small table into a big buffer pool, the import should
    still run relatively fast.
    
    Import is bypassing the buffer pool when reading pages for the
    adjustment phase. In the adjustment phase, if a page exists in
    the buffer pool, we could replace it with the page from the imported
    file. Unfortunately I did not get this to work properly, so instead
    we will simply evict any matching page from the buffer pool.
    
    buf_page_get_gen(): Implement BUF_EVICT_IF_IN_POOL, a new mode
    where the requested page will be evicted if it is found. There
    must be no unwritten changes for the page.
    
    buf_remove_t: Remove. Instead, use trx!=NULL to signify that a write
    to file is desired, and use a separate parameter bool drop_ahi.
    
    buf_LRU_flush_or_remove_pages(), fil_delete_tablespace():
    Replace buf_remove_t.
    
    buf_LRU_remove_pages(), buf_LRU_remove_all_pages(): Remove.
    
    PageConverter::m_mtr: A dummy mini-transaction buffer
    
    PageConverter::PageConverter(): Complete the member initialization list.
    
    PageConverter::operator()(): Evict any 'shadow' pages from the
    buffer pool so that pre-existing (garbage) pages cannot be mistaken
    for pages that exist in the being-imported file.
    
    row_discard_tablespace(): Remove a bogus comment that seems to
    refer to IMPORT TABLESPACE, not DISCARD TABLESPACE.
    51b4366b
row0import.cc 91.6 KB