• Marko Mäkelä's avatar
    MDEV-22497 [ERROR] InnoDB: Unable to purge a record · 26aab96e
    Marko Mäkelä authored
    The InnoDB insert buffer was upgraded in MySQL 5.5 into a change
    buffer that also covers delete-mark and delete (purge) operations.
    
    There is an important constraint for delete operations: a B-tree
    leaf page must not become empty unless the entire tree becomes empty,
    consisting of an empty root page. Because change buffer merges only
    occur on a single leaf page at a time, delete operations must not be
    buffered if it is possible that the last record of the page could be
    deleted. (In that case, we would refuse to use the change buffer, and
    if we really delete the last record, we would shrink the index tree.)
    
    The function ibuf_get_volume_buffered_hash() is part of our insurance
    that the page would not become empty. It is supposed to map each
    buffered INSERT or DELETE_MARK record payload into a hash value.
    We will only count each such record as a distinct key if there is no
    hash collision. DELETE operations will always decrement the predicted
    number fo records in the page.
    
    Due to a bug in the function, we would actually compute the hash value
    not only on the record payload, but also on some following bytes,
    in case the record contains NULL values. In MySQL Bug #61104, we had
    some examples of this dating back to 2012. But back then, we failed to
    reproduce the bug, and in commit d84c9557
    we simply demoted the hard assertion to a message printout and a debug
    assertion failure.
    
    ibuf_get_volume_buffered_hash(): Correctly compute the hash value
    of the payload bytes only. Note: we will consider
    ('foo','bar'),(NULL,'foobar'),('foob','ar') to be equal, but this
    is not a problem, because in case of a hash collision, we could
    also consider ('boo','far') to be equal, and underestimate the number
    of records in the page, leading to refusing to buffer a DELETE.
    26aab96e
ibuf0ibuf.cc 145 KB