1. 17 Jan, 2024 1 commit
    • Marko Mäkelä's avatar
      MDEV-33213 History list is not shrunk unless there is a pause in the workload · f8c88d90
      Marko Mäkelä authored
      The parameter innodb_undo_log_truncate=ON enables a multi-phased logic:
      1. Any "producers" (new starting transactions) are prohibited
      from using the rollback segments that reside in the undo tablespace.
      2. Any transactions that use any of the rollback segments must be
      committed or aborted.
      3. The purge of committed transaction history must process all the
      rollback segments.
      4. The undo tablespace is truncated and rebuilt.
      5. The rollback segments are re-enabled for new transactions.
      
      There was one flaw in this logic: The first step was not being invoked
      as often as it could be, and therefore innodb_undo_log_truncate=ON
      would have no chance to work during a heavy write workload.
      
      Independent of innodb_undo_log_truncate, even after
      commit 86767bcc
      we are missing some chances to free processed undo log pages.
      If we prohibited the creation of new transactions in one busy
      rollback segment at a time, we would be eventually guaranteed
      to be able to free such pages.
      
      purge_sys_t::skipped_rseg: The current candidate rollback segment
      for shrinking the history independent of innodb_undo_log_truncate.
      
      purge_sys_t::iterator::free_history_rseg(): Renamed from
      trx_purge_truncate_rseg_history(). Implement the logic
      around purge_sys.m_skipped_rseg.
      
      purge_sys_t::truncate_undo_space: Renamed from truncate.
      
      purge_sys.truncate_undo_space.last: Changed the type to integer
      to get rid of some pointer dereferencing and conditional branches.
      
      purge_sys_t::truncating_tablespace(), purge_sys_t::undo_truncate_try():
      Refactored from trx_purge_truncate_history().
      Set purge_sys.truncate_undo_space.current if applicable,
      or return an already set purge_sys.truncate_undo_space.current.
      
      purge_coordinator_state::do_purge(): Invoke
      purge_sys_t::truncating_tablespace() as part of the normal work loop,
      to implement innodb_undo_log_truncate=ON as often as possible.
      
      trx_purge_truncate_rseg_history(): Remove a redundant parameter.
      
      trx_undo_truncate_start(): Replace dead code with a debug assertion.
      
      Correctness tested by: Matthias Leich
      Performance tested by: Axel Schwenke
      Reviewed by: Debarun Banerjee
      f8c88d90
  2. 16 Jan, 2024 1 commit
  3. 11 Jan, 2024 3 commits
  4. 10 Jan, 2024 9 commits
    • Marko Mäkelä's avatar
      MDEV-33112 innodb_undo_log_truncate=ON is blocking page write · 3613fb2a
      Marko Mäkelä authored
      When innodb_undo_log_truncate=ON causes an InnoDB undo tablespace
      to be truncated, we must guarantee that the undo tablespace will
      be rebuilt atomically: After mtr_t::commit_shrink() has durably
      written the mini-transaction that rebuilds the undo tablespace,
      we must not write any old pages to the tablespace.
      
      To guarantee this, in trx_purge_truncate_history() we used to
      traverse the entire buf_pool.flush_list in order to acquire
      exclusive latches on all pages for the undo tablespace that
      reside in the buffer pool, so that those pages cannot be written
      and will be evicted during mtr_t::commit_shrink(). But, this
      traversal may interfere with the page writing activity of
      buf_flush_page_cleaner(). It would be better to lazily discard
      the old pages of the truncated undo tablespace.
      
      fil_space_t::is_being_truncated, fil_space_t::clear_stopping(): Remove.
      
      fil_space_t::create_lsn: A new field, identifying the LSN of the
      latest rebuild of a tablespace.
      
      buf_page_t::flush(), buf_flush_try_neighbors(): Evict pages whose
      FIL_PAGE_LSN is below fil_space_t::create_lsn.
      
      mtr_t::commit_shrink(): Update fil_space_t::create_lsn and
      fil_space_t::size right before the log is durably written and the
      tablespace file is being truncated.
      
      fsp_page_create(), trx_purge_truncate_history(): Simplify the logic.
      
      Reviewed by: Thirunarayanan Balathandayuthapani, Vladislav Lesin
      Performance tested by: Axel Schwenke
      Correctness tested by: Matthias Leich
      3613fb2a
    • Marko Mäkelä's avatar
    • Sergei Golubchik's avatar
      MDEV-33092 Undefined reference to concurrency on Solaris · 761d5c89
      Sergei Golubchik authored
      remove thr_setconcurrency()
      followup for 8bbcaab1
      
      Fix by Rainer Orth
      761d5c89
    • Sergei Golubchik's avatar
      MDEV-32984 Update federated table and column privileges · c4ebf87f
      Sergei Golubchik authored
      mark auto-inc columns for read/write on INSERT,
      but only for read on UPDATE
      c4ebf87f
    • Yuchen Pei's avatar
      Merge branch '10.4' into 10.5 · c9902a20
      Yuchen Pei authored
      c9902a20
    • Marko Mäkelä's avatar
      MDEV-33137: Assertion end_lsn == page_lsn failed in recv_recover_page · 4cbf75dd
      Marko Mäkelä authored
      trx_purge_free_segment(), trx_purge_truncate_rseg_history():
      Do not claim that the blocks will be modified in the mini-transaction,
      because that will not always be the case. Whenever there is a
      modification, mtr_t::set_modified() will flag it.
      
      The debug assertion that failed in recovery is checking that all
      changes to data pages are covered by log records. Due to these
      incorrect calls, we would unnecessarily write unmodified data pages,
      which is something that commit 05fa4558
      aims to avoid.
      
      The incorrect calls had originally been added in
      commit de31ca6a (MDEV-32820) and
      commit 86767bcc (MDEV-29593).
      
      Reviewed by: Vladislav Lesin
      Tested by: Elena Stepanova
      4cbf75dd
    • Yuchen Pei's avatar
      MDEV-29718 Fix spider detection of same data node server · bc3d416a
      Yuchen Pei authored
      When the host is not specified, it defaults to localhost.
      bc3d416a
    • Yuchen Pei's avatar
      MDEV-33008 Fix spider table discovery · eabc74aa
      Yuchen Pei authored
      A new column was introduced to the show index output in 10.6 in
      f691d986
      
      Thus we update the check of the number of columns to be at least 13,
      rather than exactly 13.
      
      Also backport an err number and format from 10.5 for better error
      messages when the column number is wrong.
      eabc74aa
    • Rainer Orth's avatar
      MDEV-8941 Compile on Solaris (SPARC) fails with errors in filamvct.cpp · 2310f659
      Rainer Orth authored
      There are a large number of uses of `strerror` in the codebase,
      the local declaration in `storage/connect/tabvct.cpp` is the only one.
      
      Given that none is needed elsewhere, I conclude that this instance can
      simply be removed.
      2310f659
  5. 09 Jan, 2024 8 commits
  6. 08 Jan, 2024 6 commits
  7. 04 Jan, 2024 1 commit
  8. 03 Jan, 2024 7 commits
    • Igor Babaev's avatar
      MDEV-31657 Crash on query using CTE with the same name as a base table · 54ed3939
      Igor Babaev authored
      If a query contained a CTE whose name coincided with the name of one of
      the base tables used in the specification of the CTE and the query had at
      least two references to this CTE in the specifications of other CTEs then
      processing of the query led to unlimited recursion that ultimately caused
      a crash of the server.
      
      Any secondary non-recursive reference to a CTE requires creation of a copy
      of the CTE specification. All the references to CTEs in this copy must be
      resolved. If the specification contains a reference to a base table whose
      name coincides with the name of then CTE then it should be ensured that
      this reference in no way can be resolved against the name of the CTE.
      54ed3939
    • Marko Mäkelä's avatar
      Merge 10.5 into 10.6 · 8bd5a3de
      Marko Mäkelä authored
      8bd5a3de
    • Marko Mäkelä's avatar
      MDEV-33156 Crash on innodb_buf_flush_list_now=ON and innodb_force_recovery=6 · cc5c0eda
      Marko Mäkelä authored
      srv_start(): Move a read only mode startup tweak from
      innodb_init_params() to the correct location. Also if
      innodb_force_recovery=6 we will disable the doublewrite buffer,
      because InnoDB must run in read-only mode to prevent further corruption.
      
      This change only affects debug checks. Whenever srv_read_only_mode holds,
      the buf_pool.flush_list will be empty, that is, there will be no writes
      of persistent InnoDB data pages.
      
      Reviewed by: Thirunarayanan Balathandayuthapani
      cc5c0eda
    • Marko Mäkelä's avatar
      Merge 10.4 into 10.5 · 3a3a4f04
      Marko Mäkelä authored
      3a3a4f04
    • Thirunarayanan Balathandayuthapani's avatar
      MDEV-33098 The test innodb.doublewrite_debug occasionally fails to start up InnoDB · 77b8bedf
      Thirunarayanan Balathandayuthapani authored
      - innodb.doublewrite_debug should avoid the checkpoint
      before killing the server. So used debug sync and
      innodb_flush_sync to avoid the checkpoint completely.
      Test case allowed to skip on MSAN builder due to extra
      checkpoint.
      77b8bedf
    • Marko Mäkelä's avatar
      MDEV-33157 WSREP: Fix function pointer mismatch · 96130b18
      Marko Mäkelä authored
      wsrep_plugin_init(), wsrep_plugin_deinit(): Remove these dummy functions
      in order to fix an error that would be flagged by cmake -DWITH_UBSAN=ON
      when using clang.
      
      wsrep_show_ready(), wsrep_show_bf_aborts(): Correct the signature.
      96130b18
    • Igor Babaev's avatar
      MDEV-29362 Crash with query using constant subquery as left part of IN subquery · 832e96de
      Igor Babaev authored
      If a query has a HAVING clause that contains a predicate with a constant
      IN subquery whose lef part in its turn is a subquery and the predicate is
      subject to pushdown from HAVING to WHERE then execution of the query could
      cause a crash of the server.
      
      The cause of the problem was the missing implementation of the walk()
      method for the class Item_in_optimizer. As a result in some cases the left
      operand of the Item_in_optimizer condition could be traversed twice by
      the walk procedure. For many call-back functions used as an argument of
      this procedure it does not matter. Yet it matters for the call-back
      function cleanup_excluding_immutables_processor() used in pushdown of
      predicates from HAVING to WHERE. If the processed item is marked with
      the IMMUTABLE_FL flag then the processor just removes this flag, otherwise
      it performs cleanup of the item making it unfixed. If an item is marked
      with an the IMMUTABLE_FL and it traversed with this processor twice then
      it becomes unfixed after the second traversal though the flag indicates
      that the item should not be cleaned up.
      
      Approved by Oleksandr Byelkin <sanja@mariadb.com>
      832e96de
  9. 02 Jan, 2024 1 commit
  10. 27 Dec, 2023 3 commits
    • Alexander Barkov's avatar
      MDEV-33019 The database part is not case sensitive in SP names · 9695974e
      Alexander Barkov authored
      Problem:
      
      sp_cache erroneously looked up fully qualified SP names (e.g. `DB`.`SP`),
      in case insensitive style. It was wrong, because only the "name"
      part is always case insensitive, while the "db" part should be compared
      according to lower_case_table_names (case sensitively for 0,
      case insensitively for 1 and 2).
      
      Fix:
      
      Adding a "casedn_name" parameter make_qname() to tell
      if the name part should be lower cased:
        `DB1`.`SP` -> "DB1.SP"  (when casedn_name=false)
        `DB1`.`SP` -> "DB1.sp"  (when casedn_name=true)
      and using make_qname() with casedn_name=true when creating
      sp_cache hash lookup keys.
      
      Details:
      
      As a result, it now works as follows:
      - sp_head::m_db is converted to lower case if lower_case_table_names>0
        during the sp_name initialization phase. So when make_qname() is called,
        sp_head::m_db is already normalized. There are no changes in here.
      
      - The initialization phase of sp_head when creating sp_head::m_qname
        now calls make_qname() with casedn_name=true,
        so sp_head::m_name gets written to sp_head::m_qname in lower case.
      
      - sp_cache_lookup() now also calls make_qname() with casedn_name=true,
        so sp_head::m_name gets written to the temporary lookup key in lower case.
      
      - sp_cache::m_hashtable now uses case sensitive comparison
      9695974e
    • Alexander Barkov's avatar
      MDEV-33019 The database part is not case sensitive in SP names · 916caac2
      Alexander Barkov authored
      Part#1 A non-functional change
      
      Changing the signature of Identifier_chain2::make_qname() from
      
        bool make_qname(MEM_ROOT *mem_root, LEX_CSTRING *dst) const;
      
      to
      
        LEX_CSTRING make_qname(MEM_ROOT *mem_root) const;
      
      Now the result is returned as LEX_CSTRING from the function rather than
      is passed as a parameter.
      The return value {NULL,0} means "EOM".
      916caac2
    • Alexander Barkov's avatar
      A 11.3->10.4 backport for MDEV-31991 Split class Database_qualified_name · 371bf4ab
      Alexander Barkov authored
      This is a requirement step to fix and merge easier
        MDEV-33019 The database part is not case sensitive in SP names
      
      The original MDEV-31991 commit commend:
      
      - Moving some of Database_qualified_name methods into a new class
        Identifier_chain2.
      
      - Changing the data type of the following variables from
        Database_qualified_name to Identifier_chain2:
      
        * q_pkg_proc in LEX::call_statement_start()
        * q_pkg_func in LEX::make_item_func_call_generic()
      
      Rationale:
      
      The data type of Database_qualified_name::m_db will be changed
      to Lex_ident_db soon. So Database_qualified_name won't be able
      to store the `pkg.routine` part of `db.pkg.routine` any more,
      because `pkg` must not depend on lower-case-table-names.
      371bf4ab