maria:bb-10.8-online-alter

Last commit made on 2021-12-15
Get this branch:
git clone -b bb-10.8-online-alter https://git.launchpad.net/maria

Branch merges

Branch information

Name:
bb-10.8-online-alter
Repository:
lp:maria

Recent commits

cf7cc37... by Nikita Malyavin

fix savepoints in myisam

4a128ca... by Nikita Malyavin

fix main.delayed

7300151... by Nikita Malyavin

fix skipping rocksdb

19504df... by Nikita Malyavin

add binlog/standalone combinations

55e9935... by Nikita Malyavin

add rocksdb combination

06645b1... by Nikita Malyavin

savepoints

9ffcd13... by Sergei Golubchik

rename tests

to avoid online_alter and alter_table_online which are about
very different features

alter_table_online -> alter_table_locknone
gis-alter_table_online -> gis-alter_table
online_alter -> alter_table_online

730926a... by Nikita Malyavin

MDEV-16329 [5/5] ALTER ONLINE TABLE

* 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.

cf52ea3... by Nikita Malyavin

MDEV-16329 [4/5] Refactor MYSQL_BIN_LOG: extract Event_log ancestor

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

0445c8f... by Nikita Malyavin

MDEV-16329 [3/5] use binlog_cache_data directly in most places

* 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.