1. 19 Jan, 2021 3 commits
  2. 18 Jan, 2021 1 commit
    • sjaakola's avatar
      MDEV-23851 BF-BF Conflict issue because of UK GAP locks · beaea31a
      sjaakola authored
      Some DML operations on tables having unique secondary keys cause scanning
      in the secondary index, for instance to find potential unique key violations
      in the seconday index. This scanning may involve GAP locking in the index.
      As this locking happens also when applying replication events in high priority
      applier threads, there is a probabality for lock conflicts between two wsrep
      high priority threads.
      
      This PR avoids lock conflicts of high priority wsrep threads, which do
      secondary index scanning e.g. for duplicate key detection.
      
      The actual fix is the patch in sql_class.cc:thd_need_ordering_with(), where
      we allow relaxed GAP locking protocol between wsrep high priority threads.
      wsrep high priority threads (replication appliers, replayers and TOI processors)
      are ordered by the replication provider, and they will not need serializability
      support gained by secondary index GAP locks.
      
      PR contains also a mtr test, which exercises a scenario where two replication
      applier threads have a false positive conflict in GAP of unique secondary index.
      The conflicting local committing transaction has to replay, and the test verifies
      also that the replaying phase will not conflict with the latter repllication applier.
      Commit also contains new test scenario for galera.galera_UK_conflict.test,
      where replayer starts applying after a slave applier thread, with later seqno,
      has advanced to commit phase. The applier and replayer have false positive GAP
      lock conflict on secondary unique index, and replayer should ignore this.
      This test scenario caused crash with earlier version in this PR, and to fix this,
      the secondary index uniquenes checking has been relaxed even further.
      
      Now innodb trx_t structure has new member: bool wsrep_UK_scan, which is set to
      true, when high priority thread is performing unique secondary index scanning.
      The member trx_t::wsrep_UK_scan is defined inside WITH_WSREP directive, to make
      it possible to prepare a MariaDB build where this additional trx_t member is
      not present and is not used in the code base. trx->wsrep_UK_scan is set to true
      only for the duration of function call for: lock_rec_lock() trx->wsrep_UK_scan
      is used only in lock_rec_has_to_wait() function to relax the need to wait if
      wsrep_UK_scan is set and conflicting transaction is also high priority.
      Reviewed-by: default avatarJan Lindström <jan.lindstrom@mariadb.com>
      beaea31a
  3. 15 Jan, 2021 2 commits
  4. 14 Jan, 2021 2 commits
  5. 13 Jan, 2021 3 commits
  6. 12 Jan, 2021 2 commits
    • Varun Gupta's avatar
      MDEV-23826: ORDER BY in view definition leads to wrong result with GROUP BY on query using view · ab271ee7
      Varun Gupta authored
      Introduced val_time_packed and val_datetime_packed  functions for Item_direct_ref
      to make sure to get the value from the item it is referring to.
      
      The issue for incorrect result was that the item was getting its value
      from the temporary table rather than from the view.
      ab271ee7
    • Varun Gupta's avatar
      MDEV-23753: SIGSEGV in Column_stat::store_stat_fields · 3b94309a
      Varun Gupta authored
      For EITS collection min and max fields are allocated for each column
      that is set in the read_set bitmap of a table. This allocation of min and max
      fields happens inside alloc_statistics_for_table.
      
      For a partitioned table ha_rnd_init is called inside the function
      collect_statistics_for_table which sets the read_set bitmap for the columns
      inside the partition expression. This happens only when there is a write lock
      on the partitioned table.
      But the allocation happens before this, so min and max fields are not allocated
      for the columns involved in the partition expression.
      This resulted in a crash, as the EITS statistics were collected but there was
      no min and max field to store the value to.
      
      The fix would be to call ha_rnd_init inside the function alloc_statistics_for_table
      that would make sure that min and max fields are allocated for the columns
      involved in the partition expression.
      3b94309a
  7. 11 Jan, 2021 14 commits
  8. 09 Jan, 2021 1 commit
  9. 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
  10. 06 Jan, 2021 1 commit
  11. 04 Jan, 2021 6 commits