1. 04 May, 2021 1 commit
    • Sergei Golubchik's avatar
      MDEV-21603 Crashing SHOW TABLES with derived table in WHERE condition · a20195bb
      Sergei Golubchik authored
      When you only need view structure, don't call handle_derived with
      DT_CREATE and rely on its internal hackish check to skip DT_CREATE.
      Because handle_derived is called from many different places,
      and this internal hackish check is indiscriminative.
      
      Instead, just don't ask handle_derived to do DT_CREATE
      if you don't want it to do DT_CREATE.
      a20195bb
  2. 03 May, 2021 4 commits
  3. 30 Apr, 2021 4 commits
    • Sujatha's avatar
      MDEV-16146: MariaDB slave stops with following errors. · abe6eb10
      Sujatha authored
      Problem:
      ========
      180511 11:07:58 [ERROR] Slave I/O: Unexpected master's heartbeat data:
      heartbeat is not compatible with local info;the event's data: log_file_name
      mysql-bin.000009 log_pos 1054262041, Error_code: 1623
      
      Analysis:
      =========
      In replication setup when master server doesn't have any events to send to
      slave server it sends an 'Heartbeat_log_event'. This event carries the
      current binary log filename and offset details. The offset values is stored
      within 4 bytes of event header. When the size of binary log is higher than
      UINT32_MAX the log_pos values will not fit in 4 bytes memory.  It overflows
      and hence slave stops with an error.
      
      Fix:
      ===
      Since we cannot extend the common_header of Log_event class, a greater than
      4GB value of Log_event::log_pos is made to be transported with a HeartBeat
      event's sub-header.  Log_event::log_pos in such case is set to zero to
      indicate that the 8 byte sub-header is allocated in the event.
      
      In case of cross version replication following behaviour is expected
      
      OLD - Server without fix
      NEW - Server with fix
      
      OLD<->NEW : works bidirectionally as long as the binlog offset is
                  (normally) within 4GB.
      
      When log_pos > UINT32_MAX
      OLD->NEW  : The 'log_pos' is bound to overflow and NEW slave may report
                  an invalid event/incompatible heart beat event error.
      NEW->OLD  : Since patched server sets log_pos=0 on overflow, OLD slave will
                  report invalid event error.
      abe6eb10
    • Thirunarayanan Balathandayuthapani's avatar
      MDEV-25536 InnoDB: Failing assertion: sym_node->table != NULL in pars_retrieve_table_def · 13b9af50
      Thirunarayanan Balathandayuthapani authored
      - Fixing post-push failure of innodb_fts_misc_1 test case.
      13b9af50
    • Thirunarayanan Balathandayuthapani's avatar
      MDEV-25536 InnoDB: Failing assertion: sym_node->table != NULL in pars_retrieve_table_def · 0024524d
      Thirunarayanan Balathandayuthapani authored
      InnoDB tries to fetch the deleted doc ids for discarded
      tablespace. In i_s_fts_deleted_generic_fill(), InnoDB needs
      to check whether the table is discarded or not before fetching
      deleted doc ids.
      0024524d
    • Marko Mäkelä's avatar
      MDEV-25568 RENAME TABLE causes "Ignoring data file" messages · 65d2fbaf
      Marko Mäkelä authored
      fil_ibd_load(): Remove a message that is basically saying that
      everything works as expected. The other "Ignoring data file" message
      about the presence of an extraneous file will be retained
      (and expected by the test innodb.log_file_name).
      65d2fbaf
  4. 29 Apr, 2021 4 commits
  5. 28 Apr, 2021 8 commits
  6. 27 Apr, 2021 9 commits
    • Sergei Golubchik's avatar
      Bug#29363867: LOST CONNECTION TO MYSQL SERVER DURING QUERY · 91599701
      Sergei Golubchik authored
      plugin variables in SET  only locked the plugin till the end of the
      statement. If SET with a plugin variable was prepared, it was possible
      to uninstall the plugin before EXECUTE. Then EXECUTE would crash,
      trying to resolve a now-invalid pointer to a disappeared variable.
      
      Fix: keep plugins locked until the prepared statement is closed.
      91599701
    • Sergei Golubchik's avatar
    • Sergei Golubchik's avatar
      MDEV-25326 mysql_install_db help text incomplete · 883b723d
      Sergei Golubchik authored
      encourage the use of mysql_secure_installation,
      that can always set the root password correctly for all root accounts,
      no matter how many are there and what the structure of privilege tables is
      883b723d
    • Thirunarayanan Balathandayuthapani's avatar
      MDEV-25503 InnoDB hangs on startup during recovery · b862377c
      Thirunarayanan Balathandayuthapani authored
      InnoDB startup hangs if a DDL transaction needs to be
      rolled back and a recovered transaction on statistics
      tables exists. In that case, InnoDB should rollback
      the transaction which holds locks on innodb_table_stats
      or innodb_index_stats during trx_rollback_or_clean_recovered().
      b862377c
    • Thirunarayanan Balathandayuthapani's avatar
      MDEV-22928 InnoDB fails to fetch index type when index mismatch happens · 2b0d5b78
      Thirunarayanan Balathandayuthapani authored
      InnoDB fails to fetch the index type when innodb dictionary
      doesn't match with frm. InnoDB should return corrupted if it
      can't find the index in ha_innobase::index_type().
      2b0d5b78
    • Nikita Malyavin's avatar
      MDEV-24583 SELECT aborts after failed REPLACE into table with vcol · 43e879c7
      Nikita Malyavin authored
      table->move_fields wasn't undone in case of error.
      
      1. move_fields is unconditionally undone even when error is occurred
      2. cherry-pick an assertion in `ptr_in_record`, which is already in 10.5
      43e879c7
    • Nikita Malyavin's avatar
      MDEV-19011 Assertion `file->s->base.reclength < file->s->vreclength' failed · f85afa51
      Nikita Malyavin authored
      The assertion is improved: storage engines like myisam always have to store
      at least one field, so the assertion does not cover tables with no stored
      columns.
      f85afa51
    • Nikita Malyavin's avatar
      MDEV-16962 Assertion failed in open_purge_table upon concurrent ALTER/FLUSH · 6ba5f81c
      Nikita Malyavin authored
      So we are having a race condition of three of threads, resulting in a
      deadlock backoff in purge, which is unexpected.
      
      More precisely, the following happens:
      T1: NOCOPY ALTER TABLE begins, and eventually it holds MDL_SHARED_NO_WRITE
       lock;
      T2: FLUSH TABLES begins. it sets share->tdc->flushed = true
      T3: purge on a record with virtual column begins. it is going to open a
       table. MDL_SHARED_READ lock is acquired therefore.
      Since share->tdc->flushed is set, it waits for a TDC purge end.
      T1: is going to elevate MDL LOCK to exclusive and therefore has to set
       other waiters to back off.
      T3: receives VICTIM status, reports a DEADLOCK, sets OT_BACKOFF_AND_RETRY
       to Open_table_context::m_action
      
      My fix is to allow opening table in purge while flushing. It is already
      done the same way in other maintainance facilities like REPAIR TABLE.
      
      Another way would be making an actual backoff, but Open_table_context
      does not allow to distinguish it from other failure types, which still
      seem to be unexpected. Making this would require hacking into
      Open_table_context interface for no benefit, in comparison to passing
      MYSQL_OPEN_IGNORE_FLUSH during table open.
      6ba5f81c
    • Nikita Malyavin's avatar
      revive innodb_debug_sync · 300253ac
      Nikita Malyavin authored
      innodb_debug_sync was introduced in commit
      b393e2cb and reverted in
      commit fc58c172 due to memory leak reported
      by valgrind, see MDEV-21336.
      
      The leak is now fixed by adding `rw_lock_free(&slot->debug_sync_lock)`
      after background thread working loop is finished, and the patch is
      reapplied, with respect to c++98 fixes by Marko.
      
      The missing DEBUG_SYNC for MDEV-18546 in row0vers.cc is also reapplied.
      300253ac
  7. 26 Apr, 2021 1 commit
    • Daniel Black's avatar
      MDEV-25513: raise systemd LimitNOFILE limits to match server defaults · a35cde8c
      Daniel Black authored
      Quoting MDEV reporter Daniel Lewart:
      
      Starting MariaDB with default configuration causes the following problems:
      
          "[Warning] Could not increase number of max_open_files to more than 16384 (request: 32186)"
          silently reduces table_open_cache_instances from 8 (default) to 4
      
      Default Server System Variables:
      
          extra_max_connections = 1
          max_connections = 151
          table_open_cache = 2000
          table_open_cache_instances = 8
          thread_pool_size = 4
      
      LimitNOFILE=16834 is in the following files:
      
          support-files/mariadb.service.in
          support-files/mariadb@.service.in
      
      Looking at sql/mysqld.cc lines 3837-3917:
      wanted_files= (extra_files + max_connections + extra_max_connections +
      tc_size * 2 * tc_instances);
      wanted_files+= threadpool_size;
      
      Plugging in the default values:
      wanted_files = (30 + 151 + 1 + 2000 * 2 * 8 + 4) = 32186
      
      However, systemd configuration has LimitNOFILE = 16384, which is far smaller.
      
      I suggest increasing LimitNOFILE to 32768.
      a35cde8c
  8. 25 Apr, 2021 2 commits
  9. 24 Apr, 2021 2 commits
    • Marko Mäkelä's avatar
      MDEV-23026/MDEV-25474 fixup: Assertion ib_table->stat_initialized · 14a18d7d
      Marko Mäkelä authored
      It is possible that an object that was originally created by
      open_purge_table() will remain cached and reused for SQL execution.
      Our previous fix wrongly assumed that ha_innobase::open() would
      always be called before SQL execution starts. Therefore, we must
      invoke dict_stats_init() in ha_innobase::info_low() instead of
      only doing it in ha_innobase::open().
      
      Note: Concurrent execution of dict_stats_init() on the same table
      is possible, but it also was possible between two calls to
      ha_innobase::open(), with no ill effects observed.
      
      This should fix the assertion failure on stat_initialized.
      A possibly easy way to reproduce it would have been
      to run the server with innodb_force_recovery=2 (disable the purge of
      history), update a table so that an indexed virtual column will be
      affected, and finally restart the server normally (purge enabled),
      to observe a crash when the table is accessed from SQL.
      
      The problem was first observed and this fix verified by
      Elena Stepanova. Also Thirunarayanan Balathandayuthapani
      repeated the problem.
      14a18d7d
    • Marko Mäkelä's avatar
      MDEV-25459 MVCC read from index on CHAR or VARCHAR wrongly omits rows · 25ed665a
      Marko Mäkelä authored
      row_sel_sec_rec_is_for_clust_rec(): If the field in the
      clustered index record stored off page, always fetch it,
      also when the secondary index field has been built on the
      entire column. This was broken ever since the InnoDB Plugin
      for MySQL Server 5.1 introduced ROW_FORMAT=DYNAMIC and
      ROW_FORMAT=COMPRESSED for InnoDB tables. That code was first
      introduced in this tree in
      commit 3945d5e5.
      
      For the original ROW_FORMAT=REDUNDANT and the MySQL 5.0.3
      ROW_FORMAT=COMPRESSED, there was no problem, because for
      those tables we always stored at least a 768-byte prefix of
      each column in the clustered index record.
      
      row_sel_sec_rec_is_for_blob(): Allow prefix_len==0 for matching
      the full column.
      25ed665a
  10. 23 Apr, 2021 4 commits
  11. 22 Apr, 2021 1 commit
    • Igor Babaev's avatar
      MDEV-24823 Crash with invalid multi-table update of view in 2nd execution of SP · b3b5d57e
      Igor Babaev authored
      Before this patch mergeable derived tables / view used in a multi-table
      update / delete were merged before the preparation stage.
      When the merge of a derived table / view is performed the on expression
      attached to it is fixed and ANDed with the where condition of the select S
      containing this derived table / view. It happens after the specification of
      the derived table / view has been merged into S. If the ON expression refers
      to a non existing field an error is reported and some other mergeable derived
      tables / views remain unmerged. It's not a problem if the multi-table
      update / delete statement is standalone. Yet if it is used in a stored
      procedure the select with incompletely merged derived tables / views may
      cause a problem for the second call of the procedure. This does not happen
      for select queries using derived tables / views, because in this case their
      specifications are merged after the preparation stage at which all ON
      expressions are fixed.
      This patch makes sure that merging of the derived tables / views used in a
      multi-table update / delete statement is performed after the preparation
      stage.
      
      Approved by Oleksandr Byelkin <sanja@mariadb.com>
      b3b5d57e