Skip to content

Commit 6556570

Browse files
committed
MDEV-18983 Port rpl_semi_sync_master_wait_for_slave_count from MySQL
WIP
1 parent 6e4fb08 commit 6556570

File tree

5 files changed

+55
-13
lines changed

5 files changed

+55
-13
lines changed

mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3882,10 +3882,20 @@ NUMERIC_BLOCK_SIZE 1
38823882
ENUM_VALUE_LIST NULL
38833883
READ_ONLY NO
38843884
COMMAND_LINE_ARGUMENT REQUIRED
3885+
VARIABLE_NAME RPL_SEMI_SYNC_MASTER_WAIT_FOR_SLAVE_COUNT
3886+
VARIABLE_SCOPE GLOBAL
3887+
VARIABLE_TYPE INT UNSIGNED
3888+
VARIABLE_COMMENT The number of slaves that need to acknowledge that they have received a transaction before the transaction can complete on the master
3889+
NUMERIC_MIN_VALUE 1
3890+
NUMERIC_MAX_VALUE 65535
3891+
NUMERIC_BLOCK_SIZE 1
3892+
ENUM_VALUE_LIST NULL
3893+
READ_ONLY NO
3894+
COMMAND_LINE_ARGUMENT REQUIRED
38853895
VARIABLE_NAME RPL_SEMI_SYNC_MASTER_WAIT_NO_SLAVE
38863896
VARIABLE_SCOPE GLOBAL
38873897
VARIABLE_TYPE BOOLEAN
3888-
VARIABLE_COMMENT Wait until timeout when no semi-synchronous replication slave is available
3898+
VARIABLE_COMMENT Wait until timeout when less than `rpl_semi_sync_master_wait_for_slave_count` semi-synchronous replication slaves are available
38893899
NUMERIC_MIN_VALUE NULL
38903900
NUMERIC_MAX_VALUE NULL
38913901
NUMERIC_BLOCK_SIZE NULL

sql/privilege.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,8 @@ constexpr privilege_t PRIV_SET_SYSTEM_GLOBAL_VAR_RPL_SEMI_SYNC_MASTER_TRACE_LEVE
520520
REPL_MASTER_ADMIN_ACL;
521521
constexpr privilege_t PRIV_SET_SYSTEM_GLOBAL_VAR_RPL_SEMI_SYNC_MASTER_WAIT_POINT=
522522
REPL_MASTER_ADMIN_ACL;
523+
constexpr privilege_t PRIV_SET_SYSTEM_GLOBAL_VAR_RPL_SEMI_SYNC_MASTER_WAIT_FOR_SLAVE_COUNT=
524+
REPL_MASTER_ADMIN_ACL;
523525

524526
constexpr privilege_t PRIV_SET_SYSTEM_GLOBAL_VAR_MASTER_VERIFY_CHECKSUM=
525527
REPL_MASTER_ADMIN_ACL;

sql/semisync_master.cc

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ ulonglong rpl_semi_sync_master_net_wait_num = 0;
4949
ulong rpl_semi_sync_master_clients = 0;
5050
ulonglong rpl_semi_sync_master_net_wait_time = 0;
5151
ulonglong rpl_semi_sync_master_trx_wait_time = 0;
52+
unsigned int rpl_semi_sync_master_wait_for_slave_count = 1;
5253

5354
Repl_semi_sync_master repl_semisync_master;
5455
Ack_receiver ack_receiver;
@@ -71,7 +72,9 @@ static ulonglong timespec_to_usec(const struct timespec *ts)
7172
/** @return Should we revert to async because there not enough slaves? */
7273
static bool is_no_slave()
7374
{
74-
return !rpl_semi_sync_master_clients && !rpl_semi_sync_master_wait_no_slave;
75+
return rpl_semi_sync_master_clients <
76+
rpl_semi_sync_master_wait_for_slave_count &&
77+
!rpl_semi_sync_master_wait_no_slave;
7578
}
7679

7780
int signal_waiting_transaction(THD *waiting_thd, const char *binlog_file,
@@ -676,16 +679,23 @@ int Repl_semi_sync_master::report_reply_binlog(uint32 server_id,
676679

677680
if (need_copy_send_pos)
678681
{
679-
strmake_buf(m_reply_file_name, log_file_name);
680-
m_reply_file_pos = log_file_pos;
681-
m_reply_file_name_inited = true;
682+
DBUG_ASSERT(m_active_tranxs);
683+
Tranx_node *entry=
684+
m_active_tranxs->get_tranx_node(log_file_name, log_file_pos);
685+
DBUG_ASSERT(entry);
682686

683-
/* Remove all active transaction nodes before this point. */
684-
DBUG_ASSERT(m_active_tranxs != NULL);
685-
m_active_tranxs->clear_active_tranx_nodes(log_file_name, log_file_pos,
686-
signal_waiting_transaction);
687-
if (m_active_tranxs->is_empty())
688-
m_wait_file_name_inited= false;
687+
if (++(entry->acks) >= rpl_semi_sync_master_wait_for_slave_count)
688+
{
689+
strmake_buf(m_reply_file_name, log_file_name);
690+
m_reply_file_pos = log_file_pos;
691+
m_reply_file_name_inited = true;
692+
693+
/* Remove all active transaction nodes before this point. */
694+
m_active_tranxs->clear_active_tranx_nodes(log_file_name, log_file_pos,
695+
signal_waiting_transaction);
696+
if (m_active_tranxs->is_empty())
697+
m_wait_file_name_inited= false;
698+
}
689699

690700
DBUG_PRINT("semisync", ("%s: Got reply at (%s, %lu)",
691701
"Repl_semi_sync_master::report_reply_binlog",

sql/semisync_master.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ struct Tranx_node {
3434
THD *thd; /* The thread awaiting an ACK */
3535
struct Tranx_node *next; /* the next node in the sorted list */
3636
struct Tranx_node *hash_next; /* the next node during hash collision */
37+
unsigned int acks; ///< number of ACKs received
3738
};
3839

3940
/**
@@ -707,6 +708,7 @@ extern Ack_receiver ack_receiver;
707708
/* System and status variables for the master component */
708709
extern my_bool rpl_semi_sync_master_enabled;
709710
extern my_bool rpl_semi_sync_master_status;
711+
extern unsigned int rpl_semi_sync_master_wait_for_slave_count;
710712
extern ulong rpl_semi_sync_master_wait_point;
711713
extern ulong rpl_semi_sync_master_clients;
712714
extern ulong rpl_semi_sync_master_timeout;

sql/sys_vars.cc

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3826,6 +3826,12 @@ static bool fix_rpl_semi_sync_master_wait_point(sys_var *self, THD *thd,
38263826
return false;
38273827
}
38283828

3829+
static bool fix_rpl_semi_sync_master_wait_for_slave_count
3830+
(sys_var *self, THD *thd, enum_var_type type)
3831+
{
3832+
return false;
3833+
}
3834+
38293835
static Sys_var_on_access_global<Sys_var_mybool,
38303836
PRIV_SET_SYSTEM_GLOBAL_VAR_RPL_SEMI_SYNC_MASTER_ENABLED>
38313837
Sys_semisync_master_enabled(
@@ -3852,8 +3858,8 @@ static Sys_var_on_access_global<Sys_var_mybool,
38523858
PRIV_SET_SYSTEM_GLOBAL_VAR_RPL_SEMI_SYNC_MASTER_WAIT_NO_SLAVE>
38533859
Sys_semisync_master_wait_no_slave(
38543860
"rpl_semi_sync_master_wait_no_slave",
3855-
"Wait until timeout when no semi-synchronous replication slave is "
3856-
"available",
3861+
"Wait until timeout when less than `rpl_semi_sync_master_wait_for_"
3862+
"slave_count` semi-synchronous replication slaves are available",
38573863
GLOBAL_VAR(rpl_semi_sync_master_wait_no_slave),
38583864
CMD_LINE(OPT_ARG), DEFAULT(TRUE),
38593865
NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0));
@@ -3883,6 +3889,18 @@ Sys_semisync_master_wait_point(
38833889
NO_MUTEX_GUARD, NOT_IN_BINLOG,ON_CHECK(0),
38843890
ON_UPDATE(fix_rpl_semi_sync_master_wait_point));
38853891

3892+
static Sys_var_on_access_global<Sys_var_uint,
3893+
PRIV_SET_SYSTEM_GLOBAL_VAR_RPL_SEMI_SYNC_MASTER_WAIT_FOR_SLAVE_COUNT>
3894+
Sys_semisync_master_wait_for_slave_count(
3895+
"rpl_semi_sync_master_wait_for_slave_count",
3896+
"The number of slaves that need to acknowledge that they have received "
3897+
"a transaction before the transaction can complete on the master",
3898+
GLOBAL_VAR(rpl_semi_sync_master_wait_for_slave_count),
3899+
CMD_LINE(REQUIRED_ARG), VALID_RANGE(1, 0xFFFF),
3900+
DEFAULT(rpl_semi_sync_master_wait_for_slave_count), BLOCK_SIZE(1),
3901+
NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0),
3902+
ON_UPDATE(fix_rpl_semi_sync_master_wait_for_slave_count));
3903+
38863904
static bool fix_rpl_semi_sync_slave_trace_level(sys_var *self, THD *thd,
38873905
enum_var_type type)
38883906
{

0 commit comments

Comments
 (0)