• Darshan M N's avatar
    Bug#23631471 BUF_BLOCK_ALIGN() MAKES INCORRECT ASSUMPTIONS ABOUT CHUNK SIZE · c6713f65
    Darshan M N authored
    Issue:
    ======
    Currently the approach we take to find the chunk corresponding to a given
    pointer uses srv_buf_pool_chunk_unit based on the assumption that
    srv_buf_pool_chunk_unit is the total size of all pages in a buffer pool
    chunk. We first step back by srv_buf_pool_chunk_unit bytes and use
    std::map::upper_bound() to find the first chunk in the map whose key >= the
    resulting pointer.
    
    However, the real size of a chunk (and thus, the total size of its pages)
    may differ from the value configured with innodb_buffer_pool_chunk_size
    due to rounding up to the OS page size. So, in some cases the above logic
    gives us the wrong chunk.
    
    Fix:
    ====
    We find out the chunk corresponding to the give pointer without using
    srv_buf_pool_chunk_unit. This is done by using std::map::upper_bound()
    to find the next chunk in the map which appears right after the pointer and
    decrementing the iterator, which would give us the chunk the pointer
    belongs to.
    
    Contribution by Alexey Kopytov.
    
    RB: 13347
    Reviewed-by: default avatarDebarun Banerjee <debarun.banerjee@oracle.com>
    c6713f65
buf0buf.cc 206 KB