1. 29 Nov, 2023 1 commit
    • Vlad Lesin's avatar
      MDEV-28682 gcol.gcol_purge contaminates further execution of innodb.gap_locks · 968061fd
      Vlad Lesin authored
      ha_innobase::extra() invokes check_trx_exists() unconditionally even for
      not supported operations. check_trx_exists() creates and registers trx_t
      object if THD does not contain pointer to it. If ha_innobase::extra() does
      not support some operation, it just invokes check_trx_exists() and quites.
      If check_trx_exists() creates and registers new trx_t object for such
      operation, it will never be freed and deregistered.
      
      For example, if ha_innobase::extra() is invoked from purge thread with
      operation = HA_EXTRA_IS_ATTACHED_CHILDREN, like it goes in
      gcol.gcol_purge test, trx_t object will be registered, but not
      deregisreted, and this causes innodb.gap_lock failure, as "SHOW ENGINE
      INNODB STATUS" shows information about unexpected transaction at the end
      of trx_sys.trx_list.
      
      The fix is not to invoke check_trx_exists() for unsupported operations
      in ha_innobase::extra().
      
      Reviewed by: Marko Mäkelä
      968061fd
  2. 28 Nov, 2023 2 commits
    • Monty's avatar
      Remove deprication from mariadbd --debug · 387b92df
      Monty authored
      --debug is supported by allmost all our other binaries and we should keep
      it also in the server to keep option names similar.
      387b92df
    • Alexander Barkov's avatar
      MDEV-32879 Server crash in my_decimal::operator= or unexpected ER_DUP_ENTRY... · f436b4a5
      Alexander Barkov authored
      MDEV-32879 Server crash in my_decimal::operator= or unexpected ER_DUP_ENTRY upon comparison with INET6 and similar types
      
      During the 10.5->10.6 merge please use the 10.6 code on conflicts.
      
      This is the 10.5 version of the patch (a backport of the 10.6 version).
      Unlike 10.6 version, it makes changes in plugin/type_inet/sql_type_inet.*
      rather than in sql/sql_type_fixedbin.h
      
      Item_bool_rowready_func2, Item_func_between, Item_func_in
      did not check if a not-NULL argument of an arbitrary data type
      can produce a NULL value on conversion to INET6.
      
      This caused a crash on DBUG_ASSERT() in conversion failures,
      because the function returned SQL NULL for something that
      has Item::maybe_null() equal to false.
      
      Adding setting NULL-ability in such cases.
      
      Details:
      
      - Removing the code in Item_func::setup_args_and_comparator()
        performing character set aggregation with optional narrowing.
        This aggregation is done inside Arg_comparator::set_cmp_func_string().
        So this code was redundant
      
      - Removing Item_func::setup_args_and_comparator() as it git simplified to
        just to two lines:
          convert_const_compared_to_int_field(thd);
          return cmp->set_cmp_func(thd, this, &args[0], &args[1], true);
        Using these lines directly in:
          - Item_bool_rowready_func2::fix_length_and_dec()
          - Item_func_nullif::fix_length_and_dec()
      
      - Adding a new virtual method:
        - Type_handler::Item_bool_rowready_func2_fix_length_and_dec().
      
      - Adding tests detecting if the data type conversion can return SQL NULL into
        the following methods of Type_handler_inet6:
        - Item_bool_rowready_func2_fix_length_and_dec
        - Item_func_between_fix_length_and_dec
        - Item_func_in_fix_comparator_compatible_types
      f436b4a5
  3. 22 Nov, 2023 2 commits
    • Anel Husakovic's avatar
    • Marko Mäkelä's avatar
      MDEV-32861 InnoDB hangs when running out of I/O slots · 78c9a12c
      Marko Mäkelä authored
      When the constant OS_AIO_N_PENDING_IOS_PER_THREAD is changed from 256 to 1
      and the server is run with the minimum parameters
      innodb_read_io_threads=1 and innodb_write_io_threads=2, two hangs
      were observed.
      
      tpool::cache<T>::put(T*): Ensure that get() in io_slots::acquire()
      will be woken up when the cache previously was empty.
      
      buf_pool_t::io_buf_t::reserve(): Schedule a possibly partial doublewrite
      batch so that os_aio_wait_until_no_pending_writes() has a chance of
      returning. Add a Boolean parameter and pass wait_for_reads=false inside
      buf_page_decrypt_after_read(), because those calls will be executed
      inside a read completion callback, and therefore
      os_aio_wait_until_no_pending_reads() would block indefinitely.
      78c9a12c
  4. 21 Nov, 2023 1 commit
    • Marko Mäkelä's avatar
      MDEV-32820 Race condition between trx_purge_free_segment() and trx_undo_create() · de31ca6a
      Marko Mäkelä authored
      trx_purge_free_segment(): If fseg_free_step_not_header() needs to be
      called multiple times, acquire an exclusive latch on the
      rollback segment header page after restarting the mini-transaction
      so that the rest of this function cannot execute concurrently
      with trx_undo_create() on the same rollback segment.
      
      This fixes a regression that was introduced in
      commit c14a3943 (MDEV-30753).
      
      Note: The buffer-fixes that we are holding across the mini-transaction
      restart will prevent the pages from being evicted from the buffer pool.
      They may be accessed by other threads or written back to data files
      while we are not holding exclusive latches.
      
      Reviewed by: Vladislav Lesin
      de31ca6a
  5. 19 Nov, 2023 3 commits
  6. 16 Nov, 2023 2 commits
    • Marko Mäkelä's avatar
      MDEV-26055: Correct the formula for adaptive flushing · 9a545eb6
      Marko Mäkelä authored
      This is a 10.5 backport of 10.6
      commit d4265fbd.
      
      page_cleaner_flush_pages_recommendation(): If dirty_pct is
      between innodb_max_dirty_pages_pct_lwm
      and innodb_max_dirty_pages_pct,
      scale the effort relative to how close we are to
      innodb_max_dirty_pages_pct.
      
      The previous formula was missing a multiplication by 100.
      9a545eb6
    • Marko Mäkelä's avatar
      MDEV-26055: Improve adaptive flushing · a3d0d5fc
      Marko Mäkelä authored
      This is a 10.5 backport from 10.6
      commit 9593cccf.
      
      Adaptive flushing is enabled by setting innodb_max_dirty_pages_pct_lwm>0
      (not default) and innodb_adaptive_flushing=ON (default).
      There is also the parameter innodb_adaptive_flushing_lwm
      (default: 10 per cent of the log capacity). It should enable some
      adaptive flushing even when innodb_max_dirty_pages_pct_lwm=0.
      That is not being changed here.
      
      This idea was first presented by Inaam Rana several years ago,
      and I discussed it with Jean-François Gagné at FOSDEM 2023.
      
      buf_flush_page_cleaner(): When we are not near the log capacity limit
      (neither buf_flush_async_lsn nor buf_flush_sync_lsn are set),
      also try to move clean blocks from the buf_pool.LRU list to buf_pool.free
      or initiate writes (but not the eviction) of dirty blocks, until
      the remaining I/O capacity has been consumed.
      
      buf_flush_LRU_list_batch(): Add the parameter bool evict, to specify
      whether dirty least recently used pages (from buf_pool.LRU) should
      be evicted immediately after they have been written out. Callers outside
      buf_flush_page_cleaner() will pass evict=true, to retain the existing
      behaviour.
      
      buf_do_LRU_batch(): Add the parameter bool evict.
      Return counts of evicted and flushed pages.
      
      buf_flush_LRU(): Add the parameter bool evict.
      Assume that the caller holds buf_pool.mutex and
      will invoke buf_dblwr.flush_buffered_writes() afterwards.
      
      buf_flush_list_holding_mutex(): A low-level variant of buf_flush_list()
      whose caller must hold buf_pool.mutex and invoke
      buf_dblwr.flush_buffered_writes() afterwards.
      
      buf_flush_wait_batch_end_acquiring_mutex(): Remove. It is enough to have
      buf_flush_wait_batch_end().
      
      page_cleaner_flush_pages_recommendation(): Avoid some floating-point
      arithmetics.
      
      buf_flush_page(), buf_flush_check_neighbor(), buf_flush_check_neighbors(),
      buf_flush_try_neighbors(): Rename the parameter "bool lru" to "bool evict".
      
      buf_free_from_unzip_LRU_list_batch(): Remove the parameter.
      Only actual page writes will contribute towards the limit.
      
      buf_LRU_free_page(): Evict freed pages of temporary tables.
      
      buf_pool.done_free: Broadcast whenever a block is freed
      (and buf_pool.try_LRU_scan is set).
      
      buf_pool_t::io_buf_t::reserve(): Retry indefinitely.
      During the test encryption.innochecksum we easily run out of
      these buffers for PAGE_COMPRESSED or ENCRYPTED pages.
      
      Tested by Matthias Leich and Axel Schwenke
      a3d0d5fc
  7. 15 Nov, 2023 3 commits
    • Rex's avatar
      Merge 10.4 into 10.5 · 8b509a5d
      Rex authored
      8b509a5d
    • Marko Mäkelä's avatar
      MDEV-32757 innodb_undo_log_truncate=ON is not crash safe · a0f02f74
      Marko Mäkelä authored
      trx_purge_truncate_history(): Do not prematurely mark dirty pages
      as clean. This will be done in mtr_t::commit_shrink() as part of
      Shrink::operator()(mtr_memo_slot_t*). Also, register each dirty page
      only once in the mini-transaction.
      
      fsp_page_create(): Adjust and simplify the page creation during
      undo tablespace truncation. We can directly reuse pages that are
      already in buf_pool.page_hash.
      
      This fixes a regression that was caused by
      commit f5794e1d (MDEV-26445).
      
      Tested by: Matthias Leich
      Reviewed by: Thirunarayanan Balathandayuthapani
      a0f02f74
    • Tuukka Pasanen's avatar
      MDEV-32689: Remove Ubuntu Bionic from 10.5 · 15bb8acf
      Tuukka Pasanen authored
      Commit Removed Ubuntu Bionic from
      debian/autobake-debs.sh as it's not used
      anymore to build official MariaDB images
      
      REMINDER TO MERGER: This commit should not
      be merged up to 10.6 or forward
      15bb8acf
  8. 14 Nov, 2023 2 commits
  9. 13 Nov, 2023 1 commit
  10. 11 Nov, 2023 2 commits
  11. 10 Nov, 2023 1 commit
  12. 09 Nov, 2023 1 commit
    • Marko Mäkelä's avatar
      MDEV-32737 innodb.log_file_name fails on Assertion `after_apply ||... · e0c65784
      Marko Mäkelä authored
      MDEV-32737 innodb.log_file_name fails on Assertion `after_apply || !(blocks).end in recv_sys_t::clear
      
      recv_group_scan_log_recs(): Set the debug flag recv_sys.after_apply
      after actually completing the log scan.
      
      In the test, suppress some errors that may be reported when
      the crash recovery of RENAME TABLE t1 TO t2 is preceded by
      copying t2.ibd to t1.ibd.
      e0c65784
  13. 08 Nov, 2023 2 commits
  14. 04 Nov, 2023 1 commit
  15. 03 Nov, 2023 1 commit
    • Kristian Nielsen's avatar
      MDEV-32672: Don't hold LOCK_thd_data over commit_ordered · 3c1f324a
      Kristian Nielsen authored
      Partial revert of this commit:
      
        commit 6b685ea7
        Author: Sergei Golubchik <serg@mariadb.org>
        Date:   Wed Sep 28 18:55:15 2022 +0200
      
      Don't hold LOCK_thd_data over run_commit_ordered(). Holding the mutex
      is unnecessary and will deadlock if any code in a commit_ordered
      handlerton call tries to take the mutex to change THD local data.
      
      Instead, set the current_thd for the duration of the call to keep
      asserts happy around LOCK_thd_data.
      Signed-off-by: default avatarKristian Nielsen <knielsen@knielsen-hq.org>
      3c1f324a
  16. 30 Oct, 2023 4 commits
    • Anel Husakovic's avatar
      MDEV-32462: mysql_upgrade -s still checks for non system tables · b06ac9a8
      Anel Husakovic authored
      - Rename files as requested by Vicentiu:
      ```
       mysql_json_mysql_upgrade.test                    -> mysql_upgrade_mysql_json.test
       mysql_json_mysql_upgrade_with_plugin_loaded.test -> mysql_upgrade_mysql_json_with_plugin_loaded.test
       mysql_json_mysql_upgrade_system_tables.test      -> mysql_upgrade_mysql_json_system_tables.test
      ```
      - Related to PR #2790
      - Reviewer: <daniel@mariadb.org>, <vicentiu@mariadb.org>
      b06ac9a8
    • Anel Husakovic's avatar
      MDEV-32462: mysql_upgrade -s still checks for non system tables · 4eb8aeee
      Anel Husakovic authored
      - Prevent opening of any user tables in case `upgrade-system-table`
      option is used.
      - Still there may be uninstalled data types in `mysql` system table so
      allow it to perform.
      - Closes PR #2790
      - Reviewer: <daniel@mariadb.org>, <vicentiu@mariadb.org>
      4eb8aeee
    • Anel Husakovic's avatar
      MDEV-26875: Wrong user in SET DEFAULT ROLE error · ee773753
      Anel Husakovic authored
      - Regression introduced in 957cb7b7
      - Patch 4abb8216 change `mysql.user` to `mysql.global_priv` for
      `add_anonymous.inc`, update `delete_anonymous.inc`.
      - Added test case with `--skip-name-resolve`
      - Add test case with anonymous user
        - Disable this test for windows, assignes current user to anonymous
        user.
      
      Reviewed by: <serg@mariadb.com>
      ee773753
    • Oleksandr Byelkin's avatar
      Make the test more stable · c4143f90
      Oleksandr Byelkin authored
      c4143f90
  17. 28 Oct, 2023 1 commit
  18. 27 Oct, 2023 7 commits
    • Oleksandr Byelkin's avatar
      1cd8a5ef
    • Sergei Petrunia's avatar
      MDEV-32351: Significant slowdown with outer joins: Test coverage · 9bf2e5e3
      Sergei Petrunia authored
      Make ANALYZE FORMAT=JSON print block-nl-join.r_unpack_ops when
      analyze_print_r_unpack_ops debug flag is set.
      
      Then, add a testcase.
      9bf2e5e3
    • Sergei Petrunia's avatar
      ANALYZE FORMAT=JSON: Backport block-nl-join.r_unpack_time_ms from 11.0 +fix MDEV-30830. · 4ed59006
      Sergei Petrunia authored
      Also fix it to work with hashed join (MDEV-30830).
      
      Reviewed by: Monty <monty@mariadb.org>
      4ed59006
    • Igor Babaev's avatar
      MDEV-32351 Significant slowdown for query with many outer joins · 954a6dec
      Igor Babaev authored
      This patch fixes a performance regression introduced in the patch for the
      bug MDEV-21104. The performance regression could affect queries for which
      join buffer was used for an outer join such that its on expression from
      which a conjunctive condition depended only on outer tables can be
      extracted. If the number of records in the join buffer for which this
      condition was false greatly exceeded the number of other records the
      slowdown could be significant.
      
      If there is a conjunctive condition extracted from the ON expression
      depending only on outer tables this condition is evaluated when interesting
      fields of each survived record of outer tables are put into the join buffer.
      Each such set of fields for any join operation is supplied with a match
      flag field used to generate null complemented rows. If the result of the
      evaluation of the condition is false the flag is set to MATCH_IMPOSSIBLE.
      When looking in the join buffer for records matching a record of the
      right operand of the outer join operation the records with such flags
      are not needed to be unpacked into record buffers for evaluation of on
      expressions.
      
      The patch for MDEV-21104 fixing some problem of wrong results when
      'not exists' optimization by mistake broke the code that allowed to
      ignore records with the match flag set to MATCH_IMPOSSIBLE when looking
      for matching records. As a result such records were unpacked for each
      record of the right operand of the outer join operation. This caused
      significant execution penalty in some cases.
      
      One of the test cases added in the patch can be used only for demonstration
      of the restored performance for the reported query. The second test case is
      needed to demonstrate the validity of the fix.
      954a6dec
    • Oleksandr Byelkin's avatar
      fixed typo · 11abc219
      Oleksandr Byelkin authored
      11abc219
    • Marko Mäkelä's avatar
      MDEV-32578 row_merge_fts_doc_tokenize() handles parser plugin inconsistently · 15ae97b1
      Marko Mäkelä authored
      When mysql/mysql-server@0c954c2289a75d90d1088356b1092437ebf45a1d
      added a plugin interface for FULLTEXT INDEX tokenization to MySQL 5.7,
      fts_tokenize_ctx::processed_len got a second meaning, which is only
      partly implemented in row_merge_fts_doc_tokenize().
      
      This inconsistency could cause a crash when using FULLTEXT...WITH PARSER.
      A test case that would crash MySQL 8.0 when using an n-gram parser and
      single-character words would fail to crash in MySQL 5.7, because the
      buf_full condition in row_merge_fts_doc_tokenize() was not met.
      
      This change is inspired by
      mysql/mysql-server@38e9a0779aeea2d197c727e306a910c56b26a47c
      that appeared in MySQL 5.7.44.
      15ae97b1
    • Andrei's avatar
      MDEV-32593 Assertion failure upon CREATE SEQUENCE · 728bca44
      Andrei authored
      A recently added by MDEV-32593 assert conditions are corrected.
      728bca44
  19. 26 Oct, 2023 3 commits
    • Teemu Ollakka's avatar
      MDEV-32282: Galera node remains paused after interleaving FTWRLs · ef7fc586
      Teemu Ollakka authored
      After two concurrent FTWRL/UNLOCK TABLES, the node stays in paused state
      and the following CREATE TABLE fails with
      
        ER_UNKNOWN_COM_ERROR (1047): Aborting TOI: Replication paused on
        node for FTWRL/BACKUP STAGE.
      
      The cause is the use of global `wsrep_locked_seqno` to determine
      if the node should be resumed on UNLOCK TABLES. In some executions
      the `wsrep_locked_seqno` is cleared by the first UNLOCK TABLES
      after the second FTWRL gets past `make_global_read_lock_block_commit()`.
      
      As a fix, use `thd->wsrep_desynced_backup_stage` to determine
      if the thread should resume the node on UNLOCK TABLES.
      
      Add MTR test galera.galera_ftwrl_concurrent to reproduce the
      race. The test contains also cases for BACKUP STAGE which
      uses similar mechanism for desyncing and pausing the node.
      Signed-off-by: default avatarJulius Goryavsky <julius.goryavsky@mariadb.com>
      ef7fc586
    • Sergei Golubchik's avatar
      MDEV-32586 incorrect error about cyclic reference about JSON type virtual column · c9f87b88
      Sergei Golubchik authored
      remove the hack where NO_DEFAULT_VALUE_FLAG was temporarily removed
      from a field to initialize DEFAULT() functions in CHECK constraints
      while disabling self-reference field checks.
      
      Instead, initialize DEFAULT() functions in CHECK explicitly,
      don't call check_field_expression_processor() for CHECK at all.
      c9f87b88
    • Andrei's avatar
      MDEV-32365 detailize the semisync replication magic number error · 9c433432
      Andrei authored
      Semisync ack (master side) receiver thread is made to report
      details of faced errors.
      In case of 'magic byte' error, a hexdump of the received packet
      is always (level) NOTEd into the error log.
      In other cases an exact server level error is print out
      as a warning (as it may not be critical) under log_warnings > 2.
      
      An MTR test added for the magic byte error. For others existing mtr
      tests cover that, provided log_warnings > 2 is set.
      9c433432