1. 01 Oct, 2024 1 commit
    • Vlad Lesin's avatar
      MDEV-34690 lock_rec_unlock_unmodified() causes deadlock · 8d3d85e5
      Vlad Lesin authored
      lock_rec_unlock_unmodified() is executed either under lock_sys.wr_lock()
      or under a combination of lock_sys.rd_lock() + record locks hash table
      cell latch. It also requests page latch to check if locked records were
      changed by the current transaction or not.
      
      Usually InnoDB requests page latch to find the certain record on the
      page, and then requests lock_sys and/or record lock hash cell latch to
      request record lock. lock_rec_unlock_unmodified() requests the latches
      in the opposite order, what causes deadlocks. One of the possible
      scenario for the deadlock is the following:
      
      thread 1 - lock_rec_unlock_unmodified() is invoked under locks hash table
                 cell latch, the latch is acquired;
      thread 2 - purge thread acquires page latch and tries to remove
                 delete-marked record, it invokes lock_update_delete(), which
                 requests locks hash table cell latch, held by thread 1;
      thread 1 - requests page latch, held by thread 2.
      
      To fix it we need to release lock_sys.latch and/or lock hash cell latch,
      acquire page latch and re-acquire lock_sys related latches.
      
      When lock_sys.latch and/or lock hash cell latch are released in
      lock_release_on_prepare() and lock_release_on_prepare_try(), the page on
      which the current lock is held, can be merged. In this case the bitmap
      of the current lock must be cleared, and the new lock must be added to
      the end of trx->lock.trx_locks list, or bitmap of already existing lock
      must be changed.
      
      The new field trx_lock_t::set_nth_bit_calls indicates if new locks
      (bits in existing lock bitmaps or new lock objects) were created during
      the period when lock_sys was released in trx->lock.trx_locks list
      iteration loop in lock_release_on_prepare() or
      lock_release_on_prepare_try(). And, if so, we traverse the list again.
      
      The block can be freed during pages merging, what causes assertion
      failure in buf_page_get_gen(), as btr_block_get() passes BUF_GET as page
      get mode to it. That's why page_get_mode parameter was added to
      btr_block_get() to pass BUF_GET_POSSIBLY_FREED from
      lock_release_on_prepare() and lock_release_on_prepare_try() to
      buf_page_get_gen().
      
      As searching for id of trx, which modified secondary index record, is
      quite expensive operation, restrict its usage for master. System variable
      was added to remove the restriction for testing simplifying. The
      variable exists only either for debug build or for build with
      -DINNODB_ENABLE_XAP_UNLOCK_UNMODIFIED_FOR_PRIMARY option to increase the
      probability of catching bugs for release build with RQG.
      
      Reviewed by Marko Mäkelä, Debarun Banerjee.
      8d3d85e5
  2. 27 Sep, 2024 3 commits
    • Vlad Lesin's avatar
      MDEV-34466 XA prepare don't release unmodified records for some cases · cdde97db
      Vlad Lesin authored
      There is no need to exclude exclusive non-gap locks from the procedure
      of locks releasing on XA PREPARE execution in
      lock_release_on_prepare_try() after commit
      17e59ed3 (MDEV-33454), because
      lock_rec_unlock_unmodified() should check if the record was modified
      with the XA, and release the lock if it was not.
      
      lock_release_on_prepare_try(): don't skip X-locks, let
      lock_rec_unlock_unmodified() to process them.
      
      lock_sec_rec_some_has_impl(): add template parameter for not acquiring
      trx_t::mutex for the case if a caller already holds the mutex, don't
      crash if lock's bitmap is clean.
      
      row_vers_impl_x_locked(), row_vers_impl_x_locked_low(): add new argument
      to skip trx_t::mutex acquiring.
      
      rw_trx_hash_t::validate_element(): don't acquire trx_t::mutex if the
      current thread already holds it.
      
      Thanks to Andrei Elkin for finding the bug.
      Reviewed by Marko Mäkelä, Debarun Banerjee.
      cdde97db
    • Sergei Petrunia's avatar
    • Sergei Petrunia's avatar
      MDEV-25822 JSON_TABLE: default values should allow non-string literals · d0a6a788
      Sergei Petrunia authored
      (Polished initial patch by Alexey Botchkov)
      Make the code handle DEFAULT values of any datatype
      
      - Make Json_table_column::On_response::m_default be Item*, not LEX_STRING.
      - Change the parser to use string literal non-terminals for producing
        the DEFAULT value
      -- Also, stop updating json_table->m_text_literal_cs for the DEFAULT
         value literals as it is not used.
      d0a6a788
  3. 24 Sep, 2024 1 commit
    • Denis Protivensky's avatar
      MDEV-34836: TOI on parent table must BF abort SR in progress on a child · 231900e5
      Denis Protivensky authored
      Applied SR transaction on the child table was not BF aborted by TOI running
      on the parent table for several reasons:
      
      Although SR correctly collected FK-referenced keys to parent, TOI in Galera
      disregards common certification index and simply sets itself to depend on
      the latest certified write set seqno.
      
      Since this write set was the fragment of SR transaction, TOI was allowed to
      run in parallel with SR presuming it would BF abort the latter.
      
      At the same time, DML transactions in the server don't grab MDL locks on
      FK-referenced tables, thus parent table wasn't protected by an MDL lock from
      SR and it couldn't provoke MDL lock conflict for TOI to BF abort SR transaction.
      
      In InnoDB, DDL transactions grab shared MDL locks on child tables, which is not
      enough to trigger MDL conflict in Galera.
      
      InnoDB-level Wsrep patch didn't contain correct conflict resolution logic due to
      the fact that it was believed MDL locking should always produce conflicts correctly.
      
      The fix brings conflict resolution rules similar to MDL-level checks to InnoDB,
      thus accounting for the problematic case.
      
      Apart from that, wsrep_thd_is_SR() is patched to return true only for executing
      SR transactions. It should be safe as any other SR state is either the same as
      for any single write set (thus making the two logically equivalent), or it reflects
      an SR transaction as being aborting or prepared, which is handled separately in
      BF-aborting logic, and for regular execution path it should not matter at all.
      Signed-off-by: default avatarJulius Goryavsky <julius.goryavsky@mariadb.com>
      231900e5
  4. 23 Sep, 2024 2 commits
    • Marko Mäkelä's avatar
      MDEV-34983: Remove x86 asm from InnoDB · 638c62ac
      Marko Mäkelä authored
      Starting with GCC 7 and clang 15, single-bit operations such as
      fetch_or(1) & 1 are translated into 80386 instructions such as
      LOCK BTS, instead of using the generic translation pattern
      of emitting a loop around LOCK CMPXCHG.
      
      Given that the oldest currently supported GNU/Linux distributions
      ship GCC 7, and that older versions of GCC are out of support,
      let us remove some work-arounds that are not strictly necessary.
      If someone compiles the code using an older compiler, it will work
      but possibly less efficiently.
      
      srw_mutex_impl::HOLDER: Changed from 1U<<31 to 1 in order to
      work around https://github.com/llvm/llvm-project/issues/37322
      which is specific to setting the most significant bit.
      
      srw_mutex_impl::WAITER: A multiplier of waiting requests.
      This used to be 1, which would now collide with HOLDER.
      
      fil_space_t::set_stopping(): Remove this unused function.
      
      In MSVC we need _interlockedbittestandset() for LOCK BTS.
      638c62ac
    • Lena Startseva's avatar
  5. 20 Sep, 2024 2 commits
  6. 16 Sep, 2024 2 commits
  7. 15 Sep, 2024 12 commits
  8. 14 Sep, 2024 1 commit
    • Marko Mäkelä's avatar
      mtr_t::log_file_op(): Fix -Wnonnull · 4010dff0
      Marko Mäkelä authored
      GCC 12.2.0 could issue -Wnonnull for an unreachable call to
      strlen(new_path).  Let us prevent that by replacing the condition
      (type == FILE_RENAME) with the equivalent (new_path).
      This should also optimize the generated code, because the life time
      of the parameter "type" will be reduced.
      4010dff0
  9. 13 Sep, 2024 1 commit
    • Marko Mäkelä's avatar
      MDEV-34921 MemorySanitizer reports errors for non-debug builds · b331cde2
      Marko Mäkelä authored
      my_b_encr_write(): Initialize also block_length, and at the same time
      last_block_length, so that all 128 bits can be initialized with fewer
      writes. This fixes an error that was caught in the test
      encryption.tempfiles_encrypted.
      
      test_my_safe_print_str(): Skip a test that would attempt to
      display uninitialized data in the test unit.stacktrace.
      Previously, our CI did not build unit tests with MemorySanitizer.
      
      handle_delayed_insert(): Remove a redundant call to pthread_exit(0),
      which would for some reason cause MemorySanitizer in clang-19 to
      report a stack overflow in a RelWithDebInfo build. This fixes a
      failure of several tests.
      
      Reviewed by: Vladislav Vaintroub
      b331cde2
  10. 12 Sep, 2024 5 commits
  11. 11 Sep, 2024 5 commits
  12. 10 Sep, 2024 5 commits