• Jan Lindström's avatar
    MDEV-24923 : Port selected Galera conflict resolution changes from 10.6 · d217a925
    Jan Lindström authored
    Add condition on trx->state == TRX_STATE_COMMITTED_IN_MEMORY in order to
    avoid unnecessary work. If a transaction has already been committed or
    rolled back, it will release its locks in lock_release() and let
    the waiting thread(s) continue execution.
    
    Let BF wait on lock_rec_has_to_wait and if necessary other BF
    is replayed.
    
    wsrep_trx_order_before
      If BF is not even replicated yet then they are ordered
      correctly.
    
    bg_wsrep_kill_trx
      Make sure victim_trx is found and check also its state. If
      state is TRX_STATE_COMMITTED_IN_MEMORY transaction is
      already committed or rolled back and will release it locks
      soon.
    
    wsrep_assert_no_bf_bf_wait
      Transaction requesting new record lock should be TRX_STATE_ACTIVE
      Conflicting transaction can be in states TRX_STATE_ACTIVE,
      TRX_STATE_COMMITTED_IN_MEMORY or in TRX_STATE_PREPARED.
      If conflicting transaction is already committed in memory or
      prepared we should wait. When transaction is committed in memory we
      held trx mutex, but not lock_sys->mutex. Therefore, we
      could end here before transaction has time to do lock_release()
      that is protected with lock_sys->mutex.
    
    lock_rec_has_to_wait
      We very well can let bf to wait normally as other BF will be
      replayed in case of conflict. For debug builds we will do
      additional sanity checks to catch unsupported bf wait if any.
    
    wsrep_kill_victim
      Check is victim already in TRX_STATE_COMMITTED_IN_MEMORY state and
      if it is we can return.
    
    lock_rec_dequeue_from_page
    lock_rec_unlock
      Remove unnecessary wsrep_assert_no_bf_bf_wait function calls.
      We can very well let BF wait here.
    d217a925
lock0lock.cc 199 KB