1. 05 Jun, 2020 7 commits
    • Marko Mäkelä's avatar
      Merge 10.3 into 10.4 · 68d9d512
      Marko Mäkelä authored
      68d9d512
    • Marko Mäkelä's avatar
      286e52e9
    • Marko Mäkelä's avatar
      Merge 10.2 into 10.3 · 680463a8
      Marko Mäkelä authored
      680463a8
    • Marko Mäkelä's avatar
      MDEV-22769 Shutdown hang or crash due to XA breaking locks · efc70da5
      Marko Mäkelä authored
      The background drop table queue in InnoDB is a work-around for
      cases where the SQL layer is requesting DDL on tables on which
      transactional locks exist.
      
      One such case are XA transactions. Our test case exploits the
      fact that the recovery of XA PREPARE transactions will
      only resurrect InnoDB table locks, but not MDL that should
      block any concurrent DDL.
      
      srv_shutdown_t: Introduce the srv_shutdown_state=SRV_SHUTDOWN_INITIATED
      for the initial part of shutdown, to wait for the background drop
      table queue to be emptied.
      
      srv_shutdown_bg_undo_sources(): Assign
      srv_shutdown_state=SRV_SHUTDOWN_INITIATED
      before waiting for the background drop table queue to be emptied.
      
      row_drop_tables_for_mysql_in_background(): On slow shutdown, if
      no active transactions exist (excluding ones that are in
      XA PREPARE state), skip any tables on which locks exist.
      
      row_drop_table_for_mysql(): Do not unnecessarily attempt to
      drop InnoDB persistent statistics for tables that have
      already been added to the background drop table queue.
      
      row_mysql_close(): Relax an assertion, and free all memory
      even if innodb_force_recovery=2 would prevent the background
      drop table queue from being emptied.
      efc70da5
    • Marko Mäkelä's avatar
      MDEV-22790 Race between btr_page_mtr_lock() dropping AHI on the same block · 138c11cc
      Marko Mäkelä authored
      This race condition was introduced by
      commit ad6171b9 (MDEV-22456).
      
      In the observed case, two threads were executing
      btr_search_drop_page_hash_index() on the same block,
      to free a stale entry that was attached to a dropped index.
      Both threads were holding an S latch on the block.
      
      We must prevent the double-free of block->index by holding
      block->lock in exclusive mode.
      
      btr_search_guess_on_hash(): Do not invoke
      btr_search_drop_page_hash_index(block) to get rid of
      stale entries, because we are not necessarily holding
      an exclusive block->lock here.
      
      buf_defer_drop_ahi(): New function, to safely drop stale
      entries in buf_page_mtr_lock(). We will skip the call to
      btr_search_drop_page_hash_index(block) when only requesting
      bufferfixing (no page latch), because in that case, we should
      not be accessing the adaptive hash index, and we might get
      a deadlock if we acquired the page latch.
      138c11cc
    • Marko Mäkelä's avatar
      MDEV-22646: Fix a memory leak · 3677dd5c
      Marko Mäkelä authored
      btr_search_sys_free(): Free btr_search_sys->hash_tables.
      
      The leak was introduced in commit ad2bf112.
      3677dd5c
    • Vladislav Vaintroub's avatar
      Windows, build tweak. · 1828196f
      Vladislav Vaintroub authored
      Allow targets for building "noinstall" zip, and debuginfo zip.
      1828196f
  2. 04 Jun, 2020 7 commits
    • Sergei Golubchik's avatar
      29ed04cb
    • Sergey Vojtovich's avatar
      MDEV-22339 - Assertion `str_length < len' failed · dce4c0f9
      Sergey Vojtovich authored
      When acquiring SNW/SNRW/X MDL lock DDL/admin statements may abort pending
      thr lock in concurrent connection with open HANDLER (or delayed insert
      thread).
      
      This may lead to a race condition when table->alias is accessed
      concurrently by such threads. Either assertion failure or memory leak
      is a practical consequence of this race condition.
      
      Specifically HANDLER is opening a table and issuing alias.copy(), while
      DDL executing get_lock_data()/alias.c_ptr()/realloc()/realloc_raw().
      
      Fixed by perforimg table->init() before it is published via
      thd->open_tables.
      dce4c0f9
    • Varun Gupta's avatar
      MDEV-21626: Optimizer misses the details about the picked join order · 64046459
      Varun Gupta authored
      Added cost of sorting estimate to the optimizer trace
      64046459
    • Marko Mäkelä's avatar
      dict_check_sys_tables(): Do not rely on buf_page_optimistic_get() · c5883deb
      Marko Mäkelä authored
      We are supposed to commit and restart the mini-transaction
      between records. There is no point to store and restore the
      persistent cursor position otherwise.
      
      If buf_page_optimistic_get() is patched to always fail, the
      debug build would fail to start up due to trying to re-acquire
      an already S-latched block.
      
      This bug (which should not have visible impact to users, because
      the code is only executed during startup, while no other threads
      are accessing B-trees or causing pages to be evicted from the
      buffer pool) was caught as part of a debugging effort for
      something else.
      
      The debugging approach was: Make buf_page_optimistic_get()
      always return FALSE, and add ut_a(block->lock.lock_word == X_LOCK_DECR)
      to both buf_LRU_get_free_only() and buf_LRU_block_free_non_file_page().
      This would catch misuse of the buffer pool. If it were not for
      buf_page_optimistic_get(), no buf_block_t::lock of any BUF_BLOCK_NOT_USED
      block would ever be acquired.
      c5883deb
    • Varun Gupta's avatar
      MDEV-16230: Server crashes when Analyze format=json is run with a window... · f69278bc
      Varun Gupta authored
      MDEV-16230: Server crashes when Analyze format=json is run with a window function with empty PARTITION BY and ORDER BY clauses
      
      Currently when both PARTITION BY and ORDER BY clauses are empty then we create a Item
      with the first field in the select list and sort with that field.
      It should be created as an Item_temptable_field instead of Item_field because the
      print() function continues to work even if the table has been dropped.
      f69278bc
    • Aleksey Midenkov's avatar
      MDEV-22112 Assertion `tab_part_info->part_type == RANGE_PARTITION ||... · 05693cf2
      Aleksey Midenkov authored
      MDEV-22112 Assertion `tab_part_info->part_type == RANGE_PARTITION || tab_part_info->part_type == LIST_PARTITION' failed in prep_alter_part_table
      
      Incorrect syntax for SYSTEM_TIME partition. work_part_info is detected
      as HASH partition. We cannot add partition of different type neither
      we cannot reorganize SYSTEM_TIME into/from different type
      partitioning.
      
      The sidefix for version until 10.5 corrects the message:
      "For LIST partitions each partition must be defined"
      05693cf2
    • Marko Mäkelä's avatar
      MDEV-22721 Remove bloat caused by InnoDB logger class · eba2d10a
      Marko Mäkelä authored
      Introduce a new ATTRIBUTE_NOINLINE to
      ib::logger member functions, and add UNIV_UNLIKELY hints to callers.
      
      Also, remove some crash reporting output. If needed, the
      information will be available using debugging tools.
      
      Furthermore, remove some fts_enable_diag_print output that included
      indexed words in raw form. The code seemed to assume that words are
      NUL-terminated byte strings. It is not clear whether a NUL terminator
      is always guaranteed to be present. Also, UCS2 or UTF-16 strings would
      typically contain many NUL bytes.
      eba2d10a
  3. 03 Jun, 2020 3 commits
    • Thirunarayanan Balathandayuthapani's avatar
      MDEV-22646 Assertion `table2->cached' failed in dict_table_t::add_to_cache · ad2bf112
      Thirunarayanan Balathandayuthapani authored
      Problem:
      ========
        During buffer pool resizing, InnoDB recreates the dictionary hash
      tables. Dictionary hash table reuses the heap of AHI hash tables.
      It leads to memory corruption.
      
      Fix:
      ====
      - While disabling AHI, free the heap and AHI hash tables. Recreate the
      AHI hash tables and assign new heap when AHI is enabled.
      
      - btr_blob_free() access invalid page if page was reallocated during
      buffer poolresizing. So btr_blob_free() should get the page from
      buf_pool instead of using existing block.
      
      - btr_search_enabled and block->index should be checked after
      acquiring the btr_search_sys latch
      
      - Moved the buffer_pool_scan debug sync to earlier before accessing the
      btr_search_sys latches to avoid the hang of truncate_purge_debug
      test case
      
      - srv_printf_innodb_monitor() should acquire btr_search_sys latches
      before AHI hash tables.
      ad2bf112
    • Marko Mäkelä's avatar
      MDEV-22577 innodb_fast_shutdown=0 fails to report purge progress · ca3aa679
      Marko Mäkelä authored
      srv_purge_should_exit(): Report progress on slow shutdown
      not only to systemd, but also to the error log.
      ca3aa679
    • Marko Mäkelä's avatar
      Merge 10.3 into 10.4 · 80591481
      Marko Mäkelä authored
      80591481
  4. 02 Jun, 2020 4 commits
  5. 01 Jun, 2020 7 commits
  6. 31 May, 2020 1 commit
  7. 30 May, 2020 2 commits
  8. 29 May, 2020 9 commits
    • Marko Mäkelä's avatar
      Merge 10.2 into 10.3 · e9aaa10c
      Marko Mäkelä authored
      e9aaa10c
    • Sergey Vojtovich's avatar
      Attempt fixing mroonga gcc 8 build failure · 49854811
      Sergey Vojtovich authored
      Part of MDEV-19061 - table_share used for reading statistical tables is
                           not protected
      49854811
    • Sergey Vojtovich's avatar
      Thread safe histograms loading · c2798784
      Sergey Vojtovich authored
      Previously multiple threads were allowed to load histograms concurrently.
      There were no known problems caused by this. But given amount of data
      races in this code, it'd happen sooner or later.
      
      To avoid scalability bottleneck, histograms loading is protected by
      per-TABLE_SHARE atomic variable.
      
      Whenever histograms were loaded by preceding statement (hot-path), a
      scalable load-acquire check is performed.
      
      Whenever histograms have to be loaded anew, mutual exclusion for loaders
      is established by atomic variable. If histograms are being loaded
      concurrently, statement waits until load is completed.
      
      - Table_statistics::total_hist_size moved to TABLE_STATISTICS_CB: only
        meaningful within TABLE_SHARE (not used for collected stats).
      - TABLE_STATISTICS_CB::histograms_can_be_read and
        TABLE_STATISTICS_CB::histograms_are_read are replaced with a tri state
        atomic variable.
      - Simplified away alloc_histograms_for_table_share().
      
      Note: there's still likely a data race if a thread attempts accessing
      histograms data after it failed to load it (because of concurrent load).
      It was there previously and goes out of the scope of this effort. One way
      of fixing it could be reviving TABLE::histograms_are_read and adding
      appropriate checks whenever it is needed.
      
      Part of MDEV-19061 - table_share used for reading statistical tables is
                           not protected
      c2798784
    • Sergey Vojtovich's avatar
      Thread safe statistics loading · 609a0d3d
      Sergey Vojtovich authored
      Previously multiple threads were allowed to load statistics concurrently.
      There were no known problems caused by this. But given amount of data
      races in this code, it'd happen sooner or later.
      
      To avoid scalability bottleneck, statistics loading is protected by
      per-TABLE_SHARE atomic variable.
      
      Whenever statistics were loaded by preceding statement (hot-path), a
      scalable load-acquire check is performed.
      
      Whenever statistics have to be loaded anew, mutual exclusion for loaders
      is established by atomic variable. If statistics are being loaded
      concurrently, statement waits until load is completed.
      
      TABLE_STATISTICS_CB::stats_can_be_read and
      TABLE_STATISTICS_CB::stats_is_read are replaced with a tri state atomic
      variable.
      
      Part of MDEV-19061 - table_share used for reading statistical tables is
                           not protected
      609a0d3d
    • Sergey Vojtovich's avatar
      Simplified away statistics_for_tables_is_needed() · 1055a7f4
      Sergey Vojtovich authored
      Removed redundant loops, integrated logics into the caller instead.
      Unified condition in read_statistics_for_tables(), less
      "table_share != NULL" checks, no more potential "table_share == NULL"
      dereferencing.
      
      Part of MDEV-19061 - table_share used for reading statistical tables is
                           not protected
      1055a7f4
    • Aleksey Midenkov's avatar
      MDEV-22283 Server crashes in key_copy or unexpected error 156 · 4783494a
      Aleksey Midenkov authored
      (The table already existed in the storage engine)
      
      Wrong algorithm of closing partitions on error doesn't close last
      partition.
      4783494a
    • Kentoku SHIBA's avatar
    • Kentoku SHIBA's avatar
    • Alexander Barkov's avatar
      MDEV-22744 *SAN: sql/item_xmlfunc.cc:791:43: runtime error: downcast of... · a2932e86
      Alexander Barkov authored
      MDEV-22744 *SAN: sql/item_xmlfunc.cc:791:43: runtime error: downcast of address ... which does not point to an object of type 'Item_func' note: object is of type 'Item_bool' (on optimized builds)
      
      In Item_nodeset_func_predicate::val_nodeset, args[1] is not necessarily
      an Item_func descendant. It can be Item_bool.
      
      Removing a wrong cast. It was not really needed anyway.
      a2932e86