Commit 92f18bde authored by Alexey Botchkov's avatar Alexey Botchkov

MDEV-11177 mysqlbinlog exits silently without error when another

instance connects to server.

        New thread kill status added KILL_SLAVE_SAME_ID, and the related
        error message.
parent 1ca8637a
...@@ -7448,3 +7448,5 @@ ER_GEOJSON_NOT_CLOSED ...@@ -7448,3 +7448,5 @@ ER_GEOJSON_NOT_CLOSED
eng "Incorrect GeoJSON format - polygon not closed." eng "Incorrect GeoJSON format - polygon not closed."
ER_JSON_PATH_EMPTY ER_JSON_PATH_EMPTY
eng "Path expression '$' is not allowed in argument %d to function '%s'." eng "Path expression '$' is not allowed in argument %d to function '%s'."
ER_SLAVE_SAME_ID
eng "A slave with the same server_uuid/server_id as this slave has connected to the master"
...@@ -201,6 +201,9 @@ extern "C" sig_handler handle_fatal_signal(int sig) ...@@ -201,6 +201,9 @@ extern "C" sig_handler handle_fatal_signal(int sig)
case ABORT_QUERY_HARD: case ABORT_QUERY_HARD:
kreason= "ABORT_QUERY"; kreason= "ABORT_QUERY";
break; break;
case KILL_SLAVE_SAME_ID:
kreason= "KILL_SLAVE_SAME_ID";
break;
} }
my_safe_printf_stderr("%s", "\n" my_safe_printf_stderr("%s", "\n"
"Trying to get some variables.\n" "Trying to get some variables.\n"
......
...@@ -1987,6 +1987,8 @@ int killed_errno(killed_state killed) ...@@ -1987,6 +1987,8 @@ int killed_errno(killed_state killed)
case KILL_SERVER: case KILL_SERVER:
case KILL_SERVER_HARD: case KILL_SERVER_HARD:
DBUG_RETURN(ER_SERVER_SHUTDOWN); DBUG_RETURN(ER_SERVER_SHUTDOWN);
case KILL_SLAVE_SAME_ID:
DBUG_RETURN(ER_SLAVE_SAME_ID);
} }
DBUG_RETURN(0); // Keep compiler happy DBUG_RETURN(0); // Keep compiler happy
} }
......
...@@ -477,17 +477,23 @@ enum killed_state ...@@ -477,17 +477,23 @@ enum killed_state
ABORT_QUERY_HARD= 7, ABORT_QUERY_HARD= 7,
KILL_TIMEOUT= 8, KILL_TIMEOUT= 8,
KILL_TIMEOUT_HARD= 9, KILL_TIMEOUT_HARD= 9,
/*
When binlog reading thread connects to the server it kills
all the binlog threads with the same ID.
*/
KILL_SLAVE_SAME_ID= 10,
/* /*
All of the following killed states will kill the connection All of the following killed states will kill the connection
KILL_CONNECTION must be the first of these and it must start with KILL_CONNECTION must be the first of these and it must start with
an even number (becasue of HARD bit)! an even number (becasue of HARD bit)!
*/ */
KILL_CONNECTION= 10, KILL_CONNECTION= 12,
KILL_CONNECTION_HARD= 11, KILL_CONNECTION_HARD= 13,
KILL_SYSTEM_THREAD= 12, KILL_SYSTEM_THREAD= 14,
KILL_SYSTEM_THREAD_HARD= 13, KILL_SYSTEM_THREAD_HARD= 15,
KILL_SERVER= 14, KILL_SERVER= 16,
KILL_SERVER_HARD= 15 KILL_SERVER_HARD= 17,
}; };
extern int killed_errno(killed_state killed); extern int killed_errno(killed_state killed);
......
...@@ -2910,6 +2910,13 @@ void mysql_binlog_send(THD* thd, char* log_ident, my_off_t pos, ...@@ -2910,6 +2910,13 @@ void mysql_binlog_send(THD* thd, char* log_ident, my_off_t pos,
THD_STAGE_INFO(thd, stage_waiting_to_finalize_termination); THD_STAGE_INFO(thd, stage_waiting_to_finalize_termination);
RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags)); RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags));
if (info->thd->killed == KILL_SLAVE_SAME_ID)
{
info->errmsg= "A slave with the same server_uuid/server_id as this slave "
"has connected to the master";
info->error= ER_SLAVE_SAME_ID;
}
const bool binlog_open = my_b_inited(&log); const bool binlog_open = my_b_inited(&log);
if (file >= 0) if (file >= 0)
{ {
...@@ -2921,7 +2928,8 @@ void mysql_binlog_send(THD* thd, char* log_ident, my_off_t pos, ...@@ -2921,7 +2928,8 @@ void mysql_binlog_send(THD* thd, char* log_ident, my_off_t pos,
thd->variables.max_allowed_packet= old_max_allowed_packet; thd->variables.max_allowed_packet= old_max_allowed_packet;
delete info->fdev; delete info->fdev;
if (info->error == ER_MASTER_FATAL_ERROR_READING_BINLOG && binlog_open) if ((info->error == ER_MASTER_FATAL_ERROR_READING_BINLOG ||
info->error == ER_SLAVE_SAME_ID) && binlog_open)
{ {
/* /*
detailing the fatal error message with coordinates detailing the fatal error message with coordinates
...@@ -3392,7 +3400,7 @@ void kill_zombie_dump_threads(uint32 slave_server_id) ...@@ -3392,7 +3400,7 @@ void kill_zombie_dump_threads(uint32 slave_server_id)
it will be slow because it will iterate through the list it will be slow because it will iterate through the list
again. We just to do kill the thread ourselves. again. We just to do kill the thread ourselves.
*/ */
tmp->awake(KILL_QUERY); tmp->awake(KILL_SLAVE_SAME_ID);
mysql_mutex_unlock(&tmp->LOCK_thd_data); mysql_mutex_unlock(&tmp->LOCK_thd_data);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment