1. 30 Jun, 2023 13 commits
    • Nikita Malyavin's avatar
      MDEV-16329 [5/5] ALTER ONLINE TABLE · f7ff9b40
      Nikita Malyavin authored
      * Log rows in online_alter_binlog.
      * Table online data is replicated within dedicated binlog file
      * Cached data is written on commit.
      * Versioning is fully supported.
      * Works both wit and without binlog enabled.
      
      * For now savepoints setup is forbidden while ONLINE ALTER goes on.
        Extra support is required. We can simply log the SAVEPOINT query events
        and replicate them together with row events. But it's not implemented
        for now.
      
      * Cache flipping:
      
        We want to care for the possible bottleneck in the online alter binlog
        reading/writing in advance.
      
        IO_CACHE does not provide anything better that sequential access,
        besides, only a single write is mutex-protected, which is not suitable,
        since we should write a transaction atomically.
      
        To solve this, a special layer on top Event_log is implemented.
        There are two IO_CACHE files underneath: one for reading, and one for
        writing.
      
        Once the read cache is empty, an exclusive lock is acquired (we can wait
        for a currently active transaction finish writing), and flip() is emitted,
        i.e. the write cache is reopened for read, and the read cache is emptied,
        and reopened for writing.
      
        This reminds a buffer flip that happens in accelerated graphics
        (DirectX/OpenGL/etc).
      
        Cache_flip_event_log is considered non-blocking for a single reader and a
        single writer in this sense, with the only lock held by reader during flip.
      
        An alternative approach by implementing a fair concurrent circular buffer
        is described in MDEV-24676.
      
      * Cache managers:
        We have two cache sinks: statement and transactional.
        It is important that the changes are first cached per-statement and
        per-transaction.
        If a statement fails, then only statement data is rolled back. The
        transaction moves along, however.
      
        Turns out, there's no guarantee that TABLE well persist in
        thd->open_tables to the transaction commit moment.
        If an error occurs, tables from statement are purged.
        Therefore, we can't store te caches in TABLE. Ideally, it should be
        handlerton, but we cut the corner and store it in THD in a list.
      f7ff9b40
    • Nikita Malyavin's avatar
      MDEV-16329 [4/5] Refactor MYSQL_BIN_LOG: extract Event_log ancestor · 20aae939
      Nikita Malyavin authored
      Event_log is supposed to be a basic logging class that can write events in
      a single file.
      
      MYSQL_BIN_LOG in comparison will have:
      * rotation support
      * index files
      * purging
      * gtid and transactional information handling.
      * is dedicated for a general-purpose binlog
      20aae939
    • Nikita Malyavin's avatar
      MDEV-16329 [3/5] use binlog_cache_data directly in most places · 9ca93a9c
      Nikita Malyavin authored
      * Eliminate most usages of THD::use_trans_table. Only 3 left, and they are
        at quite high levels, and really essential.
      * Eliminate is_transactional argument when possible. Lots of places are
        left though, because of some WSREP error handling in
        MYSQL_BIN_LOG::set_write_error.
      * Remove junk binlog functions from THD
      * binlog_prepare_pending_rows_event is moved to log.cc inside MYSQL_BIN_LOG
        and is not anymore template. Instead it accepls event factory with a type
        code, and a callback to a constructing function in it.
      9ca93a9c
    • Nikita Malyavin's avatar
      MDEV-16329 [2/5] refactor binlog and cache_mngr · ecf47bc2
      Nikita Malyavin authored
      pump up binlog and cache manager to level of binlog_log_row_internal
      ecf47bc2
    • Nikita Malyavin's avatar
      a49e51b5
    • Nikita Malyavin's avatar
      rpl: repack table_def · 0a7a45b4
      Nikita Malyavin authored
      1. Change m_size to uint. This removes some implicit conversions.
        See unpack_row, for instance:
        uint max_cols= MY_MIN(tabledef->size(), cols->n_bits);
      2. Improve table_def memory layout by reordering columns
      0a7a45b4
    • Nikita Malyavin's avatar
      Copy_field: add const to arguments · 2e07d9c0
      Nikita Malyavin authored
      2e07d9c0
    • Sergei Golubchik's avatar
      rename tests · 208f8343
      Sergei Golubchik authored
      alter_table_online -> alter_table_locknone
      gis-alter_table_online -> gis-alter_table
      208f8343
    • Sergei Golubchik's avatar
    • Sergei Golubchik's avatar
      cleanup: remove vcol_info->stored_in_db · eff78011
      Sergei Golubchik authored
      it was redundant, duplicating vcol_type == VCOL_GENERATED_STORED.
      
      Note that VCOL_DEFAULT is not "stored", "stored vcol" means that after
      rnd_next or index_read/etc the field value is already in the record[0]
      and does not need to be calculated separately
      eff78011
    • Sergei Golubchik's avatar
      Fix recalculation of vcols in binlog_row_image=minimal · efa160c3
      Sergei Golubchik authored
      unpack_row() must calculate all stored and indexed vcols
      (in fill_extra_persistent_columns()).
      
      Also Update and Delete row events must mark in read_set
      all columns needed for calculating all stored and indexed vcols.
      
      If it's done properly in do_apply_event(), it no longer needs
      to be repeated per row.
      efa160c3
    • Sergei Golubchik's avatar
      cleanup: clarify ha_innobase::column_bitmaps_signal() · f1310b9d
      Sergei Golubchik authored
      it was created to handle the case of the concurrent
      inplace add index. So it should only work in that case,
      otherwise it's doing server's job (marks virtual column dependencies)
      and hides server's bugs. And it was redundant.
      f1310b9d
    • Sergei Golubchik's avatar
      allow random_bytes() in virtual columns · 0d6ed735
      Sergei Golubchik authored
      0d6ed735
  2. 28 Jun, 2023 4 commits
  3. 27 Jun, 2023 5 commits
  4. 26 Jun, 2023 5 commits
  5. 25 Jun, 2023 9 commits
  6. 21 Jun, 2023 3 commits
    • Brandon Nesterenko's avatar
      MDEV-29894: Calling a function from a different database in a slave side trigger crashes · c2d44ecb
      Brandon Nesterenko authored
      When opening and locking tables, if triggers will be invoked in a
      separate database, thd->set_db() is invoked, thus freeeing the memory
      and headers which thd->db had previously pointed to. In row based
      replication, the event execution logic initializes thd->db to point
      to the database which the event targets, which is owned by the
      corresponding table share (introduced in d9898c9a for MDEV-7409).
      The problem then, is that during the table opening and locking
      process for a row event, memory which belongs to the table share
      would be freed, which is not valid.
      
      This patch replaces the thd->reset_db() calls to thd->set_db(),
      which copies-by-value, rather than by reference. Then when the
      memory is freed, our copy of memory is freed, rather than memory
      which belongs to a table share.
      
      Notes:
        1. The call to change thd->db now happens on a higher-level, in
      Rows_log_event::do_apply_event() rather than ::do_exec_row(), in the
      call stack. This is because do_exec_row() is called within a loop,
      and each invocation would redundantly set and unset the db to the
      same value.
        2. thd->set_db() is only used if triggers are to be invoked, as
      there is no vulnerability in the non-trigger case, and copying
      memory would be an unnecessary inefficiency.
      
      Reviewed By:
      ============
      Andrei Elkin <andrei.elkin@mariadb.com>
      c2d44ecb
    • Monty's avatar
      MDEV-31375 Assertion `dbl_records <= s->records' failed with optimizer_use_condition_selectivity=1 · 3d617fdc
      Monty authored
      The reason for the crash wad that 'best splitting' optimization
      predicted less rows to be found than what opt_range did.
      This code in apply_selectivity_for_table(), when using use_cond_selectivity=1,
      was not prepared for this case which caused an assert in debug builds.
      Production builds is not affected.
      
      The fix is to choose the smaller of the two row counts. It will have a
      minimum on costs when using use_cond_selectivity=1 and should not cause
      any problems in production.
      3d617fdc
    • Monty's avatar
      MDEV-31494 Server crashes in ha_partition::index_blocks / get_key_scans_params · d3c81804
      Monty authored
      MDEV-31445 Server crashes in ha_partition::index_blocks / cost_for_index_read
      
      The crash happened in the case where partition pruning finds 0
      partitions.
      d3c81804
  7. 20 Jun, 2023 1 commit