Commit e06d0c79 authored by aelkin/andrei@mysql1000.(none)'s avatar aelkin/andrei@mysql1000.(none)
Browse files

Merge mysql1000.(none):/mnt/nb/home/elkin/MySQL/TEAM/FIXES/5.1/bug32971-error_propag_slave

into  mysql1000.(none):/home/andrei/MySQL/FIXES/5.1/bug32971-rbr_error_prop
parents 7a82a059 c9461608
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -411,7 +411,9 @@ enum ha_base_keytype {
                                            statement */
#define HA_ERR_CORRUPT_EVENT      171    /* The event was corrupt, leading to
                                            illegal data being read */
#define HA_ERR_LAST              171     /*Copy last error nr.*/
#define HA_ERR_ROWS_EVENT_APPLY   172    /* The event could not be processed
                                            no other hanlder error happened */
#define HA_ERR_LAST              172     /*Copy last error nr.*/
/* Add error numbers before HA_ERR_LAST and change it accordingly. */
#define HA_ERR_ERRORS            (HA_ERR_LAST - HA_ERR_FIRST + 1)

+3 −3
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ ALTER TABLE t1_bit
ALTER TABLE t1_char ADD x CHAR(20) DEFAULT 'Just a test';
# ... and add one non-nullable INT column last in table 't1_text'
#     with no default,
ALTER TABLE t1_nodef ADD x INT NOT NULL;
ALTER TABLE t1_nodef ADD x INT NOT NULL, ADD y INT NOT NULL, ADD z INT NOT NULL;
# ... and remove the last column in t2
ALTER TABLE t2 DROP b;
# ... change the type of the single column in table 't4'
@@ -222,8 +222,8 @@ sync_slave_with_master;

--echo **** On Slave ****
connection slave;
INSERT INTO t1_nodef VALUES (1,2,3);
INSERT INTO t1_nodef VALUES (2,4,6);
INSERT INTO t1_nodef VALUES (1,2,3,4,5);
INSERT INTO t1_nodef VALUES (2,4,6,8,10);

--echo **** On Master ****
connection master;
+40 −12
Original line number Diff line number Diff line
@@ -99,12 +99,23 @@ static const char *HA_ERR(int i)
  case HA_ERR_RECORD_IS_THE_SAME: return "HA_ERR_RECORD_IS_THE_SAME";
  case HA_ERR_LOGGING_IMPOSSIBLE: return "HA_ERR_LOGGING_IMPOSSIBLE";
  case HA_ERR_CORRUPT_EVENT: return "HA_ERR_CORRUPT_EVENT";
  case HA_ERR_ROWS_EVENT_APPLY : return "HA_ERR_ROWS_EVENT_APPLY";
  }
  return 0;
}

/**
   macro to call from different branches of Rows_log_event::do_apply_event
   Error reporting facility for Rows_log_event::do_apply_event

   @param level     error, warning or info
   @param ha_error  HA_ERR_ code
   @param rli       pointer to the active Relay_log_info instance
   @param thd       pointer to the slave thread's thd
   @param table     pointer to the event's table object
   @param type      the type of the event
   @param log_name  the master binlog file name
   @param pos       the master binlog file pos (the next after the event)

*/
static void inline slave_rows_error_report(enum loglevel level, int ha_error,
                                           Relay_log_info const *rli, THD *thd,
@@ -112,14 +123,27 @@ static void inline slave_rows_error_report(enum loglevel level, int ha_error,
                                           const char *log_name, ulong pos)
{
  const char *handler_error= HA_ERR(ha_error);
  char buff[MAX_SLAVE_ERRMSG], *slider;
  const char *buff_end= buff + sizeof(buff);
  uint len;
  List_iterator_fast<MYSQL_ERROR> it(thd->warn_list);
  MYSQL_ERROR *err;
  buff[0]= 0;

  for (err= it++, slider= buff; err && slider < buff_end - 1;
       slider += len, err= it++)
  {
    len= my_snprintf(slider, buff_end - slider,
                     " %s, Error_code: %d;", err->msg, err->code);
  }
  
  rli->report(level, thd->net.last_errno,
              "Could not execute %s event on table %s.%s;"
              "%s%s handler error %s; "
              "%s handler error %s; "
              "the event's master log %s, end_log_pos %lu",
              type, table->s->db.str,
              table->s->table_name.str,
              thd->net.last_error[0] != 0 ? thd->net.last_error : "",
              thd->net.last_error[0] != 0 ? ";" : "",
              buff,
              handler_error == NULL? "<unknown>" : handler_error,
              log_name, pos);
}
@@ -7675,7 +7699,7 @@ Rows_log_event::write_row(const Relay_log_info *const rli,

  /* fill table->record[0] with default values */

  if ((error= prepare_record(rli, table, m_width,
  if ((error= prepare_record(table, m_width,
                             TRUE /* check if columns have def. values */)))
    DBUG_RETURN(error);
  
@@ -7990,12 +8014,16 @@ int Rows_log_event::find_row(const Relay_log_info *rli)
  DBUG_ASSERT(m_table && m_table->in_use != NULL);

  TABLE *table= m_table;
  int error;
  int error= 0;

  /* unpack row - missing fields get default values */
  /*
    rpl_row_tabledefs.test specifies that
    if the extra field on the slave does not have a default value
    and this is okay with Delete or Update events.
    Todo: fix wl3228 hld that requires defauls for all types of events
  */
  
  // TODO: shall we check and report errors here?
  prepare_record(NULL,table,m_width,FALSE /* don't check errors */); 
  prepare_record(table, m_width, FALSE);
  error= unpack_current_row(rli);

#ifndef DBUG_OFF
+2 −0
Original line number Diff line number Diff line
@@ -3131,6 +3131,8 @@ class Rows_log_event : public Log_event
    ASSERT_OR_RETURN_ERROR(m_curr_row < m_rows_end, HA_ERR_CORRUPT_EVENT);
    int const result= ::unpack_row(rli, m_table, m_width, m_curr_row, &m_cols,
                                   &m_curr_row_end, &m_master_reclength);
    if (m_curr_row_end > m_rows_end)
      my_error(ER_SLAVE_CORRUPT_EVENT, MYF(0));
    ASSERT_OR_RETURN_ERROR(m_curr_row_end <= m_rows_end, HA_ERR_CORRUPT_EVENT);
    return result;
  }
+2 −2
Original line number Diff line number Diff line
@@ -2077,7 +2077,7 @@ Old_rows_log_event::write_row(const Relay_log_info *const rli,

  /* fill table->record[0] with default values */

  if ((error= prepare_record(rli, table, m_width,
  if ((error= prepare_record(table, m_width,
                             TRUE /* check if columns have def. values */)))
    DBUG_RETURN(error);
  
@@ -2288,7 +2288,7 @@ int Old_rows_log_event::find_row(const Relay_log_info *rli)
  /* unpack row - missing fields get default values */

  // TODO: shall we check and report errors here?
  prepare_record(NULL,table,m_width,FALSE /* don't check errors */); 
  prepare_record(table, m_width, FALSE /* don't check errors */); 
  error= unpack_current_row(rli); 

#ifndef DBUG_OFF
Loading