mariadb/storage
sjaakola 157b3a637f MDEV-23328 Server hang due to Galera lock conflict resolution
Mutex order violation when wsrep bf thread kills a conflicting trx,
the stack is

          wsrep_thd_LOCK()
          wsrep_kill_victim()
          lock_rec_other_has_conflicting()
          lock_clust_rec_read_check_and_lock()
          row_search_mvcc()
          ha_innobase::index_read()
          ha_innobase::rnd_pos()
          handler::ha_rnd_pos()
          handler::rnd_pos_by_record()
          handler::ha_rnd_pos_by_record()
          Rows_log_event::find_row()
          Update_rows_log_event::do_exec_row()
          Rows_log_event::do_apply_event()
          Log_event::apply_event()
          wsrep_apply_events()

and mutexes are taken in the order

          lock_sys->mutex -> victim_trx->mutex -> victim_thread->LOCK_thd_data

When a normal KILL statement is executed, the stack is

          innobase_kill_query()
          kill_handlerton()
          plugin_foreach_with_mask()
          ha_kill_query()
          THD::awake()
          kill_one_thread()

        and mutexes are

          victim_thread->LOCK_thd_data -> lock_sys->mutex -> victim_trx->mutex

This patch is the plan D variant for fixing potetial mutex locking
order exercised by BF aborting and KILL command execution.

In this approach, KILL command is replicated as TOI operation.
This guarantees total isolation for the KILL command execution
in the first node: there is no concurrent replication applying
and no concurrent DDL executing. Therefore there is no risk of
BF aborting to happen in parallel with KILL command execution
either. Potential mutex deadlocks between the different mutex
access paths with KILL command execution and BF aborting cannot
therefore happen.

TOI replication is used, in this approach,  purely as means
to provide isolated KILL command execution in the first node.
KILL command should not (and must not) be applied in secondary
nodes. In this patch, we make this sure by skipping KILL
execution in secondary nodes, in applying phase, where we
bail out if applier thread is trying to execute KILL command.
This is effective, but skipping the applying of KILL command
could happen much earlier as well.

This also fixed unprotected calls to wsrep_thd_abort
that will use wsrep_abort_transaction. This is fixed
by holding THD::LOCK_thd_data while we abort transaction.

Reviewed-by: Jan Lindström <jan.lindstrom@mariadb.com>
2021-10-29 10:00:17 +03:00
..
archive MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed 2021-01-27 00:50:55 +10:00
blackhole Merge branch '10.2' into 10.3 2020-10-30 17:23:53 +01:00
cassandra MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed 2021-01-27 00:50:55 +10:00
connect Merge branch '10.2' into 10.3 2021-10-28 12:41:27 +02:00
csv MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed 2021-01-27 00:50:55 +10:00
example Lintian complains on spelling error 2019-12-02 12:41:13 +02:00
federated MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed 2021-01-27 00:50:55 +10:00
federatedx MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed 2021-01-27 00:50:55 +10:00
heap MDEV-21373 DBUG compilation - bad synchronization in ha_heap::external_lock() 2021-06-04 15:02:48 +02:00
innobase MDEV-23328 Server hang due to Galera lock conflict resolution 2021-10-29 10:00:17 +03:00
maria Merge 10.2 into 10.3 2021-10-28 07:50:05 +03:00
mroonga Fix Groonga crash on MIPS: Correctly link to libatomic 2021-10-19 19:22:54 +03:00
myisam Merge 10.2 into 10.3 2021-10-13 11:38:21 +03:00
myisammrg Merge branch '10.2' into 10.3 2020-08-03 13:41:29 +02:00
oqgraph Merge 10.2 into 10.3 2021-07-27 10:47:17 +03:00
perfschema Merge branch '10.2' into 10.3 2021-09-07 16:32:35 +03:00
rocksdb Merge 10.2 into 10.3 2021-10-28 07:50:05 +03:00
sequence MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed 2021-01-27 00:50:55 +10:00
sphinx MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed 2021-01-27 00:50:55 +10:00
spider MDEV-19866 follow-up 2021-10-18 13:19:03 +09:00
test_sql_discovery Merge 10.2 into 10.3 2021-10-28 07:50:05 +03:00
tokudb Merge branch '10.2' into 10.3 2021-10-28 12:41:27 +02:00