This section describes how to write server-side semisynchronous replication plugins, using the example plugins found in theplugin/semisync directory of MySQL source distributions. That directory contains the source files for source and replica plugins namedrpl_semi_sync_master andrpl_semi_sync_slave. The information here covers only how to set up the plugin framework. For details about how the plugins implement replication functions, see the source.
To write a semisynchronous replication plugin, include the following header file in the plugin source file. Other MySQL or general header files might also be needed, depending on the plugin capabilities and requirements.
#include <mysql/plugin.h>plugin.h defines theMYSQL_REPLICATION_PLUGIN server plugin type and the data structures needed to declare the plugin.
For the source side,semisync_master_plugin.cc contains this general descriptor for a plugin namedrpl_semi_sync_master:
mysql_declare_plugin(semi_sync_master){ MYSQL_REPLICATION_PLUGIN, &semi_sync_master_plugin, "rpl_semi_sync_master", "He Zhenxing", "Semi-synchronous replication master", PLUGIN_LICENSE_GPL, semi_sync_master_plugin_init, /* Plugin Init */ semi_sync_master_plugin_deinit, /* Plugin Deinit */ 0x0100 /* 1.0 */, semi_sync_master_status_vars, /* status variables */ semi_sync_master_system_vars, /* system variables */ NULL, /* config options */ 0, /* flags */}mysql_declare_plugin_end; For the replica side,semisync_slave_plugin.cc contains this general descriptor for a plugin namedrpl_semi_sync_slave:
mysql_declare_plugin(semi_sync_slave){ MYSQL_REPLICATION_PLUGIN, &semi_sync_slave_plugin, "rpl_semi_sync_slave", "He Zhenxing", "Semi-synchronous replication slave", PLUGIN_LICENSE_GPL, semi_sync_slave_plugin_init, /* Plugin Init */ semi_sync_slave_plugin_deinit, /* Plugin Deinit */ 0x0100 /* 1.0 */, semi_sync_slave_status_vars, /* status variables */ semi_sync_slave_system_vars, /* system variables */ NULL, /* config options */ 0, /* flags */}mysql_declare_plugin_end;For both the source and replica plugins, the general descriptor has pointers to the type-specific descriptor, the initialization and deinitialization functions, and to the status and system variables implemented by the plugin. For information about variable setup, seeSection 4.4.2.2, “Server Plugin Status and System Variables”. The following remarks discuss the type-specific descriptor and the initialization and deinitialization functions for the source plugin but apply similarly to the replica plugin.
Thesemi_sync_master_plugin member of the source general descriptor points to the type-specific descriptor, which consists only of the type-specific API version number:
struct Mysql_replication semi_sync_master_plugin= { MYSQL_REPLICATION_INTERFACE_VERSION};The initialization and deinitialization function declarations look like this:
static int semi_sync_master_plugin_init(void *p);static int semi_sync_master_plugin_deinit(void *p);The initialization function uses the pointer to register transaction and binary logging“observers” with the server. After successful initialization, the server takes care of invoking the observers at the appropriate times. (For details on the observers, see the source files.) The deinitialization function cleans up by deregistering the observers. Each function returns 0 for success or 1 if an error occurs.
To compile and install a plugin library file, use the instructions inSection 4.4.3, “Compiling and Installing Plugin Libraries”. To make the library file available for use, install it in the plugin directory (the directory named by theplugin_dir system variable). For therpl_semi_sync_master andrpl_semi_sync_slave plugins, they are compiled and installed when you build MySQL from source. They are also included in binary distributions. The build process produces shared object libraries with names ofsemisync_master.so andsemisync_slave.so (the.so suffix might differ depending on your platform).