MySQL  8.0.17
Source Code Documentation
Rpl_info_factory Class Reference

#include <rpl_info_factory.h>

Classes

struct  struct_file_data
 
struct  struct_table_data
 

Static Public Member Functions

static bool create_slave_info_objects (uint mi_option, uint rli_option, int thread_mask, Multisource_info *pchannel_map)
 
This function should be called from init_slave() only. More...
 
static bool configure_channel_replication_filters (Relay_log_info *rli, const char *channel_name)
 Establish the relation between the channel's replication filters and the channel's Relay_log_info, and copy global replication filters to the channel's replication filters if needed. More...
 
static Master_infocreate_mi_and_rli_objects (uint mi_option, uint rli_option, const char *channel, bool convert_repo, Multisource_info *channel_map)
 Create Master_info and Relay_log_info objects for a new channel. More...
 
static Master_infocreate_mi (uint rli_option, const char *channel, bool conver_repo)
 Creates a Master info repository whose type is defined as a parameter. More...
 
static bool change_mi_repository (Master_info *mi, const uint mi_option, const char **msg)
 Allows to change the master info repository after startup. More...
 
static Relay_log_infocreate_rli (uint rli_option, bool is_slave_recovery, const char *channel, bool convert_repo)
 Creates a Relay log info repository whose type is defined as a parameter. More...
 
static bool change_rli_repository (Relay_log_info *rli, const uint rli_option, const char **msg)
 Allows to change the relay log info repository after startup. More...
 
static Slave_workercreate_worker (uint rli_option, uint worker_id, Relay_log_info *rli, bool is_gaps_collecting_phase)
 Creates a Slave worker repository whose type is defined as a parameter. More...
 
static bool reset_workers (Relay_log_info *rli)
 Delete all info from Worker info tables to render them useless in future MTS recovery, and indicate that in Coordinator info table. More...
 

Static Private Member Functions

static void init_repository_metadata ()
 Initializes startup information on diferent repositories. More...
 
static bool decide_repository (Rpl_info *info, uint option, Rpl_info_handler **handler_src, Rpl_info_handler **handler_dest, const char **msg)
 Decides during startup what repository will be used based on the following decision table: More...
 
static bool init_repositories (const struct_table_data &table_data, const struct_file_data &file_data, uint option, Rpl_info_handler **handler_src, Rpl_info_handler **handler_dest, const char **msg)
 Creates repositories that will be associated to either the Master_info or Relay_log_info. More...
 
static enum_return_check check_src_repository (Rpl_info *info, uint option, Rpl_info_handler **handler_src)
 This method is called by the decide_repository() and is used to check if the source repository exits. More...
 
static bool check_error_repository (Rpl_info_handler *handler_src, Rpl_info_handler *handler_dst, enum_return_check err_src, enum_return_check err_dst, const char **msg)
 This method is called by the decide_repository() and is used print out information on errors. More...
 
static bool init_repositories (Rpl_info *info, Rpl_info_handler **handler_src, Rpl_info_handler **handler_dst, const char **msg)
 This method is called by the decide_repository() and is used to initialize the repositories through a low-level interfacei, which means that if they do not exist nothing will be created. More...
 
static bool scan_repositories (uint *found_instances, uint *found_rep_option, const struct_table_data &table_data, const struct_file_data &file_data, const char **msg)
 
static bool load_channel_names_from_repository (std::vector< std::string > &channel_list, uint mi_instances, uint mi_repository, const char *default_channel, bool *default_channel_created_previously)
 Make a list of all the channels if existed on the previos slave run. More...
 
static bool load_channel_names_from_table (std::vector< std::string > &channel_list, const char *default_channel, bool *default_channel_created_previously)
 In a multisourced slave, during init_slave(), the repositories are read to initialize the slave info objects. More...
 

Static Private Attributes

static struct_table_data rli_table_data
 
static struct_file_data rli_file_data
 
static struct_table_data mi_table_data
 
static struct_file_data mi_file_data
 
static struct_table_data worker_table_data
 
static struct_file_data worker_file_data
 

Member Function Documentation

◆ change_mi_repository()

bool Rpl_info_factory::change_mi_repository ( Master_info mi,
const uint  mi_option,
const char **  msg 
)
static

Allows to change the master info repository after startup.

Parameters
[in]miReference to Master_info.
[in]mi_optionType of the repository, e.g. FILE TABLE.
[out]msgError message if something goes wrong.
Return values
falseNo error
trueFailure

◆ change_rli_repository()

bool Rpl_info_factory::change_rli_repository ( Relay_log_info rli,
const uint  rli_option,
const char **  msg 
)
static

Allows to change the relay log info repository after startup.

Parameters
[in]rliPointer to Relay_log_info.
[in]rli_optionType of the repository, e.g. FILE TABLE.
[out]msgError message if something goes wrong.
Return values
falseNo error
trueFailure

◆ check_error_repository()

bool Rpl_info_factory::check_error_repository ( Rpl_info_handler handler_src,
Rpl_info_handler handler_dest,
enum_return_check  err_src,
enum_return_check  err_dst,
const char **  msg 
)
staticprivate

This method is called by the decide_repository() and is used print out information on errors.

Parameters
handler_srcSource repository from where information is copied into the destination repository.
handler_destDestination repository to where informaiton is copied.
err_srcPossible error status of the source repo check
err_dstPossible error status of the destination repo check
[out]msgError message if something goes wrong.
Return values
trueFailure

◆ check_src_repository()

enum_return_check Rpl_info_factory::check_src_repository ( Rpl_info info,
uint  option,
Rpl_info_handler **  handler_src 
)
staticprivate

This method is called by the decide_repository() and is used to check if the source repository exits.

Parameters
[in]infoEither master info or relay log info.
[in]optionIdentifies the type of the repository that will be used, i.e., destination repository.
[out]handler_srcSource repository from where information is
Returns
enum_return_check The repository's status.

◆ configure_channel_replication_filters()

bool Rpl_info_factory::configure_channel_replication_filters ( Relay_log_info rli,
const char *  channel_name 
)
static

Establish the relation between the channel's replication filters and the channel's Relay_log_info, and copy global replication filters to the channel's replication filters if needed.

Parameters
rliPointer to Relay_log_info.
channel_nameThe channel name.
Return values
falseNo error
trueFailure

◆ create_mi()

Master_info * Rpl_info_factory::create_mi ( uint  mi_option,
const char *  channel,
bool  to_decide_repo 
)
static

Creates a Master info repository whose type is defined as a parameter.

Parameters
[in]mi_optionType of the repository, e.g. FILE TABLE.
[in]channelthe channel for which mi is to be created
[in]to_decide_repothe flag is set to true if mi repositories are allowed to convert. For details, see init_slave()

The execution fails if a user requests a type but a different type already exists in the system. This is done to avoid that a user accidentally accesses the wrong repository and makes the slave go out of sync.

Return values
Pointerto Master_info Success
NULLFailure

◆ create_mi_and_rli_objects()

Master_info * Rpl_info_factory::create_mi_and_rli_objects ( uint  mi_option,
uint  rli_option,
const char *  channel,
bool  to_decide_repo,
Multisource_info pchannel_map 
)
static

Create Master_info and Relay_log_info objects for a new channel.

Also, set cross dependencies between these objects used all over the code.

Both master_info and relay_log_info repositories should be of the type TABLE. We do a check for this here as well.

Parameters
[in]mi_optionmaster info repository
[in]rli_optionrelay log info repository
[in]channelthe channel for which these objects should be created.
[in]to_decide_repoFor this channel, check if repositories are allowed to convert from one type to other.
[in]pchannel_mapa pointer to channel_map
Returns
Pointer pointer to the created Master_info
NULL when creation fails

◆ create_rli()

Relay_log_info * Rpl_info_factory::create_rli ( uint  rli_option,
bool  is_slave_recovery,
const char *  channel,
bool  to_decide_repo 
)
static

Creates a Relay log info repository whose type is defined as a parameter.

Parameters
[in]rli_optionType of the Relay log info repository
[in]is_slave_recoveryIf the slave should try to start a recovery process to get consistent relay log files
[in]channelthe channel for which mi is to be created
[in]to_decide_repoIf true, rli repositories are allowed to convert from one repo to other

The execution fails if a user requests a type but a different type already exists in the system. This is done to avoid that a user accidentally accesses the wrong repository and make the slave go out of sync.

Return values
Pointerto Relay_log_info Success
NULLFailure

◆ create_slave_info_objects()

bool Rpl_info_factory::create_slave_info_objects ( uint  mi_option,
uint  rli_option,
int  thread_mask,
Multisource_info pchannel_map 
)
static


This function should be called from init_slave() only.

During the server start, read all the slave repositories on disk (either in FILE or TABLE form) and create corresponding slave info objects. Each thus created master_info object is added to pchannel_map.

Multisource replication is supported by only TABLE based repositories. Based on this fact, the following table shows the supported cases considering the repository type and multiple channels of a slave. Each <—> represents a channel with a name on top of it. '' is an empty stringed channel (or default channel). 'N' indicates some name for a channel.

+--------------------------—+---------------—+--------—+ | channels | Supported? FILE | TABLE | +--------------------------—+---------------—+--------—+ | '' | | |

A) Master<----—>Slave YES YES
'N'
B) Master<----—>Slave NO YES
''
Master0<---------—+
'N' v NO YES
C) Master1<--------—>Slave
'N' ^
Mastern<---------—+
'N'
Master1<---------—+
'N' v NO YES
D) Master2<--------—>Slave
'N' ^
Mastern<---------—+

+--------------------------—+---------------—+--------—+

In a new server, A) shown above is created by default. If there are multiple 'named' channels, but and if a default_channel is not created, it is created.

Some points to note from the above table

From the table it also follows that conversion of repositories is possible ONLY in the case of A) i.e for ex: if B) type repository (i.e a named slave channel) was found during server starup but the user repository option is INFO_REPOSITORY_FILE, then we exit the function.

Note
: only for type A) i.e default channel, it is permissable to have different repo types for Master_info and Relay_log_info (Ex: FILE for mi and TABLE for rli)
: The above restrictions break factory pattern in the code which has been followed throughout before.
: All the repository conversion(or live migration) functions (ex: decide_repository()) take Rpl_info::internal_id as an identifier which is always 1 for the case of Master_info and Relay_log_info. So, in the case of multisource replication, the decision to convert the repositories shall be made even before invoking decide_repository(). In other words, if a channel is not a default channel('') we shall not invoke decide_repository().
: In general, the algorithm in creation of slave info object is: l1: new slave_info; l2: Initialize the repository handlers l3: if (default_channel) check and convert repositories else TABLE type repository set the value of PK in the TABLE handler.
: Update from 5.6 to 5.7(which has Channel_Name in slave_info_tables) is handled in the upgrade script as usual.
Parameters
[in]mi_optionthe user provided master_info_repository
[in]rli_optionthe user provided relay_log_info_repository
[in]thread_maskthread mask
[in]pchannel_mapthe pointer to the multi source map (see, rpl_msr.h)
Returns
Return values
falsesuccess
truefail

◆ create_worker()

Slave_worker * Rpl_info_factory::create_worker ( uint  rli_option,
uint  worker_id,
Relay_log_info rli,
bool  is_gaps_collecting_phase 
)
static

Creates a Slave worker repository whose type is defined as a parameter.

Parameters
[in]rli_optionType of the repository, e.g. FILE TABLE.
[in]worker_idID of the worker to be created.
[in]rliPointer to Relay_log_info.
[in]is_gaps_collecting_phaseSee Slave_worker::rli_init_info

The execution fails if a user requests a type but a different type already exists in the system. This is done to avoid that a user accidentally accesses the wrong repository and make the slave go out of sync.

Return values
Pointerto Slave_worker Success
NULLFailure

◆ decide_repository()

bool Rpl_info_factory::decide_repository ( Rpl_info info,
uint  option,
Rpl_info_handler **  handler_src,
Rpl_info_handler **  handler_dest,
const char **  msg 
)
staticprivate

Decides during startup what repository will be used based on the following decision table:

|--------------+-----------------------+-----------------------|
| Exists \ Opt | SOURCE | DESTINATION |
|--------------+-----------------------+-----------------------|
| ~is_s, ~is_d | - | Create/Update D |
| ~is_s, is_d | - | Continue with D |
| is_s, ~is_d | Copy S into D | Create/Update D |
| is_s, is_d | Error | Error |
|--------------+-----------------------+-----------------------|
Parameters
[in]infoEither master info or relay log info.
[in]optionIdentifies the type of the repository that will be used, i.e., destination repository.
[out]handler_srcSource repository from where information is copied into the destination repository.
[out]handler_destDestination repository to where informaiton is copied.
[out]msgError message if something goes wrong.
Return values
falseNo error
trueFailure

◆ init_repositories() [1/2]

bool Rpl_info_factory::init_repositories ( const struct_table_data table_data,
const struct_file_data file_data,
uint  rep_option,
Rpl_info_handler **  handler_src,
Rpl_info_handler **  handler_dest,
const char **  msg 
)
staticprivate

Creates repositories that will be associated to either the Master_info or Relay_log_info.

Parameters
[in]table_dataDefines information to create a table repository.
[in]file_dataDefines information to create a file repository.
[in]rep_optionIdentifies the type of the repository that will be used, i.e., destination repository.
[out]handler_srcSource repository from where information is copied into the destination repository.
[out]handler_destDestination repository to where informaiton is copied.
[out]msgError message if something goes wrong.
Return values
falseNo error
trueFailure

◆ init_repositories() [2/2]

bool Rpl_info_factory::init_repositories ( Rpl_info info,
Rpl_info_handler **  handler_src,
Rpl_info_handler **  handler_dest,
const char **  msg 
)
staticprivate

This method is called by the decide_repository() and is used to initialize the repositories through a low-level interfacei, which means that if they do not exist nothing will be created.

Parameters
[in]infoEither master info or relay log info.
[out]handler_srcSource repository from where information is copied into the destination repository.
[out]handler_destDestination repository to where informaiton is copied.
[out]msgError message if something goes wrong.
Return values
falseNo error
trueFailure

◆ init_repository_metadata()

void Rpl_info_factory::init_repository_metadata ( )
staticprivate

Initializes startup information on diferent repositories.

◆ load_channel_names_from_repository()

bool Rpl_info_factory::load_channel_names_from_repository ( std::vector< std::string > &  channel_list,
uint  mi_instances,
uint  mi_repository,
const char *  default_channel,
bool default_channel_existed_previously 
)
staticprivate

Make a list of all the channels if existed on the previos slave run.

Parameters
[out]channel_listthe names of all channels that exists on this slave.
[in]mi_instancesnumber of master_info repositories
[in]mi_repositoryFound master_info repository
[in]default_channelpointer to default channel.
[out]default_channel_existed_previouslyValue filled with true if default channel existed previously. False if it is not.
Returns
Return values
truefail
falsesuccess

◆ load_channel_names_from_table()

bool Rpl_info_factory::load_channel_names_from_table ( std::vector< std::string > &  channel_list,
const char *  default_channel,
bool default_channel_existed_previously 
)
staticprivate

In a multisourced slave, during init_slave(), the repositories are read to initialize the slave info objects.

To initialize the slave info objects, we need the number of channels the slave was connected to previously. The following function, finds the number of channels in the master info repository. Later, this chanenl list is used to create a pair of {mi, rli} objects required for IO and SQL threads respectively.

Parameters
[out]channel_listA reference to the channel list. This will be filled after reading the master info table, row by row.
[in]default_channelpointer to default channel.
[out]default_channel_existed_previouslyValue filled with true if default channel existed previously. False if it is not.

◆ reset_workers()

bool Rpl_info_factory::reset_workers ( Relay_log_info rli)
static

Delete all info from Worker info tables to render them useless in future MTS recovery, and indicate that in Coordinator info table.

Returns
false on success, true when a failure in deletion or writing to Coordinator table fails.

◆ scan_repositories()

bool Rpl_info_factory::scan_repositories ( uint found_instances,
uint found_rep_option,
const struct_table_data table_data,
const struct_file_data file_data,
const char **  msg 
)
staticprivate

Member Data Documentation

◆ mi_file_data

Rpl_info_factory::struct_file_data Rpl_info_factory::mi_file_data
staticprivate

◆ mi_table_data

Rpl_info_factory::struct_table_data Rpl_info_factory::mi_table_data
staticprivate

◆ rli_file_data

Rpl_info_factory::struct_file_data Rpl_info_factory::rli_file_data
staticprivate

◆ rli_table_data

Rpl_info_factory::struct_table_data Rpl_info_factory::rli_table_data
staticprivate

◆ worker_file_data

Rpl_info_factory::struct_file_data Rpl_info_factory::worker_file_data
staticprivate

◆ worker_table_data

Rpl_info_factory::struct_table_data Rpl_info_factory::worker_table_data
staticprivate

The documentation for this class was generated from the following files: