← Back to team overview

maria-developers team mailing list archive

Re: 17548c8a8b6: MDEV-25477 Auto-create breaks replication when triggering event was not replicated

 

Hi, Aleksey,

Basically, it's fine, but I still didn't like that there's a new flag in
THD to mark a statement that has to be logged. So I tried to change to
log_current_statement. I know you tried that and you told me what tests
fails, rpl.create_or_replace_*. I debugged that a bit, and I think the
problem is that select_create inherits from select_insert, so
CREATE ... SELECT runs your code that is only supposed to be run for
INSERT ODKU or REPLACE. This change makes all tests pass (after removing
vers_created_partitions):

@@ -4225,7 +4225,8 @@ bool select_insert::prepare_eof()
       thd->clear_error();
     else
       errcode= query_error_code(thd, killed_status == NOT_KILLED);
-    StatementBinlog stmt_binlog(thd, thd->binlog_need_stmt_format(trans_table));
+    StatementBinlog stmt_binlog(thd, !can_rollback_data() &&
+                                thd->binlog_need_stmt_format(trans_table));
     res= thd->binlog_query(THD::ROW_QUERY_TYPE,
                            thd->query(), thd->query_length(),
                            trans_table, FALSE, FALSE, errcode);

On Apr 10, Aleksey Midenkov wrote:
> revision-id: 17548c8a8b6 (mariadb-10.6.1-250-g17548c8a8b6)
> parent(s): 6282e025a0e
> author: Aleksey Midenkov
> committer: Aleksey Midenkov
> timestamp: 2022-03-07 23:49:35 +0300
> message:
> 
> MDEV-25477 Auto-create breaks replication when triggering event was not replicated
> 
> diff --git a/sql/sql_class.h b/sql/sql_class.h
> index 686e6e70766..4fed1bf7355 100644
> --- a/sql/sql_class.h
> +++ b/sql/sql_class.h
> @@ -2914,6 +2914,13 @@ class THD: public THD_count, /* this must be first */
>    int binlog_flush_pending_rows_event(bool stmt_end, bool is_transactional);
>    int binlog_remove_pending_rows_event(bool clear_maps, bool is_transactional);
>  
> +  bool binlog_need_stmt_format(bool is_transactional) const
> +  {
> +    return vers_created_partitions && !binlog_get_pending_rows_event(is_transactional);
> +  }
> +
> +  bool binlog_for_noop_dml(bool transactional_table);
> +
>    /**
>      Determine the binlog format of the current statement.
>  
> @@ -3557,6 +3564,7 @@ class THD: public THD_count, /* this must be first */
>    bool       tablespace_op;	/* This is TRUE in DISCARD/IMPORT TABLESPACE */
>    /* True if we have to log the current statement */
>    bool	     log_current_statement;
> +  uint       vers_created_partitions;
>    /**
>      True if a slave error. Causes the slave to stop. Not the same
>      as the statement execution error (is_error()), since
> diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
> index 707b8a0d3bf..25551dfa197 100644
> --- a/sql/sql_insert.cc
> +++ b/sql/sql_insert.cc
> @@ -4223,6 +4225,7 @@ bool select_insert::prepare_eof()
>        thd->clear_error();
>      else
>        errcode= query_error_code(thd, killed_status == NOT_KILLED);
> +    StatementBinlog stmt_binlog(thd, thd->binlog_need_stmt_format(trans_table));
>      res= thd->binlog_query(THD::ROW_QUERY_TYPE,
>                             thd->query(), thd->query_length(),
>                             trans_table, FALSE, FALSE, errcode);

Regards,
Sergei
VP of MariaDB Server Engineering
and security@xxxxxxxxxxx


Follow ups