Skip to content

Commit ff29638

Browse files
Rahul-Singhalinikep
authored andcommitted
Allocate a server extension structure for slave_stats_daemon
Summary: Without allocating the server extension structure, 8.0.20 instances were crashing. This structure maintains compression context information. Moved `mysql_extension_set_server_extn(mysql, &mi->server_extn);` to method `configure_master_connection_options` which is common to both slave stats daemon and replication io thread. Now both threads will be setting the structure properly. Reviewed By: hermanlee Differential Revision: D27486594
1 parent 52ca338 commit ff29638

File tree

4 files changed

+87
-7
lines changed

4 files changed

+87
-7
lines changed

include/mysql_com_server.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ struct compression_attributes {
5656
};
5757

5858
typedef struct NET_SERVER {
59-
before_header_callback_fn m_before_header;
60-
after_header_callback_fn m_after_header;
61-
void *m_user_data;
59+
before_header_callback_fn m_before_header{nullptr};
60+
after_header_callback_fn m_after_header{nullptr};
61+
void *m_user_data{nullptr};
6262
struct compression_attributes compression;
6363
mysql_compress_context compress_ctx;
6464
bool timeout_on_full_packet;

mysql-test/r/slave_stats_daemon.result

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,38 @@ select now() - max(timestamp) <= 1 as less_than_1_sec_old_most_recent_stats from
156156
less_than_1_sec_old_most_recent_stats
157157
1
158158
########################################################################################################
159+
### Case 3.6: Test for 8.0.20 crashes. Make sure secondary does not crash when slave_compressed_protocol = 1
160+
########################################################################################################
161+
set @@GLOBAL.write_stats_frequency=1;
162+
set @@GLOBAL.write_stats_count=10;
163+
select sleep(2);
164+
sleep(2)
165+
0
166+
select count(*) > 0 as stats_samples_collected from performance_schema.replica_statistics;
167+
stats_samples_collected
168+
1
169+
include/stop_slave.inc
170+
set @@GLOBAL.slave_compressed_protocol=1;
171+
include/start_slave.inc
172+
select sleep(2);
173+
sleep(2)
174+
0
175+
select 1;
176+
1
177+
1
178+
select sleep(2);
179+
sleep(2)
180+
0
181+
select now() - max(timestamp) <= 1 as less_than_1_sec_old_most_recent_stats from performance_schema.replica_statistics;
182+
less_than_1_sec_old_most_recent_stats
183+
1
184+
create table t(a int) engine=innodb;
185+
insert into t values(1);
186+
drop table t;
187+
include/stop_slave.inc
188+
set @@GLOBAL.slave_compressed_protocol=0;
189+
include/start_slave.inc
190+
########################################################################################################
159191
### Case 4: Promote slave to master and master to slave. Old master(new slave) should be able to send
160192
### stats to new master(old slave)
161193
########################################################################################################

mysql-test/t/slave_stats_daemon.test

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,45 @@ select sleep(2);
160160
# Master should be receiving stats every second and it's most recent stat should not be more than 1 sec old
161161
select now() - max(timestamp) <= 1 as less_than_1_sec_old_most_recent_stats from performance_schema.replica_statistics;
162162

163+
--echo ########################################################################################################
164+
--echo ### Case 3.6: Test for 8.0.20 crashes. Make sure secondary does not crash when slave_compressed_protocol = 1
165+
--echo ########################################################################################################
166+
connection slave;
167+
set @@GLOBAL.write_stats_frequency=1;
168+
169+
connection master;
170+
set @@GLOBAL.write_stats_count=10;
171+
select sleep(2);
172+
select count(*) > 0 as stats_samples_collected from performance_schema.replica_statistics;
173+
174+
connection slave;
175+
-- source include/stop_slave.inc
176+
set @@GLOBAL.slave_compressed_protocol=1;
177+
-- source include/start_slave.inc
178+
179+
## make sure secondary does not crash
180+
select sleep(2);
181+
select 1;
182+
183+
# Master should be receiving stats every second and it's most recent stat should not be more than 1 sec old
184+
connection master;
185+
select sleep(2);
186+
select now() - max(timestamp) <= 1 as less_than_1_sec_old_most_recent_stats from performance_schema.replica_statistics;
187+
188+
# Generate some traffic on primary to make sure replication I/O channel is fine
189+
create table t(a int) engine=innodb;
190+
insert into t values(1);
191+
192+
193+
# reset
194+
connection master;
195+
drop table t;
196+
--sync_slave_with_master
197+
connection slave;
198+
-- source include/stop_slave.inc
199+
set @@GLOBAL.slave_compressed_protocol=0;
200+
-- source include/start_slave.inc
201+
163202
--echo ########################################################################################################
164203
--echo ### Case 4: Promote slave to master and master to slave. Old master(new slave) should be able to send
165204
--echo ### stats to new master(old slave)

sql/slave_stats_daemon.cc

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <mysql.h>
2626
#include <mysql/psi/mysql_thread.h>
2727
#include <mysql_com.h>
28+
#include <sql_common.h>
2829
#include <sql_string.h>
2930

3031
#include "sql/log.h"
@@ -66,7 +67,8 @@ static bool connected_to_master = false;
6667
@retval false otherwise.
6768
*/
6869
static bool safe_connect_slave_stats_thread_to_master(MYSQL *&mysql,
69-
Master_info *active_mi) {
70+
Master_info *active_mi,
71+
NET_SERVER *server_extn) {
7072
if (mysql != nullptr) {
7173
mysql_close(mysql);
7274
}
@@ -85,7 +87,7 @@ static bool safe_connect_slave_stats_thread_to_master(MYSQL *&mysql,
8587
if (active_mi->get_password(pass, &password_size)) {
8688
return false;
8789
}
88-
90+
mysql_extension_set_server_extn(mysql, server_extn);
8991
if (!mysql_real_connect(mysql, active_mi->host, active_mi->get_user(), pass,
9092
0, active_mi->port, 0, 0)) {
9193
return false;
@@ -104,6 +106,13 @@ static void *handle_slave_stats_daemon(void *arg MY_ATTRIBUTE((unused))) {
104106
slave_stats_daemon_thread = my_thread_self();
105107

106108
MYSQL *mysql = nullptr;
109+
// allocate server extension structure
110+
NET_SERVER server_extn;
111+
server_extn.m_user_data = nullptr;
112+
server_extn.m_before_header = nullptr;
113+
server_extn.m_after_header = nullptr;
114+
server_extn.compress_ctx.algorithm = MYSQL_UNCOMPRESSED;
115+
107116
Master_info *active_mi;
108117
while (true) {
109118
mysql_mutex_lock(&LOCK_slave_stats_daemon);
@@ -150,8 +159,8 @@ static void *handle_slave_stats_daemon(void *arg MY_ATTRIBUTE((unused))) {
150159
// successful, try again in next cycle
151160

152161
if (!connected_to_master) {
153-
connected_to_master =
154-
safe_connect_slave_stats_thread_to_master(mysql, active_mi);
162+
connected_to_master = safe_connect_slave_stats_thread_to_master(
163+
mysql, active_mi, &server_extn);
155164
if (connected_to_master) {
156165
DBUG_PRINT("info",
157166
("Slave Stats Daemon: connected to master '%s@%s:%d'",

0 commit comments

Comments
 (0)