• Marko Mäkelä's avatar
    MDEV-13167 InnoDB key rotation is not skipping unused pages · 97f9d3c0
    Marko Mäkelä authored
    In key rotation, we must initialize unallocated but previously
    initialized pages, so that if encryption is enabled on a table,
    all clear-text data for the page will eventually be overwritten.
    But we should not rotate keys on pages that were never allocated
    after the data file was created.
    
    According to the latching order rules, after acquiring the
    tablespace latch, no page latches of previously allocated user pages
    may be acquired. So, key rotation should check the page allocation
    status after acquiring the page latch, not before. But, the latching
    order rules also prohibit accessing pages that were not allocated first,
    and then acquiring the tablespace latch. Such behaviour would indeed
    result in a deadlock when running the following tests:
    encryption.innodb_encryption-page-compression
    encryption.innodb-checksum-algorithm
    
    Because the key rotation is accessing potentially unallocated pages, it
    cannot reliably check if these pages were allocated. It can only check
    the page header. If the page number is zero, we can assume that the
    page is unallocated.
    
    fil_crypt_rotate_page(): Detect uninitialized pages by FIL_PAGE_OFFSET.
    Page 0 is never encrypted, and on other pages that are initialized,
    FIL_PAGE_OFFSET must contain the page number.
    
    fil_crypt_is_page_uninitialized(): Remove. It suffices to check the
    page number field in fil_crypt_rotate_page().
    97f9d3c0
fil0crypt.cc 72.9 KB