1. 02 Nov, 2020 17 commits
    • Marko Mäkelä's avatar
      Revert "MDEV-21452: Amend HEAD^" · 4b334320
      Marko Mäkelä authored
      This reverts commit d32ff4ff.
      The code around suspending and resuming threads is rather convoluted.
      In particular, que_thr_stop_for_mysql() and
      lock_wait_suspend_thread() are separated from each other,
      and the trx->mutex is being acquired and released multiple times
      while a lock wait is being registered. Also, there are multiple
      state fields related to lock waits, both in que_thr_t and trx_t.
      4b334320
    • Marko Mäkelä's avatar
      fixup deb3992c · ca0c5f96
      Marko Mäkelä authored
      ca0c5f96
    • Marko Mäkelä's avatar
      MDEV-21452: Replace ib_mutex_t with mysql_mutex_t · 60c0d1c5
      Marko Mäkelä authored
      latch_t: Replace with rw_lock_t. Only the InnoDB rw-lock implementation
      will be instrumented.
      
      FIXME: srv_sys should be removed altogether; it is duplicating tpool
      functionality.
      
      fil_crypt_threads_init(): To prevent SAFE_MUTEX warnings, we must
      not hold fil_system.mutex.
      
      fil_close_all_files(): To prevent SAFE_MUTEX warnings for
      fil_space_destroy_crypt_data(), we must not hold fil_system.mutex
      while invoking fil_space_free_low() on a detached tablespace.
      
      LatchDebug::get_level_name(): Implemented as a static function
      that references a compile-time constant array of level_names[].
      There should be no reason to create a constant std::map of numbers
      to compile-time string constants.
      60c0d1c5
    • Marko Mäkelä's avatar
      MDEV-21452: Remove os_event_t, MUTEX_EVENT, TTASEventMutex · 2bc3bf49
      Marko Mäkelä authored
      We will default to MUTEXTYPE=sys (using OSTrackMutex) for those
      ib_mutex_t that have not been replaced yet.
      
      The innodb_fatal_semaphore_wait_threshold will only apply to
      InnoDB rw_lock_t, not any mutexes any more.
      
      innodb_sync_debug=ON might still cover ib_mutex_t.
      2bc3bf49
    • Marko Mäkelä's avatar
      MDEV-21452: Amend HEAD^ · d32ff4ff
      Marko Mäkelä authored
      To hopefully avoid increasing contention on lock_sys.mutex,
      let us additionally protect trx->lock.wait_lock with trx->mutex
      so that lock_wait_suspend_thread() can avoid acquiring
      lock_sys.mutex and use trx_t::mutex instead.
      d32ff4ff
    • Marko Mäkelä's avatar
      MDEV-21452: Replace os_event_t (except TTASEventMutex::m_event) · deb3992c
      Marko Mäkelä authored
      Let us replace os_event_t with mysql_cond_t, and replace the
      necessary ib_mutex_t with mysql_mutex_t so that they can be
      used with condition variables.
      
      The default ib_mutex_t implementation will use os_event_t.
      
      Also, replace polling (os_thread_sleep() or timed waits)
      with plain mysql_cond_wait() wherever possible.
      
      FIXME: Add test coverage of
      mariabackup --backup --kill-long-queries-timeout
      
      FIXME: innodb_fatal_semaphore_wait_threshold no longer works
      because it used to rely on lock_sys.mutex. The test could be
      rewritten to rely on an InnoDB rw_lock_t instead.
      
      fts_cache_t::lock: Replaced the rw_lock_t with a mutex.
      The only shared latch user was i_s_fts_index_cache_fill(),
      for producing content for the view
      INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED.
      
      fts_cache_t::init_lock: Replaced the rw_lock_t with a mutex.
      This was only being acquired in exclusive mode.
      deb3992c
    • Marko Mäkelä's avatar
      MDEV-21452: Replace os_event_t in rw_lock_t · 88722a7c
      Marko Mäkelä authored
      Let us use a single rw_lock_t::wait_mutex and two condition
      variables wait_cond, wait_cond_ex instead of two os_event_t
      (which wrap a mutex and condition variable and some other data)
      
      sync_array_wait_event(): Implement new waiting rules for rw_lock_t.
      FIXME: Sometimes, rw_lock_s_lock() hangs here. TODO: Find out
      what the lock->lock_word is in those cases. Maybe we should
      treat not only the value 0 but also X_LOCK_HALF_DECR specially.
      88722a7c
    • Marko Mäkelä's avatar
      Fix clang -Winconsistent-missing-override · 440d4b28
      Marko Mäkelä authored
      440d4b28
    • Vladislav Vaintroub's avatar
      Windows : require at least VS2019 for MSVC. · 504d4c1f
      Vladislav Vaintroub authored
      This will  avoid some errors on appveyor, due to outdated SDKs.
      504d4c1f
    • Nikita Malyavin's avatar
    • Nikita Malyavin's avatar
      MDEV-22506 Malformed error message for ER_KEY_CONTAINS_PERIOD_FIELDS · e618f7e9
      Nikita Malyavin authored
      Though this is an error message task, the problem was deep in the
      `mysql_prepare_create_table` implementation. The problem is described as
      follows:
      
      1. `append_system_key_parts` was called before
      `mysql_prepare_create_table`, though key name generation was done close to
      the latest stage of the latter.
      2. We can't move `append_system_key_parts` in the end, because system keys
      should be appended before some checks done.
      3. If the checks from `append_system_key_parts` are moved to the end of
      `mysql_prepare_create_table`, then some other inappropriate errors are
      issued. like `ER_DUP_FIELDNAME`.
      
      To have key name specified in error message, name generation should be done
      before the checks, which consequenced in more changes.
      
      The final design for key initialization in `mysql_prepare_create_table`
      follows. The initialization is done in three phases:
      1. Calculate a total number of keys created with respect to keys ignored.
       Allocate KEY* buffer.
      2. Generate unique names; calculate a total number of key parts.
       Make early checks. Allocate KEY_PART_INFO* buffer.
      3. Initialize key parts, make the rest of the checks.
      e618f7e9
    • Nikita Malyavin's avatar
      MDEV-22677 UPDATE crashes on partitioned HEAP table WITHOUT OVERLAPS · a79c6e36
      Nikita Malyavin authored
      `ha_heap::clone` was creating a handler by share's handlerton, which is
      partition handlerton.
      
      handler's handlerton should be used instead.
      
      Here in particular, HEAP handlerton will be used and it will create ha_heap
      handler.
      a79c6e36
    • Nikita Malyavin's avatar
      MDEV-22608 ASAN use-after-poison in TABLE::check_period_overlaps · d9e00770
      Nikita Malyavin authored
      The bug was fixed by MDEV-22599 bugfix, which changed `Field::cmp` call
      to `Field::cmp_prefix` in `TABLE::check_period_overlaps`.
      
      The trick is that `Field_bit::cmp` apparently calls `Field_bit::cmp_key`,
      which condiders an argument an actual pointer to data, which isn't correct
      for `Field_bit`, since it stores data by `bit_ptr`. which is in the
      beginning of the record, and using `ptr` is incorrect (we use it through
      `ptr_in_record` call)
      d9e00770
    • Nikita Malyavin's avatar
      MDEV-22639 Assertion failed in ha_check_overlaps upon multi-table update · afca9768
      Nikita Malyavin authored
      After Sergei's cleanup this assertion is not actual anymore -- we can't
      predict if the handler was used for lookup, especially in multi-update
      scenario.
      
      `position(old_data)` is made earlier in `ha_check_overlaps`, therefore it
      is guaranteed that we compare right refs.
      afca9768
    • Nikita Malyavin's avatar
      MDEV-22714 Assertion failed upon multi-update on table WITHOUT OVERLAPS · d543363f
      Nikita Malyavin authored
      The problem here was that ha_check_overlaps internally uses ha_index_read,
      which in case of fail overwrites table->status. Even though the handlers
      are different, they share a common table, so the value is anyway spoiled.
      This is bad, and table->status is badly designed and overweighted by
      functionality, but nothing can be done with it, since the code related to
      this logic is ancient and it's impossible to extract it with normal effort.
      
      So let's just save and restore the value in ha_update_row before and after
      the checks.
      
      Other operations like INSERT and simple UPDATE are not in risk, since they
      don't use this table->status approach.
      DELETE does not do any unique checks, so it's also safe.
      d543363f
    • Nikita Malyavin's avatar
      Add DBUG_ASSERT in Field::ptr_in_record · 30894fe9
      Nikita Malyavin authored
      1. Subtracting table->record[0] from record is UB (non-contiguous buffers)
      2. It is very popular to use move_field_offset, which changes Field::ptr,
      but leaves table->record[0] unchanged. This makes a ptr_in_record result
      incorrect, since it relies on table->record[0] value.
      The check ensures the result is within the queried record boundaries.
      30894fe9
    • Elena Stepanova's avatar
      95fcd567
  2. 01 Nov, 2020 1 commit
  3. 31 Oct, 2020 1 commit
  4. 30 Oct, 2020 16 commits
  5. 29 Oct, 2020 5 commits