• Thirunarayanan Balathandayuthapani's avatar
    MDEV-15528 Punch holes when pages are freed · a35b4ae8
    Thirunarayanan Balathandayuthapani authored
    When a InnoDB data file page is freed, its contents becomes garbage,
    and any storage allocated in the data file is wasted. During flushing,
    InnoDB initializes the page with zeros if scrubbing is enabled. If the
    tablespace is compressed then InnoDB should punch a hole else ignore the
    flushing of the freed page.
    
    buf_page_t:
    - Replaced the variable file_page_was_freed, init_on_flush in buf_page_t
    with status enum variable.
    - Changed all debug assert of file_page_was_freed to DBUG_ASSERT
    of buf_page_t::status
    
    Removed buf_page_set_file_page_was_freed(),
    buf_page_reset_file_page_was_freed().
    
    buf_page_free(): Newly added function which takes X-lock on the page
    before marking the status as FREED. So that InnoDB flush handler can
    avoid concurrent flush of the freed page. Also while flushing the page,
    InnoDB make sure that redo log which does freeing of the page also written
    to the disk. Currently, this function only marks the page as FREED if
    it is in buffer pool
    
    buf_flush_freed_page(): Newly added function which initializes zeros
    asynchorously if innodb_immediate_scrub_data_uncompressed is enabled.
    Punch a hole to the file synchorously if page_compressed is enabled.
    Reset the io_fix to NORMAL. Release the block from flush list and
    associated mutex before writing zeros or punch a hole to the file.
    
    buf_flush_page(): Removed the unnecessary usage of temporary
    variable "flush"
    
    fil_io(): Introduce new parameter called punch_hole. It allows fil_io()
    to punch the hole to the file for the given offset.
    
    buf_page_create(): Let the callers assign buf_page_t::status.
    Every caller should eventually invoke mtr_t::init().
    
    fsp_page_create(): Remove the unused mtr_t parameter.
    
    In all other callers of buf_page_create() except fsp_page_create(),
    before invoking mtr_t::init(), invoke
    mtr_t::sx_latch_at_savepoint() or mtr_t::x_latch_at_savepoint().
    
    mtr_t::init(): Initialize buf_page_t::status also for the temporary
    tablespace (when redo logging is disabled), to avoid assertion failures.
    a35b4ae8
buf0buf.cc 173 KB