1. 11 Jan, 2021 1 commit
  2. 09 Jan, 2021 1 commit
  3. 08 Jan, 2021 5 commits
    • Jan Lindström's avatar
      MDEV-23536 : Race condition between KILL and transaction commit · 775fccea
      Jan Lindström authored
      A race condition may occur between the execution of transaction commit,
      and an execution of a KILL statement that would attempt to abort that
      transaction.
      
      MDEV-17092 worked around this race condition by modifying InnoDB code.
      After that issue was closed, Sergey Vojtovich pointed out that this
      race condition would better be fixed above the storage engine layer:
      
      If you look carefully into the above, you can conclude that
      thd->free_connection() can be called concurrently with
      KILL/thd->awake(). Which is the bug. And it is partially fixed in
      THD::~THD(), that is destructor waits for KILL completion:
      
      Fix: Add necessary mutex operations to THD::free_connection()
      and move WSREP specific code also there. This ensures that no
      one is using THD while we do free_connection(). These mutexes
      will also ensures that there can't be concurrent KILL/THD::awake().
      
      innobase_kill_query
        We can now remove usage of trx_sys_mutex introduced on MDEV-17092.
      
      trx_t::free()
        Poison trx->state and trx->mysql_thd
      
      This patch is validated with an RQG run similar to the one that
      reproduced MDEV-17092.
      775fccea
    • Marko Mäkelä's avatar
      18254c18
    • Nikita Malyavin's avatar
      fixup MDEV-17556: fix mroonga · 61a362c9
      Nikita Malyavin authored
      61a362c9
    • Marko Mäkelä's avatar
      cd1e5d65
    • Nikita Malyavin's avatar
      MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed · e25623e7
      Nikita Malyavin authored
      The assertion failed in handler::ha_reset upon SELECT under
      READ UNCOMMITTED from table with index on virtual column.
      
      This was the debug-only failure, though the problem is mush wider:
      * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw
       bitmap.
      * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP
      * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE
      * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and
       sometimes all_set and tmp_set, are assigned to the pointers.
      * Sometimes tmp_use_all_columns is used to substitute the raw bitmap
       directly with all_set.bitmap
      * Sometimes even bitmaps are directly modified, like in
      TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called.
      
      The last three bullets in the list, when used together (which is mostly
      always) make the program flow cumbersome and impossible to follow,
      notwithstanding the errors they cause, like this MDEV-17556, where tmp_set
      pointer was assigned to read_set, write_set and vcol_set, then its bitmap
      was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call,
      and then bitmap_clear_all(&tmp_set) was applied to all this.
      
      To untangle this knot, the rule should be applied:
      * Never substitute bitmaps! This patch is about this.
       orig_*, all_set bitmaps are never substituted already.
      
      This patch changes the following function prototypes:
      * tmp_use_all_columns, dbug_tmp_use_all_columns
       to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map*
      * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept
       MY_BITMAP* instead of my_bitmap_map*
      
      These functions now will substitute read_set/write_set/vcol_set directly,
      and won't touch underlying bitmaps.
      e25623e7
  4. 07 Jan, 2021 3 commits
    • Alice Sherepa's avatar
      MDEV-16272 rpl.rpl_semisync_ali_issues failed in buildbot, SHOW variable was... · df1eefb2
      Alice Sherepa authored
      MDEV-16272 rpl.rpl_semisync_ali_issues failed in buildbot, SHOW variable was done instead of waiting for the value of that variable
      df1eefb2
    • Oleksandr Byelkin's avatar
      Urgent fix of MDEV-23446 fix: · 188b3283
      Oleksandr Byelkin authored
      Use the same variable in both scopes (from where we have "goto error" and target of the goto)
      188b3283
    • Nikita Malyavin's avatar
      MDEV-17891 Assertion failure upon attempt to replace into a full table · d846b55d
      Nikita Malyavin authored
      Problem: Assertion `transactional_table || !changed ||
      thd->transaction.stmt.modified_non_trans_table' failed due REPLACE into a
      versioned table.
      
      It is not specific to system versioning/pertitioning/heap, but this
      combination makes it much easier to reproduce.
      
      The thing is to make first ha_update_row call succeed to make
      info->deleted != 0. And then make REPLACE fail by any reason.
      
      In this scenario we overflow versioned partition, so next ha_update_row
      succeeds, but corresponding ha_write_row fails to insert history record.
      
      Fix: modified_non_trans_table is set in one missed place
      d846b55d
  5. 06 Jan, 2021 1 commit
  6. 05 Jan, 2021 3 commits
  7. 04 Jan, 2021 7 commits
  8. 31 Dec, 2020 1 commit
  9. 29 Dec, 2020 1 commit
  10. 28 Dec, 2020 4 commits
    • Marko Mäkelä's avatar
      Merge 10.2 into 10.3 · 7f037b8c
      Marko Mäkelä authored
      7f037b8c
    • Alexey Botchkov's avatar
      MDEV-19442 server_audit plugin doesn't consider proxy users in... · 78292047
      Alexey Botchkov authored
      MDEV-19442 server_audit plugin doesn't consider proxy users in server_audit_excl_users/server_audit_incl_users.
      
      Check the proxy user just as the connection user against the
      incl_users_list and excl_users_list.
      78292047
    • Marko Mäkelä's avatar
      MDEV-24449 Corruption of system tablespace or last recovered page · 5b9ee8d8
      Marko Mäkelä authored
      This corresponds to 10.5 commit 39378e13.
      
      With a patched version of the test innodb.ibuf_not_empty (so that
      it would trigger crash recovery after using the change buffer),
      and patched code that would modify the os_thread_sleep() in
      recv_apply_hashed_log_recs() to be 1ms as well as add a sleep of
      the same duration to the end of recv_recover_page() when
      recv_sys->n_addrs=0, we can demonstrate a race condition.
      
      After disabling some debug checks in buf_all_freed_instance(),
      buf_pool_invalidate_instance() and buf_validate(), we managed to
      trigger an assertion failure in fseg_free_step(), on the XDES_FREE_BIT.
      In other words, an trx_undo_seg_free() call during
      trx_rollback_resurrected() was attempting a double-free of a page.
      This was repeated about once in 400 to 500 test runs. With the fix
      applied, the test passed 2,000 runs.
      
      recv_apply_hashed_log_recs(): Do not only wait for recv_sys->n_addrs
      to reach 0, but also wait for buf_get_n_pending_read_ios() to reach 0,
      to guarantee that buf_page_io_complete() will not be executing
      ibuf_merge_or_delete_for_page().
      5b9ee8d8
    • sjaakola's avatar
      MDEV-23851 MDEV-24229 BF-BF conflict issues · 8e3e87d2
      sjaakola authored
      Issues MDEV-23851 and MDEV-24229 are probably duplicates and are caused by the new self-asserting function lock0lock.cc:wsrep_assert_no_bf_bf_wait().
      The criteria for asserting is too strict and does not take in consideration scenarios of "false positive" lock conflicts, which are resolved by replaying the local transaction.
      As a fix, this PR is relaxing the assert criteria by two conditions, which skip assert if high priority transactions are locking in correct order or if conflicting high priority lock holder is aborting and has just not yet released the lock.
      
      Alternative fix would be to remove wsrep_assert_no_bf_bf_wait() altogether, or remove the assert in this function and let it only print warnings in error log.
      But in my high conflict rate multi-master test scenario, this relaxed asserting appears to be safe.
      
      This PR also removes two wsrep_report_bf_lock_wait() calls in innodb lock manager, which cause mutex access assert in debug builds.
      
      Foreign key appending missed handling of data types of float and double in INSERT execution. This is not directly related to the actual issue here but is fixed in this PR nevertheless. Missing these foreign keys values in certification could cause problems in some multi-master load scenarios.
      
      Finally, some problem reports suggest that some of the issues reported in MDEV-23851 might relate to false positive lock conflicts over unique secondary index gaps. There is separate work for relaxing UK index gap locking of replication appliers, and separate PR will be submitted for it, with a related mtr test as well.
      8e3e87d2
  11. 24 Dec, 2020 4 commits
  12. 23 Dec, 2020 3 commits
  13. 22 Dec, 2020 6 commits
    • Sergei Petrunia's avatar
      8d8370e3
    • Sergei Petrunia's avatar
      MDEV-24444: ASAN use-after-poison in Item_func_in::get_func_mm_tree with NOT IN · df4f4bd8
      Sergei Petrunia authored
      Fix a trivial error in the fix for MDEV-21958: check the key in the right
      table.
      df4f4bd8
    • Aleksey Midenkov's avatar
      MDEV-23446 UPDATE does not insert history row if the row is not changed · 9b38ed4c
      Aleksey Midenkov authored
      Add history row outside of compare_record() check. For TRX_ID
      versioning we have to fail can_compare_record to force InnoDB update
      which adds history row; and there in ha_innobase::update_row() is
      additional "row changed" check where we force history row anyway.
      9b38ed4c
    • Aleksey Midenkov's avatar
      MDEV-23644 Assertion on evaluating foreign referential action for... · 932ec586
      Aleksey Midenkov authored
      MDEV-23644 Assertion on evaluating foreign referential action for self-reference in system versioned table
      
      First part of the fix (row0mysql.cc) addresses external columns when adding history
      row on referential action. The full data must be retrieved before the
      row is inserted.
      
      Second part of the fix (the rest) avoids duplicate primary key error between
      the history row generated on referential action and the history row
      generated by SQL command. Both command and referential action can
      happen on same table since foreign key can be self-reference (parent
      and child tables are same). Moreover, the self-reference can refer
      multiple rows when the key is non-unique. In such case history is
      generated by referential action occured on first row but processed all
      rows by a matched key. The second round is when the next row is
      processed by a command but history already exists. In such case we
      check TRX_ID of existing history row and if it is the same we assume
      the above situation and skip adding one more history row or failing
      the command.
      932ec586
    • Aleksey Midenkov's avatar
      MDEV-21138 Assertion `col->ord_part' or `f.col->ord_part' failed in row_build_index_entry_low · 7410ff43
      Aleksey Midenkov authored
      First part (row0mysql.cc) fixes ins_node_set_new_row() usage workflow
      as it is designed to operate on empty row (see row_get_prebuilt_insert_row()
      for example).
      
      Second part (row0ins.cc) fixes duplicate key error in FTS_DOC_ID_INDEX
      since history rows must not generate entries in that index. We detect
      FTS_DOC_ID_INDEX by a number of attributes and skip it if the row is
      historical.
      
      Misc fixes:
      
      row_build_index_entry_low() does not accept non-NULL tuple
      for FTS index (subject assertion fails), assertion (index->type !=
      DICT_FTS) adds code understanding.
      
      Now as historical_row is copied in row_update_vers_insert() there is
      no need to copy the row twice: ROW_COPY_POINTERS is used to build
      historical_row initially.
      
      dbug_print_rec() debug functions.
      7410ff43
    • Aleksey Midenkov's avatar
      MDEV-22178 Assertion `info->alias.str' failed in... · d4258f3a
      Aleksey Midenkov authored
      MDEV-22178 Assertion `info->alias.str' failed in partition_info::check_partition_info instead of ER_VERS_WRONG_PARTS
      
      Assign create_info->alias for ALTER TABLE since it is NULL and later
      accessed for printing error message.
      d4258f3a