Skip to content

Commit

Permalink
add histogram for rpl_semi_sync_master_trx_wait
Browse files Browse the repository at this point in the history
Summary:
add histogram for rpl_semi_sync_master_trx_wait.

8.0 porting notes: Keeps the same histogram status variables as before
since these are already being read by various applications. We should
eventually remove this.

Reference Patch: facebook@d1a1394
Reference Patch: facebook@15333b2e6f9

Differential Revision: D21832889

----------------------------------------------------------------------

Fix semi_sync histogram reporting

Summary:
Fix a porting bug with semi_sync histograms.

Reviewed By: george-reynya

Differential Revision: D40964563



----------------------------------------------------------------------

Semisync histogram double free (facebook#1290)

Summary:
Avoid double free on latency histogram data

Before this fix, rpl.rpl_semi_sync_alias test under ASan with

```
=================================================================
==65389==ERROR: AddressSanitizer: heap-use-after-free on address 0x0001742e17d4 at pc 0x000107febaf0 bp 0x00016ea8f710 sp 0x00016ea8f708
READ of size 4 at 0x0001742e17d4 thread T80
    #0 0x107febaec in my_free(void*) my_malloc.cc:135
    facebook#1 0x103cb9828 in free_latency_histogram_sysvars(SHOW_VAR*) mysqld.cc:4668
    facebook#2 0x103cb99bc in prepare_latency_histogram_vars(latency_histogram*, SHOW_VAR*, unsigned long long*) mysqld.cc:4692
    facebook#3 0x17c65826c in rpl_semi_sync_master_trx_wait_histogram(THD*, SHOW_VAR*, char*) semisync_source_plugin.cc:581
    facebook#4 0x10be1b4cc in PFS_status_variable_cache::manifest(THD*, SHOW_VAR const*, System_status_var*, char const*, bool, bool) pfs_variable.cc:1366
    facebook#5 0x10be1ba90 in PFS_status_variable_cache::do_materialize_all(THD*) pfs_variable.cc:1172
    facebook#6 0x10c0ab33c in PFS_variable_cache<Status_variable>::materialize_all(THD*) pfs_variable.h:536
    facebook#7 0x10c0ab294 in table_session_status::rnd_init(bool) table_session_status.cc:111
    facebook#8 0x10bceb790 in ha_perfschema::rnd_init(bool) ha_perfschema.cc:1686
    facebook#9 0x1033c7cec in handler::ha_rnd_init(bool) handler.cc:3157
    facebook#10 0x103975380 in TableScanIterator::Init() basic_row_iterators.cc:230
    facebook#11 0x103a33a18 in FilterIterator::Init() composite_iterators.h:82
    facebook#12 0x103982ec0 in MaterializeIterator::MaterializeQueryBlock(MaterializeIterator::QueryBlock const&, unsigned long long*) composite_iterators.cc:845
    facebook#13 0x103981410 in MaterializeIterator::Init() composite_iterators.cc:660
    facebook#14 0x1049fc518 in Query_expression::ExecuteIteratorQuery(THD*) sql_union.cc:1293
    facebook#15 0x1049fd358 in Query_expression::execute(THD*) sql_union.cc:1355
    facebook#16 0x1047ae7ac in Sql_cmd_dml::execute_inner(THD*) sql_select.cc:870
    facebook#17 0x1047ac344 in Sql_cmd_dml::execute(THD*) sql_select.cc:618
    facebook#18 0x1047ffcc8 in Sql_cmd_show::execute(THD*) sql_show.cc:232
    facebook#19 0x10480ab58 in Sql_cmd_show_status::execute(THD*) sql_show.cc:894
    facebook#20 0x1045cea6c in mysql_execute_command(THD*, bool, unsigned long long*) sql_parse.cc:5323
    facebook#21 0x1045c5dcc in dispatch_sql_command(THD*, Parser_state*, unsigned long long*) sql_parse.cc:6093
    facebook#22 0x1045bb92c in dispatch_command(THD*, COM_DATA const*, enum_server_command) sql_parse.cc:2444
    facebook#23 0x1045c06f8 in do_command(THD*) sql_parse.cc:1636
    facebook#24 0x104cc4cc4 in handle_connection(void*) connection_handler_per_thread.cc:307
    facebook#25 0x10bd130d4 in pfs_spawn_thread(void*) pfs.cc:2983
    facebook#26 0x18ad47fa4 in _pthread_start+0x90 (libsystem_pthread.dylib:arm64e+0x6fa4)
    facebook#27 0x18ad42d9c in thread_start+0x4 (libsystem_pthread.dylib:arm64e+0x1d9c)

0x0001742e17d4 is located 4 bytes inside of 40-byte region [0x0001742e17d0,0x0001742e17f8)
freed by thread T80 here:
    #0 0x139ff6de4 in wrap_free+0x98 (libclang_rt.asan_osx_dynamic.dylib:arm64e+0x3ede4)
    facebook#1 0x107febcfc in my_raw_free(void*) my_malloc.cc:269
    facebook#2 0x107feba48 in my_free(void*) my_malloc.cc:141
    facebook#3 0x103cb9828 in free_latency_histogram_sysvars(SHOW_VAR*) mysqld.cc:4668
    facebook#4 0x17c6231e8 in ReplSemiSyncMaster::~ReplSemiSyncMaster() semisync_source.cc:517
    facebook#5 0x17c623488 in ReplSemiSyncMaster::~ReplSemiSyncMaster() semisync_source.cc:516
    facebook#6 0x17c651484 in semi_sync_master_plugin_deinit(void*) semisync_source_plugin.cc:833
    facebook#7 0x10467aa90 in plugin_deinitialize(st_plugin_int*, bool) sql_plugin.cc:1123
    facebook#8 0x1046730b0 in reap_plugins() sql_plugin.cc:1192
    facebook#9 0x1046863b4 in mysql_uninstall_plugin(THD*, MYSQL_LEX_CSTRING) sql_plugin.cc:2602
    facebook#10 0x104685374 in Sql_cmd_uninstall_plugin::execute(THD*) sql_plugin.cc:3731
    facebook#11 0x1045cea6c in mysql_execute_command(THD*, bool, unsigned long long*) sql_parse.cc:5323
    facebook#12 0x1045c5dcc in dispatch_sql_command(THD*, Parser_state*, unsigned long long*) sql_parse.cc:6093
    facebook#13 0x1045bb92c in dispatch_command(THD*, COM_DATA const*, enum_server_command) sql_parse.cc:2444
    facebook#14 0x1045c06f8 in do_command(THD*) sql_parse.cc:1636
    facebook#15 0x104cc4cc4 in handle_connection(void*) connection_handler_per_thread.cc:307
    facebook#16 0x10bd130d4 in pfs_spawn_thread(void*) pfs.cc:2983
    facebook#17 0x18ad47fa4 in _pthread_start+0x90 (libsystem_pthread.dylib:arm64e+0x6fa4)
    facebook#18 0x18ad42d9c in thread_start+0x4 (libsystem_pthread.dylib:arm64e+0x1d9c)
```

It seems that the double invocation of `free_latency_histogram_sysvars` is
correct in this case, thus protect against the double free with resetting the
pointers to nullptr.

Pull Request resolved: facebook#1290

Reviewed By: sunshine-Chun

Differential Revision: D45277600

Pulled By: hermanlee
  • Loading branch information
santoshbanda authored and Herman Lee committed Oct 18, 2023
1 parent 3aab047 commit 2e6bfe5
Show file tree
Hide file tree
Showing 14 changed files with 669 additions and 0 deletions.
Expand Up @@ -177,6 +177,7 @@ SET PERSIST_ONLY rpl_receive_buffer_size = @@GLOBAL.rpl_receive_buffer_size;
SET PERSIST_ONLY rpl_semi_sync_replica_enabled = @@GLOBAL.rpl_semi_sync_replica_enabled;
SET PERSIST_ONLY rpl_semi_sync_replica_trace_level = @@GLOBAL.rpl_semi_sync_replica_trace_level;
SET PERSIST_ONLY rpl_semi_sync_source_enabled = @@GLOBAL.rpl_semi_sync_source_enabled;
SET PERSIST_ONLY rpl_semi_sync_source_histogram_trx_wait_step_size = @@GLOBAL.rpl_semi_sync_source_histogram_trx_wait_step_size;
SET PERSIST_ONLY rpl_semi_sync_source_timeout = @@GLOBAL.rpl_semi_sync_source_timeout;
SET PERSIST_ONLY rpl_semi_sync_source_trace_level = @@GLOBAL.rpl_semi_sync_source_trace_level;
SET PERSIST_ONLY rpl_semi_sync_source_wait_for_replica_count = @@GLOBAL.rpl_semi_sync_source_wait_for_replica_count;
Expand Down Expand Up @@ -394,6 +395,7 @@ RESET PERSIST rpl_receive_buffer_size;
RESET PERSIST rpl_semi_sync_replica_enabled;
RESET PERSIST rpl_semi_sync_replica_trace_level;
RESET PERSIST rpl_semi_sync_source_enabled;
RESET PERSIST rpl_semi_sync_source_histogram_trx_wait_step_size;
RESET PERSIST rpl_semi_sync_source_timeout;
RESET PERSIST rpl_semi_sync_source_trace_level;
RESET PERSIST rpl_semi_sync_source_wait_for_replica_count;
Expand Down
Expand Up @@ -160,6 +160,7 @@ SET PERSIST rpl_receive_buffer_size = @@GLOBAL.rpl_receive_buffer_size;
SET PERSIST rpl_semi_sync_replica_enabled = @@GLOBAL.rpl_semi_sync_replica_enabled;
SET PERSIST rpl_semi_sync_replica_trace_level = @@GLOBAL.rpl_semi_sync_replica_trace_level;
SET PERSIST rpl_semi_sync_source_enabled = @@GLOBAL.rpl_semi_sync_source_enabled;
SET PERSIST rpl_semi_sync_source_histogram_trx_wait_step_size = @@GLOBAL.rpl_semi_sync_source_histogram_trx_wait_step_size;
SET PERSIST rpl_semi_sync_source_timeout = @@GLOBAL.rpl_semi_sync_source_timeout;
SET PERSIST rpl_semi_sync_source_trace_level = @@GLOBAL.rpl_semi_sync_source_trace_level;
SET PERSIST rpl_semi_sync_source_wait_for_replica_count = @@GLOBAL.rpl_semi_sync_source_wait_for_replica_count;
Expand Down Expand Up @@ -411,6 +412,7 @@ RESET PERSIST IF EXISTS rpl_receive_buffer_size;
RESET PERSIST IF EXISTS rpl_semi_sync_replica_enabled;
RESET PERSIST IF EXISTS rpl_semi_sync_replica_trace_level;
RESET PERSIST IF EXISTS rpl_semi_sync_source_enabled;
RESET PERSIST IF EXISTS rpl_semi_sync_source_histogram_trx_wait_step_size;
RESET PERSIST IF EXISTS rpl_semi_sync_source_timeout;
RESET PERSIST IF EXISTS rpl_semi_sync_source_trace_level;
RESET PERSIST IF EXISTS rpl_semi_sync_source_wait_for_replica_count;
Expand Down
12 changes: 12 additions & 0 deletions mysql-test/suite/rpl_nogtid/r/rpl_semi_sync.result
Expand Up @@ -36,6 +36,18 @@ Rpl_semi_sync_source_status ON
show status like 'Rpl_semi_sync_source_yes_tx';
Variable_name Value
Rpl_semi_sync_source_yes_tx 0
show status like 'Rpl_semi_sync_master_trx_wait_histogram%';
Variable_name Value
Rpl_semi_sync_master_trx_wait_histogram_0-500us 0
Rpl_semi_sync_master_trx_wait_histogram_500-1500us 0
Rpl_semi_sync_master_trx_wait_histogram_1500-3500us 0
Rpl_semi_sync_master_trx_wait_histogram_3500-7500us 0
Rpl_semi_sync_master_trx_wait_histogram_7500-15500us 0
Rpl_semi_sync_master_trx_wait_histogram_15500-31500us 0
Rpl_semi_sync_master_trx_wait_histogram_31500-63500us 0
Rpl_semi_sync_master_trx_wait_histogram_63500-127500us 0
Rpl_semi_sync_master_trx_wait_histogram_127500-255500us 0
Rpl_semi_sync_master_trx_wait_histogram_255500-MAXus 0
#
# BUG#45672 Semisync repl: ActiveTranx:insert_tranx_node: transaction node allocation failed
# BUG#45673 Semisync reports correct operation even if no slave is connected
Expand Down
Expand Up @@ -36,6 +36,18 @@ Rpl_semi_sync_source_status ON
show status like 'Rpl_semi_sync_source_yes_tx';
Variable_name Value
Rpl_semi_sync_source_yes_tx 0
show status like 'Rpl_semi_sync_master_trx_wait_histogram%';
Variable_name Value
Rpl_semi_sync_master_trx_wait_histogram_0-500us 0
Rpl_semi_sync_master_trx_wait_histogram_500-1500us 0
Rpl_semi_sync_master_trx_wait_histogram_1500-3500us 0
Rpl_semi_sync_master_trx_wait_histogram_3500-7500us 0
Rpl_semi_sync_master_trx_wait_histogram_7500-15500us 0
Rpl_semi_sync_master_trx_wait_histogram_15500-31500us 0
Rpl_semi_sync_master_trx_wait_histogram_31500-63500us 0
Rpl_semi_sync_master_trx_wait_histogram_63500-127500us 0
Rpl_semi_sync_master_trx_wait_histogram_127500-255500us 0
Rpl_semi_sync_master_trx_wait_histogram_255500-MAXus 0
#
# BUG#45672 Semisync repl: ActiveTranx:insert_tranx_node: transaction node allocation failed
# BUG#45673 Semisync reports correct operation even if no slave is connected
Expand Down
Expand Up @@ -36,6 +36,18 @@ Rpl_semi_sync_source_status ON
show status like 'Rpl_semi_sync_source_yes_tx';
Variable_name Value
Rpl_semi_sync_source_yes_tx 0
show status like 'Rpl_semi_sync_master_trx_wait_histogram%';
Variable_name Value
Rpl_semi_sync_master_trx_wait_histogram_0-500us 0
Rpl_semi_sync_master_trx_wait_histogram_500-1500us 0
Rpl_semi_sync_master_trx_wait_histogram_1500-3500us 0
Rpl_semi_sync_master_trx_wait_histogram_3500-7500us 0
Rpl_semi_sync_master_trx_wait_histogram_7500-15500us 0
Rpl_semi_sync_master_trx_wait_histogram_15500-31500us 0
Rpl_semi_sync_master_trx_wait_histogram_31500-63500us 0
Rpl_semi_sync_master_trx_wait_histogram_63500-127500us 0
Rpl_semi_sync_master_trx_wait_histogram_127500-255500us 0
Rpl_semi_sync_master_trx_wait_histogram_255500-MAXus 0
#
# BUG#45672 Semisync repl: ActiveTranx:insert_tranx_node: transaction node allocation failed
# BUG#45673 Semisync reports correct operation even if no slave is connected
Expand Down
1 change: 1 addition & 0 deletions mysql-test/suite/rpl_nogtid/t/rpl_semi_sync.test
Expand Up @@ -90,6 +90,7 @@ echo [ status of semi-sync on master should be ON even without any semi-sync sla
show status like 'Rpl_semi_sync_source_clients';
show status like 'Rpl_semi_sync_source_status';
show status like 'Rpl_semi_sync_source_yes_tx';
show status like 'Rpl_semi_sync_master_trx_wait_histogram%';

--echo #
--echo # BUG#45672 Semisync repl: ActiveTranx:insert_tranx_node: transaction node allocation failed
Expand Down
@@ -0,0 +1,75 @@
SELECT COUNT(@@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size);
COUNT(@@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size)
1
1 Expected
SET @start_global_value = @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size;
SELECT @start_global_value;
@start_global_value
500us
16ms Expected
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='16us';
select @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size;
@@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size
16us
16us Expected
select * from performance_schema.global_variables where variable_name='rpl_semi_sync_master_histogram_trx_wait_step_size';
VARIABLE_NAME VARIABLE_VALUE
rpl_semi_sync_master_histogram_trx_wait_step_size 16us
SELECT @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size = VARIABLE_VALUE
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='rpl_semi_sync_master_histogram_trx_wait_step_size';
@@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size = VARIABLE_VALUE
1
1 Expected
SELECT COUNT(@@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size);
COUNT(@@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size)
1
1 Expected
SELECT COUNT(VARIABLE_VALUE)
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='rpl_semi_sync_master_histogram_trx_wait_step_size';
COUNT(VARIABLE_VALUE)
1
1 Expected
SELECT COUNT(@@local.rpl_semi_sync_master_histogram_trx_wait_step_size);
ERROR HY000: Variable 'rpl_semi_sync_master_histogram_trx_wait_step_size' is a GLOBAL variable
Expected error 'Variable is a GLOBAL variable'
SELECT COUNT(@@SESSION.rpl_semi_sync_master_histogram_trx_wait_step_size);
ERROR HY000: Variable 'rpl_semi_sync_master_histogram_trx_wait_step_size' is a GLOBAL variable
Expected error 'Variable is a GLOBAL variable'
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='32';
ERROR 42000: Variable 'rpl_semi_sync_master_histogram_trx_wait_step_size' can't be set to the value of '32'
Expected error 'Variable cannot be set to this value';
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='0';
select @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size;
@@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size
0
0 Expected
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='ms32';
ERROR 42000: Variable 'rpl_semi_sync_master_histogram_trx_wait_step_size' can't be set to the value of 'ms32'
Expected error 'Variable cannot be set to this value';
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='32ps';
ERROR 42000: Variable 'rpl_semi_sync_master_histogram_trx_wait_step_size' can't be set to the value of '32ps'
Expected error 'Variable cannot be set to this value';
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='3s2';
ERROR 42000: Variable 'rpl_semi_sync_master_histogram_trx_wait_step_size' can't be set to the value of '3s2'
Expected error 'Variable cannot be set to this value';
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='32@s';
ERROR 42000: Variable 'rpl_semi_sync_master_histogram_trx_wait_step_size' can't be set to the value of '32@s'
Expected error 'Variable cannot be set to this value';
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='32s.';
ERROR 42000: Variable 'rpl_semi_sync_master_histogram_trx_wait_step_size' can't be set to the value of '32s.'
Expected error 'Variable cannot be set to this value';
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='s';
ERROR 42000: Variable 'rpl_semi_sync_master_histogram_trx_wait_step_size' can't be set to the value of 's'
Expected error 'Variable cannot be set to this value'
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='16.5us';
select @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size;
@@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size
16.5us
16.5us Expected
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size = @start_global_value;
SELECT @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size;
@@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size
500us
16ms Expected
@@ -0,0 +1 @@
$SEMISYNC_MASTER_PLUGIN_OPT $SEMISYNC_MASTER_PLUGIN_LOAD
@@ -0,0 +1,73 @@
SELECT COUNT(@@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size);
--echo 1 Expected

SET @start_global_value = @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size;
SELECT @start_global_value;
--echo 16ms Expected

SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='16us';
select @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size;
--echo 16us Expected

select * from performance_schema.global_variables where variable_name='rpl_semi_sync_master_histogram_trx_wait_step_size';

SELECT @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size = VARIABLE_VALUE
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='rpl_semi_sync_master_histogram_trx_wait_step_size';
--echo 1 Expected

SELECT COUNT(@@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size);
--echo 1 Expected

SELECT COUNT(VARIABLE_VALUE)
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='rpl_semi_sync_master_histogram_trx_wait_step_size';
--echo 1 Expected

--Error ER_INCORRECT_GLOBAL_LOCAL_VAR
SELECT COUNT(@@local.rpl_semi_sync_master_histogram_trx_wait_step_size);
--echo Expected error 'Variable is a GLOBAL variable'

--Error ER_INCORRECT_GLOBAL_LOCAL_VAR
SELECT COUNT(@@SESSION.rpl_semi_sync_master_histogram_trx_wait_step_size);
--echo Expected error 'Variable is a GLOBAL variable'

--Error ER_WRONG_VALUE_FOR_VAR
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='32';
--echo Expected error 'Variable cannot be set to this value';

SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='0';
select @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size;
--echo 0 Expected

--Error ER_WRONG_VALUE_FOR_VAR
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='ms32';
--echo Expected error 'Variable cannot be set to this value';

--Error ER_WRONG_VALUE_FOR_VAR
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='32ps';
--echo Expected error 'Variable cannot be set to this value';

--Error ER_WRONG_VALUE_FOR_VAR
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='3s2';
--echo Expected error 'Variable cannot be set to this value';

--Error ER_WRONG_VALUE_FOR_VAR
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='32@s';
--echo Expected error 'Variable cannot be set to this value';

--Error ER_WRONG_VALUE_FOR_VAR
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='32s.';
--echo Expected error 'Variable cannot be set to this value';

--Error ER_WRONG_VALUE_FOR_VAR
SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='s';
--echo Expected error 'Variable cannot be set to this value'

SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size='16.5us';
select @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size;
--echo 16.5us Expected

SET @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size = @start_global_value;
SELECT @@GLOBAL.rpl_semi_sync_master_histogram_trx_wait_step_size;
--echo 16ms Expected
22 changes: 22 additions & 0 deletions plugin/semisync/semisync_source.cc
Expand Up @@ -66,6 +66,10 @@ unsigned long long rpl_semi_sync_source_net_wait_time = 0;
unsigned long long rpl_semi_sync_source_trx_wait_time = 0;
bool rpl_semi_sync_source_wait_no_replica = true;
unsigned int rpl_semi_sync_source_wait_for_replica_count = 1;
char *histogram_trx_wait_step_size = 0;
latency_histogram histogram_trx_wait;
SHOW_VAR latency_histogram_trx_wait[NUMBER_OF_HISTOGRAM_BINS + 1];
ulonglong histogram_trx_wait_values[NUMBER_OF_HISTOGRAM_BINS];

static int getWaitTime(const struct timespec &start_ts);

Expand Down Expand Up @@ -439,6 +443,7 @@ int ReplSemiSyncMaster::initObject() {
else
result = disableMaster();

latency_histogram_init(&histogram_trx_wait, histogram_trx_wait_step_size);
return result;
}

Expand Down Expand Up @@ -509,6 +514,7 @@ int ReplSemiSyncMaster::disableMaster() {
}

ReplSemiSyncMaster::~ReplSemiSyncMaster() {
free_latency_histogram_sysvars(latency_histogram_trx_wait);
if (init_done_) {
mysql_mutex_destroy(&LOCK_binlog_);
}
Expand Down Expand Up @@ -847,6 +853,10 @@ int ReplSemiSyncMaster::commitTrx(const char *trx_wait_binlog_name,
} else {
rpl_semi_sync_source_trx_wait_num++;
rpl_semi_sync_source_trx_wait_time += wait_time;
if (histogram_trx_wait_step_size)
latency_histogram_increment(
&histogram_trx_wait,
microseconds_to_my_timer((double)wait_time), 1);
}
}
}
Expand Down Expand Up @@ -1211,6 +1221,11 @@ void ReplSemiSyncMaster::setExportStats() {
((double)rpl_semi_sync_source_net_wait_num))
: 0);

for (size_t i_bins = 0; i_bins < NUMBER_OF_HISTOGRAM_BINS; ++i_bins) {
histogram_trx_wait_values[i_bins] =
latency_histogram_get_count(&histogram_trx_wait, i_bins);
}

unlock();
}

Expand Down Expand Up @@ -1336,3 +1351,10 @@ static int getWaitTime(const struct timespec &start_ts) {

return (int)(end_usecs - start_usecs);
}

void ReplSemiSyncMaster::update_histogram_trx_wait_step_size(
const char *step_size) {
lock();
latency_histogram_init(&histogram_trx_wait, step_size);
unlock();
}
15 changes: 15 additions & 0 deletions plugin/semisync/semisync_source.h
Expand Up @@ -32,6 +32,7 @@
#include "my_io.h"
#include "my_psi_config.h"
#include "plugin/semisync/semisync.h"
#include "sql/mysqld.h"

extern PSI_memory_key key_ss_memory_TranxNodeAllocator_block;

Expand Down Expand Up @@ -833,6 +834,14 @@ class ReplSemiSyncMaster : public ReplSemiSyncBase {
}
unlock();
}

/* Reinitializes the latency histogram when trx_wait_step_size
* is updated.
*
* Input:
* step_size - (IN) updated step_size
*/
void update_histogram_trx_wait_step_size(const char *step_size);
};

/* System and status variables for the master component */
Expand All @@ -856,6 +865,12 @@ extern unsigned long long rpl_semi_sync_source_trx_wait_num;
extern unsigned long long rpl_semi_sync_source_net_wait_time;
extern unsigned long long rpl_semi_sync_source_trx_wait_time;

extern char *histogram_trx_wait_step_size;
extern latency_histogram histogram_trx_wait;
/* status variables for trx_wait_time histogram */
extern SHOW_VAR latency_histogram_trx_wait[NUMBER_OF_HISTOGRAM_BINS + 1];
extern ulonglong histogram_trx_wait_values[NUMBER_OF_HISTOGRAM_BINS];

/*
This indicates whether we should keep waiting if no semi-sync slave
is available.
Expand Down

0 comments on commit 2e6bfe5

Please sign in to comment.