1. 11 Apr, 2024 1 commit
    • Jan Lindström's avatar
      MDEV-32974 : Member fails to join due to old seqno in GTID · cac0fc97
      Jan Lindström authored
      Before MDEV-15158, wsrep xid information was stored in only one place:
      in the TRX_SYS page. Starting with 10.3, it is not stored there but
      in the rollback segment header pages, and the latest one is what
      matters. MDEV-19229 allows the undo tablespaces to be rebuilt when
      innodb_undo_tablespaces is changed on startup. Previously it was not
      possible to change that parameter.
      
      These changes caused the fact that rollback segment header pages could
      contain several wsrep xid's stored and when undo tablespaces were
      rebuilt there was a effort to restore wsrep xid back to rollback
      segment header page but because there was several of them the latest
      wsrep xid was overwritten with older one.
      
      trx_rseg_read_wsrep_checkpoint
      trx_rseg_init_wsrep_xid
      	Return true if read xid is wsrep xid, false if not
      
      trx_rseg_mem_restore
      	Try to read wsrep xid and if it is found copy it to
      	trx_sys.recovered_wsrep_xid if read xid has larger
      	seqno.
      cac0fc97
  2. 10 Apr, 2024 1 commit
  3. 09 Apr, 2024 3 commits
    • Oleksandr Byelkin's avatar
    • Marko Mäkelä's avatar
      MDEV-33585 follow-up optimization · 42bda685
      Marko Mäkelä authored
      log_t: Define buf_size, max_buf_free as 32-bit and next_checkpoint_no
      as byte (we only need a bit) and rearrange some data members,
      so that on AMD64 we can fit log_sys.latch and log_sys.log in
      the same 64-byte cache line.
      
      mtr_t::commit_log(), mtr_t::commit_logger: A part of mtr_t::commit()
      split into a separate function, so that we will not unnecessarily invoke
      log_sys.get_write_target() when running on a memory-mapped log file,
      or log_sys.is_pmem().
      
      Reviewed by: Vladislav Vaintroub
      Tested by: Matthias Leich
      42bda685
    • Marko Mäkelä's avatar
      MDEV-33585 The maximum innodb_log_buffer_size is too large · 0892e6d0
      Marko Mäkelä authored
      On Microsoft Windows, ReadFile() as well as WriteFile() limit the size
      of the request to DWORD, which is 32 bits (at most 4 GiB - 1) also on
      64-bit systems.
      
      On FreeBSD, sysctl debug.iosize_max_clamp could limit the size of a
      write request to INT_MAX. The size of a read request is always limited
      to INT_MAX. This would allow the request size to be 4095 bytes more than
      the Linux limit (0x7ffff000 according to "man 2 read" and "man 2 write").
      
      On OpenBSD, Solaris and possibly NetBSD, the read request size is limited
      to SSIZE_T_MAX, which would be half the current maximum
      innodb_log_buffer_size. This should be not much of an issue anyway,
      because on contemporary 64-bit platforms, the virtual addresses are
      limited to 48 bits.
      
      IBM AIX documentation mentions OFF_MAX which would apply when
      a 64-bit application is running on a 32-bit kernel.
      
      Let us declare innodb_log_buffer_size as 32-bit unsigned and make the
      maximum 0x7ffff000, to be compatible with the least common
      denominator (Linux).
      
      The maximum innodb_sort_buffer_size already was 64 MiB,
      which is not a problem.
      
      SyncFileIO::execute(): Assert that the size of a synchronous read or
      write request is limited to the maximum.
      
      Reviewed by: Vladislav Vaintroub
      0892e6d0
  4. 08 Apr, 2024 2 commits
    • Rucha Deodhar's avatar
      MDEV-32726: Fix failing test fir freebsd for json · fcd345de
      Rucha Deodhar authored
      Json test about max statement time fails with freebsd because on some
      architectures the test might execute faster and the statement may not fail.
      
      To simulate failure regardless of architecture, introduce a wait of seconds
      longer than the max_statement_time.
      fcd345de
    • Thirunarayanan Balathandayuthapani's avatar
      MDEV-32453 Bulk insert fails to apply when trigger does insert operation · 188c5da7
      Thirunarayanan Balathandayuthapani authored
      Reason:
      =======
      - InnoDB fails to apply the buffered insert operation if the
      after insert trigger does change the same table. This behaviour
      leads to empty table for the subsequent insert operation
      and server abort.
      
      Solution:
      ========
      - InnoDB should apply buffered insert operation if
      "after insert" trigger changes the same table.
      188c5da7
  5. 07 Apr, 2024 2 commits
    • Tony Chen's avatar
      Fix error behaviour in mini-benchmark · 53571105
      Tony Chen authored
      In commit f5ca4077, an the "--log" option was added but it was implemented by
      invoking a sub-shell. Any errors in the sub-shell would not be propagated and
      thus cause mini-benchmark to suppress errors.
      
      The fix here is to propagate the exit status of the sub-shell.
      
      All new code of the whole pull request, including one or several files that are
      either new files or modified ones, are contributed under the BSD-new license. I
      am contributing on behalf of my employer Amazon Web Services, Inc.
      53571105
    • Tony Chen's avatar
      Add cpu-limit option for mini-benchmark · 2b0e0730
      Tony Chen authored
      As performance improves, the permitted number of CPU cycles to be used
      during the benchmark should be lowered to catch performance regressions. An
      option is added to better support this.
      
      All new code of the whole pull request, including one or several files that are
      either new files or modified ones, are contributed under the BSD-new license. I
      am contributing on behalf of my employer Amazon Web Services, Inc.
      2b0e0730
  6. 03 Apr, 2024 2 commits
    • Aleksey Midenkov's avatar
      Columnstore empty submodule fix 2 · af4df93c
      Aleksey Midenkov authored
      Original problem was error when configuring without initialized
      submodule Columnstore:
      
        The source directory
      
          /home/midenok/src/mariadb/10.6c/src/storage/columnstore/columnstore
      
        does not contain a CMakeLists.txt file.
      
      The original fix disabled Columnstore build when PLUGIN_COLUMNSTORE
      was not defined, but this seems to be wrong and any plugin should be
      built if it is not explicitly disabled. This is expected by buildbots.
      
      Thanks to Vladislav Vaintroub <vvaintroub@gmail.com> for the fix
      af4df93c
    • Jan Lindström's avatar
      baec63e3
  7. 02 Apr, 2024 1 commit
  8. 01 Apr, 2024 3 commits
    • Aleksey Midenkov's avatar
      Columnstore empty submodule fix · 099ca49c
      Aleksey Midenkov authored
      CMake doesn't set ${PLUGIN_COLUMNSTORE} to anything.
      099ca49c
    • Aleksey Midenkov's avatar
      MDEV-29872 MSAN/Valgrind uninitialised value errors in TABLE::vers_switch_partition · c4776974
      Aleksey Midenkov authored
      Delayed_insert has its own THD (initialized at mysql_insert()) and
      hence its own LEX. Delayed_insert initalizes a very few parameters for
      LEX and 'duplicates' is not in this list. Now we copy this missing
      parameter from parser LEX (as well as sql_command).
      c4776974
    • Aleksey Midenkov's avatar
      MDEV-31903 Server crashes in _ma_reset_history upon UNLOCK table with... · d966e55c
      Aleksey Midenkov authored
      MDEV-31903 Server crashes in _ma_reset_history upon UNLOCK table with auto-create history partitions
      
      When INSERT does auto-create for t1 all its handler instances are
      closed by alter_close_table(). At this time down the stack
      maria_close() clears share->state_history. Later when we unlock the
      tables Aria transaction manager accesses old share instance (the one
      before t1 was closed) and tries to reset its state_history.
      
      The problem is maria_close() didn't remove table from transaction's
      list (used_tables). The fix does _ma_remove_table_from_trnman() which
      is triggered by HA_EXTRA_PREPARE_FOR_RENAME.
      d966e55c
  9. 28 Mar, 2024 3 commits
    • Marko Mäkelä's avatar
      MDEV-33515 fixup for POWER · a79fb66a
      Marko Mäkelä authored
      a79fb66a
    • Marko Mäkelä's avatar
      Merge 10.6 into 10.11 · 78895346
      Marko Mäkelä authored
      Some fixes related to commit f838b2d7 and
      Rows_log_event::do_apply_event() and Update_rows_log_event::do_exec_row()
      for system-versioned tables were provided by Nikita Malyavin.
      This was required by test versioning.rpl,trx_id,row.
      78895346
    • Robin Newhouse's avatar
      Enable mini-benchmark to run with perf · 6efa75a8
      Robin Newhouse authored
      The mini-benchmark.sh script failed to run in the latest Fedora
      distributions in GitLab CI. Executing the benchmark inside a Docker
      container had failed because the check for `perf` was done in a way that
      caused the benchmark to exit because of the `set -e` option. Test and
      skip `perf` to allowing the remaining benchmark activities to proceed.
      
      This check was added in acb6684 but inadvertantly reverted in 42a1f94.
      
      Logic was corrected to only run perf when the flag is enabled, and to
      prevent perf stat and perf record from being simultaneously enabled.
      
      Set -ex is also added to enable easier identification of mini-benchmark
      issues in the future.
      
      All new code of the whole pull request, including one or several files
      that are either new files or modified ones, are contributed under the
      BSD-new license. I am contributing on behalf of my employer Amazon Web
      Services, Inc.
      6efa75a8
  10. 27 Mar, 2024 8 commits
    • Marko Mäkelä's avatar
      Merge 10.5 into 10.6 · ccb7a1e9
      Marko Mäkelä authored
      ccb7a1e9
    • Alexander Barkov's avatar
      MDEV-33772 Bad SEPARATOR value in GROUP_CONCAT on character set conversion · 0fc123c5
      Alexander Barkov authored
      Item_func_group_concat::print() did not take into account
      that Item_func_group_concat::separator can be of a different character set
      than the "String *str" (when the printing is being done to).
      Therefore, printing did not work correctly for:
      - non-ASCII separators when GROUP_CONCAT is done on 8bit data
        or multi-byte data with mbminlen==1.
      - all separators (even including simple ones like comma)
        when GROUP_CONCAT is done on ucs2/utf16/utf32 data (mbminlen>1).
      
      Because of this problem, VIEW definitions did not print correctly to
      their FRM files. This later led to a wrong SELECT and SHOW CREATE output.
      
      Fix:
      
      - Adding new String methods:
      
        bool append_for_single_quote_using_mb_wc(const char *str, size_t length,
                                                 CHARSET_INFO *cs);
      
        bool append_for_single_quote_opt_convert(const char *str,
                                                 size_t length,
                                                 CHARSET_INFO *cs)
      
        which perform both escaping and character set conversion at the same time.
      
      - Adding a new String method escaped_wc_for_single_quote(),
        to reuse the code between the old and the new methods.
      
      - Fixing Item_func_group_concat::print() to use the new
        method append_for_single_quote_opt_convert().
      0fc123c5
    • Marko Mäkelä's avatar
      MDEV-33515 fixup: Clarify mtr_t::spin_wait_delay · 0c6cac0a
      Marko Mäkelä authored
      innodb_log_spin_wait_delay_update(): Always acquire log_sys.latch
      to protect the change of mtr_t::spin_wait_delay.
      
      log_t::lock_lsn(): In the general case, actually use
      mtr_t::spin_wait_delay as it was intended. In the x86 specific
      log_t::lock_lsn_bts() we used mtr_t::spin_wait_delay.
      0c6cac0a
    • Dave Gosselin's avatar
      MDEV-33460 select '123' 'x'; unexpected result · 58df2097
      Dave Gosselin authored
      Queries that select concatenated constant strings now have
      colname and value that match.  For example,
        SELECT '123' 'x';
      will return a result where the column name and value both
      are '123x'.
      
      Review: Daniel Black
      58df2097
    • Daniel Black's avatar
      MDEV-33301 memlock with systemd still not working · 76a27155
      Daniel Black authored
      .. even with MDEV-9095 fix
      
      CapabilityBounding sets require filesystem setcap attributes
      for the executable to gain privileges during execution.
      
      A side effect of this however is the getauxvec(AT_SECURE) gets
      set, and the secure_getenv from OpenSSL internals on
      OPENSSL_CONF environment variable will get ignored (openssl gh issue
      21770).
      
      According to capabilities(7), Ambient capabilities don't trigger
      ld.so triggering the secure execution mode.
      
      Include SELinux and Apparmor capabilities for ipc_lock
      76a27155
    • Daniel Black's avatar
      Revert "MDEV-33636: RPM caps is on mariadbd exe" · ee2ed1a0
      Daniel Black authored
      This was the orginal implementation that reverted with a bunch of
      commits.
      
      This reverts commit a13e521b.
      
      Revert "cmake: append to the array correctly"
      This reverts commit 51e3f1da.
      
      Revert "build failure with cmake < 3.10"
      This reverts commit 49cf702e.
      
      Revert "MDEV-33301 memlock with systemd still not working"
      This reverts commit 8a1904d7.
      ee2ed1a0
    • Jan Lindström's avatar
      MDEV-33039 Galera test failure on mysql-wsrep-features#165 · c5ac9836
      Jan Lindström authored
      We should not set debug sync point when holding a mutex
      to avoid mutex ordering failure.
      Signed-off-by: default avatarJulius Goryavsky <julius.goryavsky@mariadb.com>
      c5ac9836
    • Denis Protivensky's avatar
      MDEV-33136: Properly BF-abort user transactions with explicit locks · 7bf3c312
      Denis Protivensky authored
      User transactions may acquire explicit MDL locks from InnoDB level
      when persistent statistics is re-read for a table.
      If such a transaction would be subject to BF-abort, it was improperly
      detected as a system transaction and wouldn't get aborted.
      
      The fix: Check if a transaction holding explicit MDL locks is a user
      transaction in the MDL conflict handling code.
      Signed-off-by: default avatarJulius Goryavsky <julius.goryavsky@mariadb.com>
      7bf3c312
  11. 26 Mar, 2024 2 commits
    • Vladislav Vaintroub's avatar
      MDEV-33506 Show original IP in the "aborted" message. · 318000cf
      Vladislav Vaintroub authored
      Add "real ip:<ip_or_localhost>" part to the aborted message
      Only for proxy-protocoled connection, so it does not  not to cause
      confusion to normal users.
      318000cf
    • Jan Lindström's avatar
      MDEV-33278 : Assertion failure in thd_get_thread_id at lock_wait_wsrep · b762541d
      Jan Lindström authored
      Problem is that not all conflicting transactions have THD object.
      Therefore, it must be checked that victim has THD
      before it's identification is added to victim list as victim's
      thread identification is later requested using thd_get_thread_id
      function that requires that we have valid pointer to THD object
      in trx->mysql_thd.
      
      Victim might not have trx->mysql_thd in two cases:
      
      (1) An incomplete transaction that was recovered from undo logs
      on server startup (and not yet rolled back).
      
      (2) Transaction that is in XA PREPARE state and whose client
      connection was disconnected.
      
      Neither of these can complete before lock_wait_wsrep()
      releases lock_sys.latch.
      
      (1) trx_t::commit_in_memory() is clearing both
      trx_t::state and trx_t::is_recovered before it invokes
      lock_release(trx_t*) (which would be blocked by the exclusive
      lock_sys.latch that we are holding here). Hence, it is not
      possible to write a debug assertion to document this scenario.
      
      (2) If is in XA PREPARE state, it would eventually be rolled
      back and the lock conflict would be resolved when an XA COMMIT
      or XA ROLLBACK statement is executed in some other connection.
      Signed-off-by: default avatarJulius Goryavsky <julius.goryavsky@mariadb.com>
      b762541d
  12. 25 Mar, 2024 3 commits
  13. 22 Mar, 2024 5 commits
    • Marko Mäkelä's avatar
      MDEV-32364 fixup: crash in ut_dontdump() · 70b90772
      Marko Mäkelä authored
      70b90772
    • Marko Mäkelä's avatar
      MDEV-33591 MONITOR_INC_VALUE_CUMULATIVE is executed regardless of "if" condition · f0590db5
      Marko Mäkelä authored
      MONITOR_INC_VALUE_CUMULATIVE is a multiline macro, so the second statement
      will be executed always, regardless of "if" condition.
      
      These problems first started with
      commit b1ab211d (MDEV-15053).
      
      Thanks to Yury Chaikou from ServiceNow for the report.
      f0590db5
    • Marko Mäkelä's avatar
      MDEV-33454 release row locks for non-modified rows at XA PREPARE · 17e59ed3
      Marko Mäkelä authored
      From the correctness point of view, it should be safe to release
      all locks on index records that were not modified by the transaction.
      Doing so should make the locks after XA PREPARE fully compatible
      with what would happen if the server were restarted: InnoDB table
      IX locks and exclusive record locks would be resurrected based on
      undo log records.
      
      Concurrently running transactions that are waiting for a lock may invoke
      lock_rec_convert_impl_to_expl() to create an explicit record lock object
      on behalf of the lock-owning transaction so that they can attaching
      their waiting lock request on the explicit record lock object. Explicit
      locks would be released by trx_t::release_locks() during commit or
      rollback.
      
      Any clustered index record whose DB_TRX_ID belongs to a transaction that
      is in active or XA PREPARE state will be implicitly locked by that
      transaction. On XA PREPARE, we can release explicit exclusive locks on
      records whose DB_TRX_ID does not match the current transaction identifier.
      
      lock_rec_unlock_unmodified(): Release record locks that are not implicitly
      held by the current transaction.
      
      lock_release_on_prepare_try(), lock_release_on_prepare():
      Invoke lock_rec_unlock_unmodified().
      
      row_trx_id_offset(): Declare non-static.
      
      lock_rec_unlock(): Replaces lock_rec_unlock_supremum().
      
      Reviewed by: Vladislav Lesin
      17e59ed3
    • Marko Mäkelä's avatar
      MDEV-33613 InnoDB may still hang when temporarily running out of buffer pool · fa8a46eb
      Marko Mäkelä authored
      By design, InnoDB has always hung when permanently running out of
      buffer pool, for example when several threads are waiting to allocate
      a block, and all of the buffer pool is buffer-fixed by the active threads.
      
      The hang that we are fixing here occurs when the buffer pool is only
      temporarily running out and the situation could be rescued by writing out
      some dirty pages or evicting some clean pages.
      
      buf_LRU_get_free_block(): Simplify the way how we wait for
      the buf_flush_page_cleaner thread. This fixes occasional hangs
      of the test encryption.innochecksum that were introduced by
      commit a55b951e (MDEV-26827).
      To play it safe, we use a timed wait when waiting for the
      buf_flush_page_cleaner() thread to perform its job. Should that
      thread get stuck, we will invoke buf_pool.LRU_warn() in order to
      display a message that pages could not be freed, and keep trying
      to wake up the buf_flush_page_cleaner() thread.
      
      The INFORMATION_SCHEMA.INNODB_METRICS counters
      buffer_LRU_single_flush_failure_count and
      buffer_LRU_get_free_waits will be removed.
      The latter is represented by buffer_pool_wait_free.
      
      Also removed will be the message
      "InnoDB: Difficult to find free blocks in the buffer pool"
      because in d34479dc we
      introduced a more precise message
      "InnoDB: Could not free any blocks in the buffer pool"
      in the buf_flush_page_cleaner thread.
      
      buf_pool_t::LRU_warn(): Issue the warning message that we could
      not free any blocks in the buffer pool. This may also be invoked
      by buf_LRU_get_free_block() if buf_flush_page_cleaner() appears
      to be stuck.
      
      buf_pool_t::n_flush_dec(): Remove.
      
      buf_pool_t::n_flush_dec_holding_mutex(): Rename to n_flush_dec().
      
      buf_flush_LRU_list_batch(): Increment the eviction counter for blocks
      of temporary, discarded or dropped tablespaces.
      
      buf_flush_LRU(): Make static, and remove the constant parameter
      evict=false. The only caller will be the buf_flush_page_cleaner()
      thread.
      
      IORequest::is_LRU(): Remove. The only case of evicting pages on
      write completion will be when we are writing out pages of the
      temporary tablespace. Those pages are not in buf_pool.flush_list,
      only in buf_pool.LRU.
      
      buf_page_t::flush(): Remove the parameter evict.
      
      buf_page_t::write_complete(): Change the parameter "bool temporary"
      to "bool persistent" and add a parameter for an already read state().
      
      Reviewed by: Debarun Banerjee
      fa8a46eb
    • Marko Mäkelä's avatar
      MDEV-33515 log_sys.lsn_lock causes excessive context switching · bf0b82d2
      Marko Mäkelä authored
      The log_sys.lsn_lock is a very contended resource with a small
      critical section in log_sys.append_prepare(). On many processor
      microarchitectures, replacing the system call based log_sys.lsn_lock
      with a pure spin lock would fare worse during high concurrency workloads,
      wasting a significant amount of CPU cycles in the spin loop.
      
      On other microarchitectures, we would see a significant amount of time
      being spent in native_queued_spin_lock_slowpath() in the Linux kernel,
      plus context switching between user and kernel address space. This was
      pointed out by Steve Shaw from Intel Corporation.
      
      Depending on the workload and the hardware implementation, it may be
      useful to use a pure spin lock in log_sys.append_prepare().
      We will introduce a parameter. The statement
      
      	SET GLOBAL INNODB_LOG_SPIN_WAIT_DELAY=50;
      
      would enable a spin lock that will execute that many MY_RELAX_CPU()
      operations (such as the x86 PAUSE instruction) between successive
      attempts of acquiring the spin lock. The use of a system call based
      log_sys.lsn_lock (which is the default setting) can be enabled by
      
      	SET GLOBAL INNODB_LOG_SPIN_WAIT_DELAY=0;
      
      This patch will also introduce #ifdef LOG_LATCH_DEBUG
      (part of cmake -DWITH_INNODB_EXTRA_DEBUG=ON) for more accurate
      tracking of log_sys.latch ownership and reorganize the fields of
      log_sys to improve the locality of reference and to reduce the
      chances of false sharing.
      
      When a spin lock is being used, it will be maintained in the
      most significant bit of log_sys.buf_free. This is useful, because that is
      one of the fields that is covered by the lock. For IA-32 or AMD64, we
      implement the spin lock specially via log_t::lsn_lock_bts(), employing the
      i386 LOCK BTS instruction. A straightforward std::atomic::fetch_or() would
      translate into an inefficient loop around LOCK CMPXCHG.
      
      mtr_t::spin_wait_delay: The value of innodb_log_spin_wait_delay.
      
      mtr_t::finisher: Pointer to the currently used mtr_t::finish_write()
      implementation. This allows to avoid introducing conditional branches.
      We no longer invoke log_sys.is_pmem() at the mini-transaction level,
      but we would do that in log_write_up_to().
      
      mtr_t::finisher_update(): Update finisher when spin_wait_delay is
      changed from or to 0 (the spin lock is changed to log_sys.lsn_lock or
      vice versa).
      bf0b82d2
  14. 21 Mar, 2024 1 commit
    • Brandon Nesterenko's avatar
      MDEV-33551: Semi-sync Wait Point AFTER_COMMIT Slow on Workloads with Heavy Concurrency · 75c7c6dc
      Brandon Nesterenko authored
      When using semi-sync replication with
      rpl_semi_sync_master_wait_point=AFTER_COMMIT, the performance of the
      primary can significantly reduce compared to AFTER_SYNC's
      performance for workloads with many concurrent users executing
      transactions. This is because all connections on the primary share
      the same cond_wait variable/mutex pair, so any time an ACK is
      received from a replica, all waiting connections are awoken to check
      if the ACK was for itself, which is done in mutual exclusion.
      
      This patch changes this such that the waiting THD will use its own
      local condition variable, and the ACK receiver thread only signals
      connections which have been ACKed for wakeup. That is, the
      THD::LOCK_wakeup_ready condition variable is re-used for this
      purpose, and the Active_tranx queue nodes are extended to hold the
      waiting thread, so it can be signalled once ACKed.
      
      Additionally:
      
       1)  Removed part of MDEV-11853 additions, which allowed suspended
      connection threads awaiting their semi-sync ACKs to live until their
      ACKs had been received. This part, however, wasn't needed.  That is,
      all that was needed was for the Ack_thread to survive.  So now the
      connection threads are killed during phase 1. Thereby
      THD::is_awaiting_semisync_ack, and all its related code was removed.
      
       2) COND_binlog_send is repurposed to signal on the condition when
      Active_tranx is emptied during clear_active_tranx_nodes.
      
       3) At master shutdown (when waiting for slaves), instead of the
      main loop individually waiting for each ACK, await_slave_reply()
      (renamed await_all_slave_replies()) just waits once for the
      repurposed COND_binlog_send to signal it is empty.
      
       4) Test rpl_semi_sync_shutdown_await_ack is updates as following:
         4.1) Added test case (adapted from Kristian Nielsen) to ensure
      that if a thread awaiting its ACK is killed while SHUTDOWN WAIT FOR
      ALL SLAVES is issued, the primary will still wait for the ACK from
      the killed thread.
         4.2) As connections which by-passed phase 1 of thread killing no
      longer are delayed for kill until phase 2, we can no longer query
      yes/no tx after receiving an ACK/timeout. The check for these
      variables is removed.
         4.3) Comment descriptions are updated which mention that the
      connection is alive; and adjusted to be the Ack_thread.
      
      Reviewed By:
      ============
      Kristian Nielsen <knielsen@knielsen-hq.org>
      75c7c6dc
  15. 20 Mar, 2024 2 commits
    • Vladislav Vaintroub's avatar
      post-fix 1c55b845 · a2dd4c14
      Vladislav Vaintroub authored
      remove bunch of  *.rej and *.orig files, checked in by mistake.
      a2dd4c14
    • Marko Mäkelä's avatar
      MDEV-26642/MDEV-26643/MDEV-32898 Implement innodb_snapshot_isolation · b8a67198
      Marko Mäkelä authored
      https://jepsen.io/analyses/mysql-8.0.34 highlights that the
      transaction isolation levels in the InnoDB storage engine do not
      correspond to any widely accepted definitions, such as
      "Generalized Isolation Level Definitions"
      https://pmg.csail.mit.edu/papers/icde00.pdf
      (PL-1 = READ UNCOMMITTED, PL-2 = READ COMMITTED, PL-2.99 = REPEATABLE READ,
      PL-3 = SERIALIZABLE).
      Only READ UNCOMMITTED in InnoDB seems to match the above definition.
      
      The issue is that InnoDB does not detect write/write conflicts
      (Section 4.4.3, Definition 6) in the above.
      
      It appears that as soon as we implement write/write conflict detection
      (SET SESSION innodb_snapshot_isolation=ON), the default isolation level
      (SET TRANSACTION ISOLATION LEVEL REPEATABLE READ) will become
      Snapshot Isolation (similar to Postgres), as defined in Section 4.2 of
      "A Critique of ANSI SQL Isolation Levels", MSR-TR-95-51, June 1995
      https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-95-51.pdf
      
      Locking reads inside InnoDB used to read the latest committed version,
      ignoring what should actually be visible to the transaction.
      The added test innodb.lock_isolation illustrates this. The statement
      	UPDATE t SET a=3 WHERE b=2;
      is executed in a transaction that was started before a read view or
      a snapshot of the current transaction was created, and committed before
      the current transaction attempts to execute
      	UPDATE t SET b=3;
      If SET innodb_snapshot_isolation=ON is in effect when the second
      transaction was started, the second transaction will be aborted with
      the error ER_CHECKREAD. By default (innodb_snapshot_isolation=OFF),
      the second transaction would execute inconsistently, displaying an
      incorrect SELECT COUNT(*) FROM t in its read view.
      
      If innodb_snapshot_isolation=ON, if an attempt to acquire a lock on a
      record that does not exist in the current read view is made, an error
      DB_RECORD_CHANGED (HA_ERR_RECORD_CHANGED, ER_CHECKREAD) will
      be raised. This error will be treated in the same way as a deadlock:
      the transaction will be rolled back.
      
      lock_clust_rec_read_check_and_lock(): If the current transaction has
      a read view where the record is not visible and
      innodb_snapshot_isolation=ON, fail before trying to acquire the lock.
      
      row_sel_build_committed_vers_for_mysql(): If innodb_snapshot_isolation=ON,
      disable the "semi-consistent read" logic that had been implemented by
      myself on the directions of Heikki Tuuri in order to address
      https://bugs.mysql.com/bug.php?id=3300 that was motivated by a customer
      wanting UPDATE to skip locked rows that do not match the WHERE condition.
      It looks like my changes were included in the MySQL 5.1.5
      commit ad126d90; at that time, employees
      of Innobase Oy (a recent acquisition of Oracle) had lost write access to
      the repository.
      
      The only reason why we set innodb_snapshot_isolation=OFF by default is
      backward compatibility with applications, such as the one that motivated
      the implementation of "semi-consistent read" back in 2005. In a later
      major release, we can default to innodb_snapshot_isolation=ON.
      
      Thanks to Peter Alvaro, Kyle Kingsbury and Alexey Gotsman for their work
      on https://github.com/jepsen-io/ and to Kyle and Alexey for explanations
      and some testing of this fix.
      
      Thanks to Vladislav Lesin for the initial test for MDEV-26643,
      as well as reviewing these changes.
      b8a67198
  16. 19 Mar, 2024 1 commit