• Monty's avatar
    Clean up and speed up interfaces for binary row logging · 91ab42a8
    Monty authored
    MDEV-21605 Clean up and speed up interfaces for binary row logging
    MDEV-21617 Bug fix for previous version of this code
    
    The intention is to have as few 'if' as possible in ha_write() and
    related functions. This is done by pre-calculating once per statement the
    row_logging state for all tables.
    
    Benefits are simpler and faster code both when binary logging is disabled
    and when it's enabled.
    
    Changes:
    - Added handler->row_logging to make it easy to check it table should be
      row logged. This also made it easier to disabling row logging for system,
      internal and temporary tables.
    - The tables row_logging capabilities are checked once per "statements
      that updates tables" in THD::binlog_prepare_for_row_logging() which
      is called when needed from THD::decide_logging_format().
    - Removed most usage of tmp_disable_binlog(), reenable_binlog() and
      temporary saving and setting of thd->variables.option_bits.
    - Moved checks that can't change during a statement from
      check_table_binlog_row_based() to check_table_binlog_row_based_internal()
    - Removed flag row_already_logged (used by sequence engine)
    - Moved binlog_log_row() to a handler::
    - Moved write_locked_table_maps() to THD::binlog_write_table_maps() as
      most other related binlog functions are in THD.
    - Removed binlog_write_table_map() and binlog_log_row_internal() as
      they are now obsolete as 'has_transactions()' is pre-calculated in
      prepare_for_row_logging().
    - Remove 'is_transactional' argument from binlog_write_table_map() as this
      can now be read from handler.
    - Changed order of 'if's in handler::external_lock() and wsrep_mysqld.h
      to first evaluate fast and likely cases before more complex ones.
    - Added error checking in ha_write_row() and related functions if
      binlog_log_row() failed.
    - Don't clear check_table_binlog_row_based_result in
      clear_cached_table_binlog_row_based_flag() as it's not needed.
    - THD::clear_binlog_table_maps() has been replaced with
      THD::reset_binlog_for_next_statement()
    - Added 'MYSQL_OPEN_IGNORE_LOGGING_FORMAT' flag to open_and_lock_tables()
      to avoid calculating of binary log format for internal opens. This flag
      is also used to avoid reading statistics tables for internal tables.
    - Added OPTION_BINLOG_LOG_OFF as a simple way to turn of binlog temporary
      for create (instead of using THD::sql_log_bin_off.
    - Removed flag THD::sql_log_bin_off (not needed anymore)
    - Speed up THD::decide_logging_format() by remembering if blackhole engine
      is used and avoid a loop over all tables if it's not used
      (the common case).
    - THD::decide_logging_format() is not called anymore if no tables are used
      for the statement. This will speed up pure stored procedure code with
      about 5%+ according to some simple tests.
    - We now get annotated events on slave if a CREATE ... SELECT statement
      is transformed on the slave from statement to row logging.
    - In the original code, the master could come into a state where row
      logging is enforced for all future events if statement could be used.
      This is now partly fixed.
    
    Other changes:
    - Ensure that all tables used by a statement has query_id set.
    - Had to restore the row_logging flag for not used tables in
      THD::binlog_write_table_maps (not normal scenario)
    - Removed injector::transaction::use_table(server_id_type sid, table tbl)
      as it's not used.
    - Cleaned up set_slave_thread_options()
    - Some more DBUG_ENTER/DBUG_RETURN, code comments and minor indentation
      changes.
    - Ensure we only call THD::decide_logging_format_low() once in
      mysql_insert() (inefficiency).
    - Don't annotate INSERT DELAYED
    - Removed zeroing pos_in_table_list in THD::open_temporary_table() as it's
      already 0
    91ab42a8
log.cc 329 KB