24 #ifndef SEMISYNC_MASTER_H 25 #define SEMISYNC_MASTER_H 27 #include <sys/types.h> 37 #ifdef HAVE_PSI_INTERFACE 90 #define BLOCK_TRANX_NODES 16 110 Block *block = first_block;
111 while (block !=
nullptr) {
128 Block *block = current_block;
131 current_block = current_block->
next;
135 if (current_block ==
nullptr && allocate_block()) {
136 current_block = block;
141 trx_node = &(current_block->nodes[++last_node]);
144 trx_node->
next_ =
nullptr;
156 current_block = first_block;
172 Block *prev_block =
nullptr;
175 while (block != current_block->
next) {
177 if (&(block->
nodes[0]) <= node &&
180 if (first_block != block) {
181 last_block->
next = first_block;
183 last_block = prev_block;
184 last_block->
next =
nullptr;
248 block->
next =
nullptr;
250 if (first_block ==
nullptr)
253 last_block->
next = block;
258 current_block = block;
289 if (current_block ==
nullptr || current_block->
next ==
nullptr)
return;
293 while (block_num > reserved_blocks && block !=
nullptr) {
299 if (block ==
nullptr) last_block = current_block->
next;
322 inline void assert_lock_owner();
325 unsigned int get_hash_value(
const char *log_file_name,
my_off_t log_file_pos);
343 int signal_waiting_sessions_all();
344 int signal_waiting_sessions_up_to(
const char *log_file_name,
346 TranxNode *find_active_tranx_node(
const char *log_file_name,
356 int insert_tranx_node(
const char *log_file_name,
my_off_t log_file_pos);
366 int clear_active_tranx_nodes(
const char *log_file_name,
372 bool is_tranx_end_pos(
const char *log_file_name,
my_off_t log_file_pos);
378 const char *log_file_name2,
my_off_t log_file_pos2);
386 bool is_empty() {
return (trx_front_ ==
nullptr); }
398 unsigned long long binlog_pos = 0;
402 void clear() { binlog_name[0] =
'\0'; }
403 bool empty()
const {
return binlog_name[0] ==
'\0'; }
417 update(log_file_name, log_file_pos);
420 strcpy(binlog_name, log_file_name);
421 binlog_pos = log_file_pos;
434 if (m_ack_array)
my_free(m_ack_array);
440 for (
unsigned i = 0; i < m_size; ++i) {
441 m_ack_array[i].clear();
442 m_ack_array[i].server_id = 0;
443 m_ack_array[i].binlog_pos = 0;
445 m_empty_slot = m_size;
447 m_greatest_ack.clear();
459 int resize(
unsigned int size,
const AckInfo **ackinfo);
492 bool full() {
return m_empty_slot == m_size; }
493 unsigned int size() {
return m_size; }
502 unsigned int i = m_size;
503 for (i = 0; i < m_size; i++) {
504 if (m_ack_array[i].equal_to(log_file_name, log_file_pos)) {
505 m_ack_array[i].
clear();
526 m_empty_slot = m_size;
527 for (i = 0; i < m_size; i++) {
528 if (m_ack_array[i].empty())
530 else if (m_ack_array[i].is_server(server_id)) {
531 m_ack_array[i].
update(log_file_name, log_file_pos);
532 if (trace_level_ & kTraceDetail)
554 for (i = 0; i < m_size; i++) {
555 if (m_ack_array[i].less_than(log_file_name, log_file_pos))
556 ackinfo = m_ack_array + i;
573 bool init_done_ =
false;
583 bool reply_file_name_inited_ =
false;
592 bool wait_file_name_inited_ =
false;
612 bool commit_file_name_inited_ =
false;
621 volatile bool master_enabled_ =
623 unsigned long wait_timeout_ = 0;
640 void force_switch_on();
643 int try_switch_on(
const char *log_file_name,
my_off_t log_file_pos);
651 trace_level_ = trace_level;
653 if (active_tranxs_) active_tranxs_->
trace_level_ = trace_level;
657 void set_wait_no_slave(
const void *val);
661 wait_timeout_ = wait_timeout;
682 bool is_semi_sync_slave();
697 void reportReplyBinlog(
const char *log_file_name,
my_off_t end_offset);
714 int commitTrx(
const char *trx_wait_binlog_name,
my_off_t trx_wait_binlog_pos);
727 int reserveSyncHeader(
unsigned char *header,
unsigned long size);
742 int updateSyncHeader(
unsigned char *packet,
const char *log_file_name,
757 int writeTranxInBinlog(
const char *log_file_name,
my_off_t log_file_pos);
769 int readSlaveReply(
NET *
net,
const char *event_buf);
784 int skipSlaveReply(
const char *event_buf,
uint32 server_id,
785 const char *log_file_name,
my_off_t log_file_pos);
788 void setExportStats();
804 int setWaitSlaveCount(
unsigned int new_value);
817 void handleAck(
int server_id,
const char *log_file_name,
821 reportReplyBinlog(log_file_name, log_file_pos);
823 const AckInfo *ackinfo =
nullptr;
825 ackinfo = ack_container_.
insert(server_id, log_file_name, log_file_pos);
826 if (ackinfo !=
nullptr)
TranxNode nodes[BLOCK_TRANX_NODES]
Definition: semisync_master.h:211
unsigned long trace_level_
Definition: semisync.h:49
Definition: semisync_master.h:48
unsigned long rpl_semi_sync_master_timeout
Definition: semisync_master.cc:45
void clear(Shards< COUNT > &shards) noexcept
Clear the counter - reset to 0.
Definition: ut0counter.h:343
unsigned char uchar
Definition: my_inttypes.h:51
struct TranxNode * hash_next_
Definition: semisync_master.h:54
void clear()
Clear the content of the ack array.
Definition: semisync_master.h:438
This class manages memory for active transaction list.
Definition: semisync_master.h:311
unsigned long rpl_semi_sync_master_wait_pos_backtraverse
Definition: semisync_master.cc:54
int compare(const char *log_file_name1, my_off_t log_file_pos1, const TranxNode *node2)
Definition: semisync_master.h:327
int free_all_nodes()
All nodes are freed.
Definition: semisync_master.h:155
bool getMasterEnabled()
Definition: semisync_master.h:649
An instrumented cond structure.
Definition: mysql_cond_bits.h:49
Some integer typedefs for easier portability.
AckInfo * minAck(const char *log_file_name, my_off_t log_file_pos)
Find the minimum ack which is smaller than given position.
Definition: semisync_master.h:550
unsigned long rpl_semi_sync_master_wait_sessions
Definition: semisync_master.cc:53
AckInfo * m_ack_array
Definition: semisync_master.h:482
#define BLOCK_TRANX_NODES
Definition: semisync_master.h:90
my_off_t log_pos_
Definition: semisync_master.h:50
unsigned long rpl_semi_sync_master_yes_transactions
Definition: semisync_master.cc:48
MYSQL_PLUGIN_IMPORT ulong server_id
Definition: log_event.h:110
Block * current_block
current_block always points the Block in the Block link table in which the last allocated node is...
Definition: semisync_master.h:228
PSI_mutex_key key_ss_mutex_LOCK_binlog_
Definition: semisync_master_plugin.cc:431
PSI_stage_info stage_reading_semi_sync_ack
Definition: semisync_master_plugin.cc:461
TranxNodeAllocator allocator_
Definition: semisync_master.h:313
bool rpl_semi_sync_master_enabled
Definition: semisync_master.cc:44
static void free_block(KEY_CACHE *keycache, st_keycache_thread_var *thread_var, BLOCK_LINK *block)
Definition: mf_keycache.cc:2816
PSI_memory_key key_ss_memory_TranxNodeAllocator_block
Definition: semisync_master_plugin.cc:465
bool full()
Definition: semisync_master.h:492
struct TranxNode * next_
Definition: semisync_master.h:53
Block * last_block
The 'last_block' is the rear of the Block link table;.
Definition: semisync_master.h:221
bool enabled
true if enabled.
Definition: buf0dblwr.cc:80
void my_free(void *ptr)
Frees the memory pointed by the ptr.
Definition: my_memory.cc:81
unsigned long long rpl_semi_sync_master_trx_wait_time
Definition: semisync_master.cc:61
unsigned int PSI_memory_key
Instrumented memory key.
Definition: psi_memory_bits.h:46
mysql_mutex_t * lock_
Definition: semisync_master.h:320
This class provides memory allocating and freeing methods for TranxNode.
Definition: semisync_master.h:91
void set_master_enabled(bool enabled)
Definition: semisync_master.h:635
unsigned int rpl_semi_sync_master_wait_for_slave_count
Definition: semisync_master.cc:63
void clear()
Definition: semisync_master.h:402
#define mysql_cond_destroy(C)
Definition: mysql_cond.h:44
bool empty() const
Definition: semisync_master.h:403
unsigned int PSI_mutex_key
Instrumented mutex key.
Definition: psi_mutex_bits.h:49
void remove_all(const char *log_file_name, my_off_t log_file_pos)
Remove all acks which equal to the given position.
Definition: semisync_master.h:501
uint64 calc_hash(ulong algorithm, type T, size_t len)
Definition: rpl_write_set_handler.cc:74
unsigned long rpl_semi_sync_master_clients
Definition: semisync_master.cc:59
unsigned int PSI_cond_key
Instrumented cond key.
Definition: psi_cond_bits.h:41
#define DBUG_ASSERT(A)
Definition: my_dbug.h:199
unsigned long rpl_semi_sync_master_num_timeouts
Definition: my_loglevel.h:44
unsigned long long rpl_semi_sync_master_net_wait_num
Definition: semisync_master.cc:58
unsigned long long rpl_semi_sync_master_net_wait_time
Definition: semisync_master.cc:60
int free_nodes_before(TranxNode *node)
All Blocks before the given 'node' are free Block and moved into the rear of the Block link table...
Definition: semisync_master.h:170
char rpl_semi_sync_master_status
Definition: semisync_master.cc:47
PSI_stage_info stage_waiting_for_semi_sync_slave
Definition: semisync_master_plugin.cc:458
Stage instrument information.
Definition: psi_stage_bits.h:71
int compare(const TranxNode *node1, const char *log_file_name2, my_off_t log_file_pos2)
Definition: semisync_master.h:332
unsigned int updateIfExist(int server_id, const char *log_file_name, my_off_t log_file_pos)
Update a slave's ack into the container if another ack of the slave is already in it...
Definition: semisync_master.h:522
static std::mutex lock
Definition: net_ns.cc:55
~AckContainer()
Definition: semisync_master.h:433
bool is_server(int server_id) const
Definition: semisync_master.h:404
const AckInfo * insert(const AckInfo &ackinfo)
Definition: semisync_master.h:474
int n_waiters
Definition: semisync_master.h:52
This class is used to trace function calls and other process information.
Definition: semisync.h:42
void update(const char *log_file_name, my_off_t log_file_pos)
Definition: semisync_master.h:419
Defines various enable/disable and HAVE_ macros related to the performance schema instrumentation sys...
AckInfo m_greatest_ack
Definition: semisync_master.h:480
char binlog_name[FN_REFLEN]
Definition: semisync_master.h:397
void free_block(Block *block)
Free a given Block.
Definition: semisync_master.h:274
unsigned int uint
Definition: uca-dump.cc:29
bool rpl_semi_sync_master_wait_no_slave
Definition: semisync_master.cc:62
#define FN_REFLEN
Definition: my_io.h:82
mysql_cond_t cond
Definition: semisync_master.h:51
unsigned long rpl_semi_sync_master_avg_net_wait_time
Definition: semisync_master.cc:57
unsigned long rpl_semi_sync_master_no_transactions
Definition: semisync_master.cc:49
uint32_t uint32
Definition: my_inttypes.h:66
TranxNodeAllocator(uint reserved_nodes)
Definition: semisync_master.h:100
unsigned long rpl_semi_sync_master_trace_level
Definition: semisync_master.cc:46
#define mysql_cond_init(K, C)
Definition: mysql_cond.h:41
bool is_on()
Definition: semisync_master.h:633
TranxNode * allocate_node()
The pointer of the first node after 'last_node' in current_block is returned.
Definition: semisync_master.h:126
static uint update
Definition: myisamlog.cc:90
A sequence memory which contains BLOCK_TRANX_NODES TranxNodes.
Definition: semisync_master.h:209
Block * next
Definition: semisync_master.h:210
ulonglong my_off_t
Definition: my_inttypes.h:71
static const char * key
Definition: suite_stubs.c:14
TranxNode ** trx_htb_
Definition: semisync_master.h:317
unsigned long long rpl_semi_sync_master_trx_wait_num
Definition: semisync_master.cc:56
void setWaitTimeout(unsigned long wait_timeout)
Definition: semisync_master.h:660
PSI_stage_info stage_waiting_for_semi_sync_ack_from_slave
Definition: semisync_master_plugin.cc:455
Base class for semi-sync master and slave classes.
Definition: semisync.h:82
mysql_mutex_t LOCK_binlog_
Definition: semisync_master.h:580
AckInfo()
Definition: semisync_master.h:400
void free_blocks()
If there are some free Blocks and the total number of the Blocks in the Block link table is larger th...
Definition: semisync_master.h:288
char log_name_[FN_REFLEN]
Definition: semisync_master.h:49
bool equal_to(const char *log_file_name, my_off_t log_file_pos) const
Definition: semisync_master.h:406
unsigned long rpl_semi_sync_master_off_times
Definition: semisync_master.cc:50
uint block_num
How many Blocks are in the Block link table.
Definition: semisync_master.h:239
~TranxNodeAllocator()
Definition: semisync_master.h:109
AckContainer stores received acks internally and tell the caller the ack's position when a transactio...
Definition: semisync_master.h:430
unsigned int size()
Definition: semisync_master.h:493
int allocate_block()
Allocate a block and then assign it to current_block.
Definition: semisync_master.h:244
An instrumented mutex structure.
Definition: mysql_mutex_bits.h:49
AckContainer ack_container_
Definition: semisync_master.h:627
bool is_empty()
Definition: semisync_master.h:386
void handleAck(int server_id, const char *log_file_name, my_off_t log_file_pos)
Definition: semisync_master.h:817
The extension class for the master of semi-synchronous replication.
Definition: semisync_master.h:566
int server_id
Definition: semisync_master.h:396
Common #defines and includes for file and socket I/O.
container
Following are enums defining column IDs indexing into each of three system tables.
Definition: innodb_config.h:78
#define LogErr(severity, ecode,...)
Definition: log_builtins.h:788
unsigned int m_empty_slot
Definition: semisync_master.h:486
void setTraceLevel(unsigned long trace_level)
Definition: semisync_master.h:650
Block * first_block
The 'first_block' is the head of the Block link table;.
Definition: semisync_master.h:217
int compare(const TranxNode *node1, const TranxNode *node2)
Definition: semisync_master.h:337
bool less_than(const char *log_file_name, my_off_t log_file_pos) const
Definition: semisync_master.h:410
unsigned long long binlog_pos
Definition: semisync_master.h:398
const AckInfo * insert(int server_id, const char *log_file_name, my_off_t log_file_pos)
Insert an ack's information into the container and report the minimum ack to semisync master if it is...
Definition: semisync_master.cc:1192
unsigned long rpl_semi_sync_master_timefunc_fails
Definition: semisync_master.cc:51
unsigned int m_size
Definition: semisync_master.h:484
void * my_malloc(PSI_memory_key key, size_t size, int flags)
Below functions are used by the components.
Definition: my_memory.cc:57
uint reserved_blocks
Definition: semisync_master.h:199
unsigned long rpl_semi_sync_master_avg_trx_wait_time
Definition: semisync_master.cc:55
TranxNode * trx_rear_
Definition: semisync_master.h:315
PSI_cond_key key_ss_cond_COND_binlog_send_
Definition: semisync_master_plugin.cc:439
bool length(const dd::Spatial_reference_system *srs, const Geometry *g1, double *length, bool *null) noexcept
Computes the length of linestrings and multilinestrings.
Definition: length.cc:75
int last_node
It always points to the last node which has been allocated in the current_block.
Definition: semisync_master.h:234
unsigned long rpl_semi_sync_master_wait_timeouts
Definition: semisync_master.cc:52
Definition: mysql_com.h:867
static int compare(size_t a, size_t b)
Function to compare two size_t integers for their relative order.
Definition: rpl_utility.cc:104
AckContainer()
Definition: semisync_master.h:432
void insert(dd::cache::SPI_lru_cache_owner_ptr &c, dd::Object_id id)
Definition: dictionary_client.cc:3186
int num_entries_
Definition: semisync_master.h:319
Dialog Client Authentication nullptr
Definition: dialog.cc:353
AckInfo is a POD.
Definition: semisync_master.h:395