• Andrei Elkin's avatar
    MDEV-13577 slave_parallel_mode=optimistic should not report the mode's · 7bbe324f
    Andrei Elkin authored
               specific temporary errors
    
    The optimistic parallel slave's worker thread could face a run-time error due to
    the algorithm's specifics which allows for conflicts like the reported
    "Can't find record in 'table'".
    A typical stack is like
    
    {noformat}
    #0  handler::print_error (this=0x61c00008f8a0, error=149, errflag=0) at handler.cc:3650
    #1  0x0000555555e95361 in write_record (thd=thd@entry=0x62a0000a2208, table=table@entry=0x61f00008ce88, info=info@entry=0x7fffdee356d0) at sql_insert.cc:1944
    #2  0x0000555555ea7767 in mysql_insert (thd=thd@entry=0x62a0000a2208, table_list=0x61b00012ada0, fields=..., values_list=..., update_fields=..., update_values=..., duplic=<optimized out>, ignore=<optimized out>) at sql_insert.cc:1039
    #3  0x0000555555efda90 in mysql_execute_command (thd=thd@entry=0x62a0000a2208) at sql_parse.cc:3927
    #4  0x0000555555f0cc50 in mysql_parse (thd=0x62a0000a2208, rawbuf=<optimized out>, length=<optimized out>, parser_state=<optimized out>) at sql_parse.cc:7449
    #5  0x00005555566d4444 in Query_log_event::do_apply_event (this=0x61200005b9c8, rgi=<optimized out>, query_arg=<optimized out>, q_len_arg=<optimized out>) at log_event.cc:4508
    #6  0x00005555566d639e in Query_log_event::do_apply_event (this=<optimized out>, rgi=<optimized out>) at log_event.cc:4185
    #7  0x0000555555d738cf in Log_event::apply_event (rgi=0x61d0001ea080, this=0x61200005b9c8) at log_event.h:1343
    #8  apply_event_and_update_pos_apply (ev=ev@entry=0x61200005b9c8, thd=thd@entry=0x62a0000a2208, rgi=rgi@entry=0x61d0001ea080, reason=<optimized out>) at slave.cc:3479
    #9  0x0000555555d8596b in apply_event_and_update_pos_for_parallel (ev=ev@entry=0x61200005b9c8, thd=thd@entry=0x62a0000a2208, rgi=rgi@entry=0x61d0001ea080) at slave.cc:3623
    #10 0x00005555562aca83 in rpt_handle_event (qev=qev@entry=0x6190000fa088, rpt=rpt@entry=0x62200002bd68) at rpl_parallel.cc:50
    #11 0x00005555562bd04e in handle_rpl_parallel_thread (arg=arg@entry=0x62200002bd68) at rpl_parallel.cc:1258
    {noformat}
    
    Here {{handler::print_error}} computes whether to error log the
    current error when --log-warnings > 1. The decision flag is consulted
    bu {{my_message_sql()}} which can be eventually called.
    In the bug case the decision is to log.
    However in the optimistic mode slave applier case any conflict is
    attempted to resolve with rollback and retry to success. Hence the
    logging is at least extraneous.
    
    The case is fixed with adding a new flag {{ME_LOG_AS_WARN}} which
    {{handler::print_error}} may propagate further on through {{my_error}}
    when the error comes from an optimistically running slave worker thread.
    
    The new flag effectively requests the warning level for the errlog record,
    while the thread's DA records the actual error (which is regarded as temporary one
    by the parallel slave error handler).
    7bbe324f
rpl_parallel_optimistic.test 16.4 KB