1. 09 Sep, 2024 1 commit
  2. 08 Sep, 2024 1 commit
    • Sergei Petrunia's avatar
      MDEV-34894: Poor query plan, because range estimates are not reused for ref(const) · c630e23a
      Sergei Petrunia authored
      (Variant 4, with @@optimizer_adjust_secondary_key_costs, reuse in two
      places, and conditions are replaced with equivalent simpler forms in two more)
      
      In best_access_path(), ReuseRangeEstimateForRef-3,  the check
      for whether
       "all used key_part_i used key_part_i=const"
      was incorrect: it may produced a "NO" answer for cases when we
      had:
       key_part1= const // some key parts are usable
       key_part2= value_not_in_join_prefix  //present but unusable
       key_part3= non_const_value // unusable due to gap in key parts.
      
      This caused the optimizer to fail to apply ReuseRangeEstimateForRef
      heuristics. The consequence is poor query plan choice when the index
      in question has very skewed data distribution.
      
      The fix is enabled if its @@optimizer_adjust_secondary_key_costs flag
      is set.
      c630e23a
  3. 07 Sep, 2024 2 commits
  4. 06 Sep, 2024 7 commits
    • Marko Mäkelä's avatar
      Merge 10.6 into 10.11 · f9f92b48
      Marko Mäkelä authored
      f9f92b48
    • Monty's avatar
      Removed ctrl-l from the source · f0b2e765
      Monty authored
      f0b2e765
    • Marko Mäkelä's avatar
      Merge 10.6 into 10.11 · 2da4839b
      Marko Mäkelä authored
      2da4839b
    • Yuchen Pei's avatar
      Merge branch '10.5' into 10.6 · 60b93cdd
      Yuchen Pei authored
      60b93cdd
    • Yuchen Pei's avatar
    • Yuchen Pei's avatar
      MDEV-33858 Assertion `(mem_root->flags & 4) == 0' fails on 2nd execution of PS... · 00cb3440
      Yuchen Pei authored
      MDEV-33858 Assertion `(mem_root->flags & 4) == 0' fails on 2nd execution of PS with -DWITH_PROTECT_STATEMENT_MEMROOT=ON
      
      Simply adding tests as the bug is fixed with a backport of MDEV-34447
      00cb3440
    • Yuchen Pei's avatar
      MDEV-34447: Memory leakage is detected on running the test main.ps against the server 11.1 · 2c3e07df
      Yuchen Pei authored
      The memory leak happened on second execution of a prepared statement
      that runs UPDATE statement with correlated subquery in right hand side of
      the SET clause. In this case, invocation of the method
        table->stat_records()
      could return the zero value that results in going into the 'if' branch
      that handles impossible where condition. The issue is that this condition
      branch missed saving of leaf tables that has to be performed as first
      condition optimization activity. Later the PS statement memory root
      is marked as read only on finishing first time execution of the prepared
      statement. Next time the same statement is executed it hits the assertion
      on attempt to allocate a memory on the PS memory root marked as read only.
      This memory allocation takes place by the sequence of the following
      invocations:
       Prepared_statement::execute
        mysql_execute_command
         Sql_cmd_dml::execute
          Sql_cmd_update::execute_inner
           Sql_cmd_update::update_single_table
            st_select_lex::save_leaf_tables
             List<TABLE_LIST>::push_back
      
      To fix the issue, add the flag SELECT_LEX::leaf_tables_saved to control
      whether the method SELECT_LEX::save_leaf_tables() has to be called or
      it has been already invoked and no more invocation required.
      
      Similar issue could take place on running the DELETE statement with
      the LIMIT clause in PS/SP mode. The reason of memory leak is the same as for
      UPDATE case and be fixed in the same way.
      2c3e07df
  5. 05 Sep, 2024 10 commits
  6. 04 Sep, 2024 2 commits
    • Marko Mäkelä's avatar
      MDEV-34446 SIGSEGV on SET GLOBAL innodb_log_file_size with memory-mapped log file · fe5829a1
      Marko Mäkelä authored
      log_t::resize_write(): Advance log_sys.resize_lsn and reset
      the resize_log offset to START_OFFSET whenever the memory-mapped buffer
      would wrap around.
      
      Previously, in case the initial target offset would be beyond the
      requested innodb_log_file_size, we only adjusted the offset but
      not the LSN. An incorrect LSN would cause log_sys.buf_free to be out
      of bounds when the log resizing completes.
      
      The log_sys.lsn_lock will cover the entire duration of replicating
      memory-mapped log for resizing. We just need a mutex that is compatible
      with the caller holding log_sys.latch. While the choice of mtr_t::finisher
      (for normal log writes) depends on mtr_t::spin_wait_delay,
      replicating the log during resizing is a rare operation where we can
      afford possible additional context switching overhead.
      fe5829a1
    • Daniel Black's avatar
      MDEV-34864 SHOW INDEX FROM - SEQ_IN_INDEX to ULong · d1dc7067
      Daniel Black authored
      MySQL-Connector-Net casts SEQ_IN_INDEX to uint and will
      raise an exception if the type is a System.Int64.
      
      As we don't support a huge number of multi-columns in
      an index reducing to a uint is sufficient to represent
      all values and maintain compatibility with MySQL-Connector-Net.
      
      This matches the type (uint) returned by MySQL-8.3 and 8.0.
      
      Reviewer: Alexander Barkov <bar@mariadb.com>
      d1dc7067
  7. 03 Sep, 2024 5 commits
    • Marko Mäkelä's avatar
      MDEV-34845 buf_flush_buffer_pool(): Assertion `!os_aio_pending_reads()' failed · 9f0b1066
      Marko Mäkelä authored
      buf_flush_buffer_pool(): Wait for any pending asynchronous reads
      to complete. This assertion failed in a run where buf_read_ahead_linear()
      had been triggered in an SQL statement that was executed right
      before shutdown.
      
      Reviewed by: Debarun Banerjee
      9f0b1066
    • Marko Mäkelä's avatar
      MDEV-34791: Redundant page lookups hurt performance · 9878238f
      Marko Mäkelä authored
      btr_cur_t::search_leaf(): When the index root page is also a leaf page,
      we may need to upgrade our existing shared root page latch into an
      exclusive latch. Even if we end up waiting, the root page won't be able
      to go away while we hold an index()->lock. The index page may be split;
      that is all.
      
      btr_latch_prev(): Acquire the page latch while holding a buffer-fix
      and an index tree latch. Merge the change buffer if needed. Use
      buf_pool_t::page_fix() for this special case instead of complicating
      buf_page_get_low() and buf_page_get_gen().
      
      row_merge_read_clustered_index(): Remove some code that does not seem
      to be useful. No difference was observed with regard to removing this
      code when a CREATE INDEX or OPTIMIZE TABLE statement was run concurrently
      with sysbench oltp_update_index --tables=1 --table_size=1000 --threads=16.
      
      buf_pool_t::unzip(): Decompress a ROW_FORMAT=COMPRESSED page.
      
      buf_pool_t::page_fix(): Handle also ROW_FORMAT=COMPRESSED pages
      as well as change buffer merge. Optionally return an error.
      Add a flag for suppressing a page latch wait and a special return
      value -1 to indicate that the call would block.
      This is the preferred way of buffer-fixing blocks.
      The functions buf_page_get_gen() and buf_page_get_low() are only being
      invoked with rw_latch=RW_NO_LATCH in operations on SPATIAL INDEX.
      
      buf_page_t: Define some static functions for interpreting state().
      
      buf_page_get_zip(), buf_read_page(),
      buf_read_ahead_random(), buf_read_ahead_linear():
      Remove the redundant parameter zip_size. We must look up the
      tablespace and can invoke fil_space_t::zip_size() on it.
      
      buf_page_get_low(): Require mtr!=nullptr.
      
      buf_page_get_gen(): Implement some lock downgrading during recovery.
      
      ibuf_page_low(): Use buf_pool_t::page_fix() in a debug check.
      We do wait for a page read here, because otherwise a debug assertion in
      buf_page_get_low() in the test innodb.ibuf_delete could occasionally fail.
      
      PageConverter::operator(): Invoke buf_pool_t::page_fix() in order
      to possibly evict a block. This allows us to remove some
      special case code from buf_page_get_low().
      9878238f
    • Denis Protivensky's avatar
      MDEV-33133: MDL conflict handling code should skip BF-aborted trxs · 4e2c02a1
      Denis Protivensky authored
      It's possible that MDL conflict handling code is called more
      than once for a transaction when:
      - it holds more than one conflicting MDL lock
      - reschedule_waiters() is executed,
      which results in repeated attempts to BF-abort already aborted
      transaction.
      In such situations, it might be that BF-aborting logic sees
      a partially rolled back transaction and erroneously decides
      on future actions for such a transaction.
      
      The specific situation tested and fixed is when a SR transaction
      applied in the node gets BF-aborted by a started TOI operation.
      It's then caught with the server transaction already rolled back,
      but with no MDL locks yet released. This caused wrong state
      detection for such a transaction during repeated MDL conflict
      handling code execution.
      Signed-off-by: default avatarJulius Goryavsky <julius.goryavsky@mariadb.com>
      4e2c02a1
    • Julius Goryavsky's avatar
      Merge branch '10.5' into '10.6' · d5a669b6
      Julius Goryavsky authored
      d5a669b6
    • Julius Goryavsky's avatar
  8. 02 Sep, 2024 4 commits
  9. 01 Sep, 2024 8 commits