• Kristian Nielsen's avatar
    MDEV-34696: do_gco_wait() completes too early on InnoDB dict stats updates · b4c2e239
    Kristian Nielsen authored
    Before doing mark_start_commit(), check that there is no pending deadlock
    kill. If there is a pending kill, we won't commit (we will abort, roll back,
    and retry). Then we should not mark the commit as started, since that could
    potentially make the following GCO start too early, before we completed the
    commit after the retry.
    
    This condition could trigger in some corner cases, where InnoDB would take
    temporarily table/row locks that are released again immediately, not held
    until the transaction commits. This happens with dict_stats updates and
    possibly auto-increment locks.
    
    Such locks can be passed to thd_rpl_deadlock_check() and cause a deadlock
    kill to be scheduled in the background. But since the blocking locks are
    held only temporarily, they can be released before the background kill
    happens. This way, the kill can be delayed until after mark_start_commit()
    has been called. Thus we need to check the synchronous indication
    rgi->killed_for_retry, not just the asynchroneous thd->killed.
    Signed-off-by: default avatarKristian Nielsen <knielsen@knielsen-hq.org>
    b4c2e239
rpl_rli.cc 85.1 KB