mirror of https://github.com/MariaDB/server
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							1118 lines
						
					
					
						
							39 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							1118 lines
						
					
					
						
							39 KiB
						
					
					
				| /* Copyright (C) 2009-2013 Codership Oy <info@codership.com> | |
|  | |
|    This program is free software; you can redistribute it and/or modify | |
|    it under the terms of the GNU General Public License as published by | |
|    the Free Software Foundation; version 2 of the License. | |
|  | |
|    This program is distributed in the hope that it will be useful, | |
|    but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | |
|    GNU General Public License for more details. | |
|  | |
|    You should have received a copy of the GNU General Public License along | |
|    with this program; if not, write to the Free Software Foundation, Inc., | |
|    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
|  */ | |
| 
 | |
| /*! | |
|   @file wsrep API declaration. | |
|  | |
|   HOW TO READ THIS FILE. | |
|  | |
|   Due to C language rules this header layout doesn't lend itself to intuitive | |
|   reading. So here's the scoop: in the end this header declares two main types: | |
|  | |
|   * struct wsrep_init_args | |
|  | |
|   and | |
|  | |
|   * struct wsrep | |
|  | |
|   wsrep_init_args contains initialization parameters for wsrep provider like | |
|   names, addresses, etc. and pointers to callbacks. The callbacks will be called | |
|   by provider when it needs to do something application-specific, like log a | |
|   message or apply a writeset. It should be passed to init() call from | |
|   wsrep API. It is an application part of wsrep API contract. | |
|  | |
|   struct wsrep is the interface to wsrep provider. It contains all wsrep API | |
|   calls. It is a provider part of wsrep API contract. | |
|  | |
|   Finally, wsrep_load() method loads (dlopens) wsrep provider library. It is | |
|   defined in wsrep_loader.c unit and is part of libwsrep.a (which is not a | |
|   wsrep provider, but a convenience library). | |
|  | |
|   wsrep_unload() does the reverse. | |
|  | |
| */ | |
| #ifndef WSREP_H | |
| #define WSREP_H | |
|  | |
| #include <stdint.h> | |
| #include <stdbool.h> | |
| #include <stdlib.h> | |
| #include <unistd.h> | |
| #include <time.h> | |
|  | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif | |
|  | |
| /************************************************************************** | |
|  *                                                                        * | |
|  *                       wsrep replication API                            * | |
|  *                                                                        * | |
|  **************************************************************************/ | |
| 
 | |
| #define WSREP_INTERFACE_VERSION "25" | |
|  | |
| /*! Empty backend spec */ | |
| #define WSREP_NONE "none" | |
|  | |
| 
 | |
| /*! | |
|  * @brief log severity levels, passed as first argument to log handler | |
|  */ | |
| typedef enum wsrep_log_level | |
| { | |
|     WSREP_LOG_FATAL, //!< Unrecoverable error, application must quit. | |
|     WSREP_LOG_ERROR, //!< Operation failed, must be repeated. | |
|     WSREP_LOG_WARN,  //!< Unexpected condition, but no operational failure. | |
|     WSREP_LOG_INFO,  //!< Informational message. | |
|     WSREP_LOG_DEBUG  //!< Debug message. Shows only of compiled with debug. | |
| } wsrep_log_level_t; | |
| 
 | |
| /*! | |
|  * @brief error log handler | |
|  * | |
|  *        All messages from wsrep provider are directed to this | |
|  *        handler, if present. | |
|  * | |
|  * @param level   log level | |
|  * @param message log message | |
|  */ | |
| typedef void (*wsrep_log_cb_t)(wsrep_log_level_t, const char *); | |
| 
 | |
| 
 | |
| /*! | |
|  *  Certain provider capabilities application may want to know about | |
|  */ | |
| #define WSREP_CAP_MULTI_MASTER          ( 1ULL << 0 ) | |
| #define WSREP_CAP_CERTIFICATION         ( 1ULL << 1 ) | |
| #define WSREP_CAP_PARALLEL_APPLYING     ( 1ULL << 2 ) | |
| #define WSREP_CAP_TRX_REPLAY            ( 1ULL << 3 ) | |
| #define WSREP_CAP_ISOLATION             ( 1ULL << 4 ) | |
| #define WSREP_CAP_PAUSE                 ( 1ULL << 5 ) | |
| #define WSREP_CAP_CAUSAL_READS          ( 1ULL << 6 ) | |
| #define WSREP_CAP_CAUSAL_TRX            ( 1ULL << 7 ) | |
| #define WSREP_CAP_INCREMENTAL_WRITESET  ( 1ULL << 8 ) | |
| #define WSREP_CAP_SESSION_LOCKS         ( 1ULL << 9 ) | |
| #define WSREP_CAP_DISTRIBUTED_LOCKS     ( 1ULL << 10 ) | |
| #define WSREP_CAP_CONSISTENCY_CHECK     ( 1ULL << 11 ) | |
| #define WSREP_CAP_UNORDERED             ( 1ULL << 12 ) | |
| #define WSREP_CAP_ANNOTATION            ( 1ULL << 13 ) | |
| #define WSREP_CAP_PREORDERED            ( 1ULL << 14 ) | |
|  | |
| 
 | |
| /*! | |
|  *  Writeset flags | |
|  * | |
|  * COMMIT       the writeset and all preceding writesets must be committed | |
|  * ROLLBACK     all preceding writesets in a transaction must be rolled back | |
|  * ISOLATION    the writeset must be applied AND committed in isolation | |
|  * PA_UNSAFE    the writeset cannot be applied in parallel | |
|  * COMMUTATIVE  the order in which the writeset is applied does not matter | |
|  * NATIVE       the writeset contains another writeset in this provider format | |
|  * | |
|  * Note that some of the flags are mutually exclusive (e.g. COMMIT and | |
|  * ROLLBACK). | |
|  */ | |
| #define WSREP_FLAG_COMMIT               ( 1ULL << 0 ) | |
| #define WSREP_FLAG_ROLLBACK             ( 1ULL << 1 ) | |
| #define WSREP_FLAG_ISOLATION            ( 1ULL << 2 ) | |
| #define WSREP_FLAG_PA_UNSAFE            ( 1ULL << 3 ) | |
| #define WSREP_FLAG_COMMUTATIVE          ( 1ULL << 4 ) | |
| #define WSREP_FLAG_NATIVE               ( 1ULL << 5 ) | |
|  | |
| 
 | |
| typedef uint64_t wsrep_trx_id_t;  //!< application transaction ID | |
| typedef uint64_t wsrep_conn_id_t; //!< application connection ID | |
| typedef int64_t  wsrep_seqno_t;   //!< sequence number of a writeset, etc. | |
| #ifdef __cplusplus | |
| typedef bool     wsrep_bool_t; | |
| #else | |
| typedef _Bool    wsrep_bool_t;    //!< should be the same as standard (C99) bool | |
| #endif /* __cplusplus */ | |
|  | |
| /*! undefined seqno */ | |
| #define WSREP_SEQNO_UNDEFINED (-1) | |
|  | |
| 
 | |
| /*! wsrep provider status codes */ | |
| typedef enum wsrep_status | |
| { | |
|     WSREP_OK = 0,          //!< success | |
|     WSREP_WARNING,         //!< minor warning, error logged | |
|     WSREP_TRX_MISSING,     //!< transaction is not known by wsrep | |
|     WSREP_TRX_FAIL,        //!< transaction aborted, server can continue | |
|     WSREP_BF_ABORT,        //!< trx was victim of brute force abort | |
|     WSREP_SIZE_EXCEEDED,   //!< data exceeded maximum supported size | |
|     WSREP_CONN_FAIL,       //!< error in client connection, must abort | |
|     WSREP_NODE_FAIL,       //!< error in node state, wsrep must reinit | |
|     WSREP_FATAL,           //!< fatal error, server must abort | |
|     WSREP_NOT_IMPLEMENTED  //!< feature not implemented | |
| } wsrep_status_t; | |
| 
 | |
| 
 | |
| /*! wsrep callbacks status codes */ | |
| typedef enum wsrep_cb_status | |
| { | |
|     WSREP_CB_SUCCESS =  0, //!< success (as in "not critical failure") | |
|     WSREP_CB_FAILURE       //!< critical failure (consistency violation) | |
|     /* Technically, wsrep provider has no use for specific failure codes since | |
|      * there is nothing it can do about it but abort execution. Therefore any | |
|      * positive number shall indicate a critical failure. Optionally that value | |
|      * may be used by provider to come to a consensus about state consistency | |
|      * in a group of nodes. */ | |
| } wsrep_cb_status_t; | |
| 
 | |
| 
 | |
| /*! | |
|  * UUID type - for all unique IDs | |
|  */ | |
| typedef struct wsrep_uuid { | |
|     uint8_t data[16]; | |
| } wsrep_uuid_t; | |
| 
 | |
| /*! Undefined UUID */ | |
| static const wsrep_uuid_t WSREP_UUID_UNDEFINED = {{0,}}; | |
| 
 | |
| /*! UUID string representation length, terminating '\0' not included */ | |
| #define WSREP_UUID_STR_LEN 36 | |
|  | |
| /*! | |
|  * Scan UUID from string | |
|  * @return length of UUID string representation or negative error code | |
|  */ | |
| extern int | |
| wsrep_uuid_scan (const char* str, size_t str_len, wsrep_uuid_t* uuid); | |
| 
 | |
| /*! | |
|  * Print UUID to string | |
|  * @return length of UUID string representation or negative error code | |
|  */ | |
| extern int | |
| wsrep_uuid_print (const wsrep_uuid_t* uuid, char* str, size_t str_len); | |
| 
 | |
| #define WSREP_MEMBER_NAME_LEN 32  //!< maximum logical member name length | |
| #define WSREP_INCOMING_LEN    256 //!< max Domain Name length + 0x00 | |
|  | |
| 
 | |
| /*! | |
|  * Global transaction identifier | |
|  */ | |
| typedef struct wsrep_gtid | |
| { | |
|     wsrep_uuid_t  uuid;  /*!< History UUID */ | |
|     wsrep_seqno_t seqno; /*!< Sequence number */ | |
| } wsrep_gtid_t; | |
| 
 | |
| /*! Undefined GTID */ | |
| static const wsrep_gtid_t WSREP_GTID_UNDEFINED = {{{0, }}, -1}; | |
| 
 | |
| /*! Minimum number of bytes guaranteed to store GTID string representation, | |
|  * terminating '\0' not included (36 + 1 + 20) */ | |
| #define WSREP_GTID_STR_LEN 57 | |
|  | |
| 
 | |
| /*! | |
|  * Scan GTID from string | |
|  * @return length of GTID string representation or negative error code | |
|  */ | |
| extern int | |
| wsrep_gtid_scan(const char* str, size_t str_len, wsrep_gtid_t* gtid); | |
| 
 | |
| /*! | |
|  * Print GTID to string | |
|  * @return length of GTID string representation or negative error code | |
|  */ | |
| extern int | |
| wsrep_gtid_print(const wsrep_gtid_t* gtid, char* str, size_t str_len); | |
| 
 | |
| 
 | |
| /*! | |
|  * Transaction meta data | |
|  */ | |
| typedef struct wsrep_trx_meta | |
| { | |
|     wsrep_gtid_t  gtid;       /*!< Global transaction identifier */ | |
|     wsrep_seqno_t depends_on; /*!< Sequence number part of the last transaction | |
|                                    this transaction depends on */ | |
| } wsrep_trx_meta_t; | |
| 
 | |
| 
 | |
| /*! | |
|  * member status | |
|  */ | |
| typedef enum wsrep_member_status { | |
|     WSREP_MEMBER_UNDEFINED, //!< undefined state | |
|     WSREP_MEMBER_JOINER,    //!< incomplete state, requested state transfer | |
|     WSREP_MEMBER_DONOR,     //!< complete state, donates state transfer | |
|     WSREP_MEMBER_JOINED,    //!< complete state | |
|     WSREP_MEMBER_SYNCED,    //!< complete state, synchronized with group | |
|     WSREP_MEMBER_ERROR,     //!< this and above is provider-specific error code | |
|     WSREP_MEMBER_MAX | |
| } wsrep_member_status_t; | |
| 
 | |
| /*! | |
|  * static information about a group member (some fields are tentative yet) | |
|  */ | |
| typedef struct wsrep_member_info { | |
|     wsrep_uuid_t id;                           //!< group-wide unique member ID | |
|     char         name[WSREP_MEMBER_NAME_LEN];  //!< human-readable name | |
|     char         incoming[WSREP_INCOMING_LEN]; //!< address for client requests | |
| } wsrep_member_info_t; | |
| 
 | |
| /*! | |
|  * group status | |
|  */ | |
| typedef enum wsrep_view_status { | |
|     WSREP_VIEW_PRIMARY,      //!< primary group configuration (quorum present) | |
|     WSREP_VIEW_NON_PRIMARY,  //!< non-primary group configuration (quorum lost) | |
|     WSREP_VIEW_DISCONNECTED, //!< not connected to group, retrying. | |
|     WSREP_VIEW_MAX | |
| } wsrep_view_status_t; | |
| 
 | |
| /*! | |
|  * view of the group | |
|  */ | |
| typedef struct wsrep_view_info { | |
|     wsrep_gtid_t        state_id;  //!< global state ID | |
|     wsrep_seqno_t       view;      //!< global view number | |
|     wsrep_view_status_t status;    //!< view status | |
|     wsrep_bool_t        state_gap; //!< gap between global and local states | |
|     int                 my_idx;    //!< index of this member in the view | |
|     int                 memb_num;  //!< number of members in the view | |
|     int                 proto_ver; //!< application protocol agreed on the view | |
|     wsrep_member_info_t members[1];//!< array of member information | |
| } wsrep_view_info_t; | |
| 
 | |
| /*! | |
|  * Magic string to tell provider to engage into trivial (empty) state transfer. | |
|  * No data will be passed, but the node shall be considered JOINED. | |
|  * Should be passed in sst_req parameter of wsrep_view_cb_t. | |
|  */ | |
| #define WSREP_STATE_TRANSFER_TRIVIAL "trivial" | |
|  | |
| /*! | |
|  * Magic string to tell provider not to engage in state transfer at all. | |
|  * The member will stay in WSREP_MEMBER_UNDEFINED state but will keep on | |
|  * receiving all writesets. | |
|  * Should be passed in sst_req parameter of wsrep_view_cb_t. | |
|  */ | |
| #define WSREP_STATE_TRANSFER_NONE "none" | |
|  | |
| /*! | |
|  * @brief group view handler | |
|  * | |
|  * This handler is called in total order corresponding to the group | |
|  * configuration change. It is to provide a vital information about | |
|  * new group view. If view info indicates existence of discontinuity | |
|  * between group and member states, state transfer request message | |
|  * should be filled in by the callback implementation. | |
|  * | |
|  * @note Currently it is assumed that sst_req is allocated using | |
|  *       malloc()/calloc()/realloc() and it will be freed by | |
|  *       wsrep implementation. | |
|  * | |
|  * @param app_ctx     application context | |
|  * @param recv_ctx    receiver context | |
|  * @param view        new view on the group | |
|  * @param state       current state | |
|  * @param state_len   lenght of current state | |
|  * @param sst_req     location to store SST request | |
|  * @param sst_req_len location to store SST request length or error code, | |
|  *                    value of 0 means no SST. | |
|  */ | |
| typedef enum wsrep_cb_status (*wsrep_view_cb_t) ( | |
|     void*                    app_ctx, | |
|     void*                    recv_ctx, | |
|     const wsrep_view_info_t* view, | |
|     const char*              state, | |
|     size_t                   state_len, | |
|     void**                   sst_req, | |
|     size_t*                  sst_req_len | |
| ); | |
| 
 | |
| 
 | |
| /*! | |
|  * @brief apply callback | |
|  * | |
|  * This handler is called from wsrep library to apply replicated writeset | |
|  * Must support brute force applying for multi-master operation | |
|  * | |
|  * @param recv_ctx receiver context pointer provided by the application | |
|  * @param data     data buffer containing the writeset | |
|  * @param size     data buffer size | |
|  * @param flags    WSREP_FLAG_... flags | |
|  * @param meta     transaction meta data of the writeset to be applied | |
|  * | |
|  * @return success code: | |
|  * @retval WSREP_OK | |
|  * @retval WSREP_NOT_IMPLEMENTED appl. does not support the writeset format | |
|  * @retval WSREP_ERROR failed to apply the writeset | |
|  */ | |
| typedef enum wsrep_cb_status (*wsrep_apply_cb_t) ( | |
|     void*                   recv_ctx, | |
|     const void*             data, | |
|     size_t                  size, | |
|     uint32_t                flags, | |
|     const wsrep_trx_meta_t* meta | |
| ); | |
| 
 | |
| 
 | |
| /*! | |
|  * @brief commit callback | |
|  * | |
|  * This handler is called to commit the changes made by apply callback. | |
|  * | |
|  * @param recv_ctx receiver context pointer provided by the application | |
|  * @param flags    WSREP_FLAG_... flags | |
|  * @param meta     transaction meta data of the writeset to be committed | |
|  * @param exit     set to true to exit recv loop | |
|  * @param commit   true - commit writeset, false - rollback writeset | |
|  * | |
|  * @return success code: | |
|  * @retval WSREP_OK | |
|  * @retval WSREP_ERROR call failed | |
|  */ | |
| typedef enum wsrep_cb_status (*wsrep_commit_cb_t) ( | |
|     void*                   recv_ctx, | |
|     uint32_t                flags, | |
|     const wsrep_trx_meta_t* meta, | |
|     wsrep_bool_t*           exit, | |
|     wsrep_bool_t            commit | |
| ); | |
| 
 | |
| 
 | |
| /*! | |
|  * @brief unordered callback | |
|  * | |
|  * This handler is called to execute unordered actions (actions that need not | |
|  * to be executed in any particular order) attached to writeset. | |
|  * | |
|  * @param recv_ctx receiver context pointer provided by the application | |
|  * @param data     data buffer containing the writeset | |
|  * @param size     data buffer size | |
|  */ | |
| typedef enum wsrep_cb_status (*wsrep_unordered_cb_t) ( | |
|     void*       recv_ctx, | |
|     const void* data, | |
|     size_t      size | |
| ); | |
| 
 | |
| 
 | |
| /*! | |
|  * @brief a callback to donate state snapshot | |
|  * | |
|  * This handler is called from wsrep library when it needs this node | |
|  * to deliver state to a new cluster member. | |
|  * No state changes will be committed for the duration of this call. | |
|  * Wsrep implementation may provide internal state to be transmitted | |
|  * to new cluster member for initial state. | |
|  * | |
|  * @param app_ctx   application context | |
|  * @param recv_ctx  receiver context | |
|  * @param msg       state transfer request message | |
|  * @param msg_len   state transfer request message length | |
|  * @param gtid      current state ID on this node | |
|  * @param state     current wsrep internal state buffer | |
|  * @param state_len current wsrep internal state buffer len | |
|  * @param bypass    bypass snapshot transfer, only transfer uuid:seqno pair | |
|  */ | |
| typedef enum wsrep_cb_status (*wsrep_sst_donate_cb_t) ( | |
|     void*               app_ctx, | |
|     void*               recv_ctx, | |
|     const void*         msg, | |
|     size_t              msg_len, | |
|     const wsrep_gtid_t* state_id, | |
|     const char*         state, | |
|     size_t              state_len, | |
|     wsrep_bool_t        bypass | |
| ); | |
| 
 | |
| 
 | |
| /*! | |
|  * @brief a callback to signal application that wsrep state is synced | |
|  *        with cluster | |
|  * | |
|  * This callback is called after wsrep library has got in sync with | |
|  * rest of the cluster. | |
|  * | |
|  * @param app_ctx application context | |
|  */ | |
| typedef void (*wsrep_synced_cb_t) (void* app_ctx); | |
| 
 | |
| 
 | |
| /*! | |
|  * Initialization parameters for wsrep provider. | |
|  */ | |
| struct wsrep_init_args | |
| { | |
|     void* app_ctx;             //!< Application context for callbacks | |
|  | |
|     /* Configuration parameters */ | |
|     const char* node_name;     //!< Symbolic name of this node (e.g. hostname) | |
|     const char* node_address;  //!< Address to be used by wsrep provider | |
|     const char* node_incoming; //!< Address for incoming client connections | |
|     const char* data_dir;      //!< Directory where wsrep files are kept if any | |
|     const char* options;       //!< Provider-specific configuration string | |
|     int         proto_ver;     //!< Max supported application protocol version | |
|  | |
|     /* Application initial state information. */ | |
|     const wsrep_gtid_t* state_id;    //!< Application state GTID | |
|     const char*         state;       //!< Initial state for wsrep provider | |
|     size_t              state_len;   //!< Length of state buffer | |
|  | |
|     /* Application callbacks */ | |
|     wsrep_log_cb_t        logger_cb;       //!< logging handler | |
|     wsrep_view_cb_t       view_handler_cb; //!< group view change handler | |
|  | |
|     /* Applier callbacks */ | |
|     wsrep_apply_cb_t      apply_cb;        //!< apply  callback | |
|     wsrep_commit_cb_t     commit_cb;       //!< commit callback | |
|     wsrep_unordered_cb_t  unordered_cb;    //!< callback for unordered actions | |
|  | |
|     /* State Snapshot Transfer callbacks */ | |
|     wsrep_sst_donate_cb_t sst_donate_cb;   //!< starting to donate | |
|     wsrep_synced_cb_t     synced_cb;       //!< synced with group | |
| }; | |
| 
 | |
| 
 | |
| /*! Type of the stats variable value in struct wsrep_status_var */ | |
| typedef enum wsrep_var_type | |
| { | |
|     WSREP_VAR_STRING, //!< pointer to null-terminated string | |
|     WSREP_VAR_INT64,  //!< int64_t | |
|     WSREP_VAR_DOUBLE  //!< double | |
| } | |
| wsrep_var_type_t; | |
| 
 | |
| /*! Generalized stats variable representation */ | |
| struct wsrep_stats_var | |
| { | |
|     const char*      name;     //!< variable name | |
|     wsrep_var_type_t type;     //!< variable value type | |
|     union { | |
|         int64_t     _int64; | |
|         double      _double; | |
|         const char* _string; | |
|     } value;                   //!< variable value | |
| }; | |
| 
 | |
| 
 | |
| /*! Abstract data buffer structure */ | |
| typedef struct wsrep_buf | |
| { | |
|     const void* ptr; /*!< Pointer to data buffer */ | |
|     size_t      len; /*!< Length of buffer */ | |
| } wsrep_buf_t; | |
| 
 | |
| /*! Key struct used to pass certification keys for transaction handling calls. | |
|  *  A key consists of zero or more key parts. */ | |
| typedef struct wsrep_key | |
| { | |
|     const wsrep_buf_t* key_parts;     /*!< Array of key parts  */ | |
|     size_t             key_parts_num; /*!< Number of key parts */ | |
| } wsrep_key_t; | |
| 
 | |
| /*! Key type: | |
|  *  EXCLUSIVE conflicts with any key type | |
|  *  SEMI      reserved. If not supported, should be interpeted as EXCLUSIVE | |
|  *  SHARED    conflicts only with EXCLUSIVE keys */ | |
| typedef enum wsrep_key_type | |
| { | |
|     WSREP_KEY_SHARED = 0, | |
|     WSREP_KEY_SEMI, | |
|     WSREP_KEY_EXCLUSIVE | |
| } wsrep_key_type_t; | |
| 
 | |
| /*! Data type: | |
|  *  ORDERED    state modification event that should be applied and committed | |
|  *             in order. | |
|  *  UNORDERED  some action that does not modify state and execution of which is | |
|  *             optional and does not need to happen in order. | |
|  *  ANNOTATION (human readable) writeset annotation. */ | |
| typedef enum wsrep_data_type | |
| { | |
|     WSREP_DATA_ORDERED = 0, | |
|     WSREP_DATA_UNORDERED, | |
|     WSREP_DATA_ANNOTATION | |
| } wsrep_data_type_t; | |
| 
 | |
| 
 | |
| /*! Transaction handle struct passed for wsrep transaction handling calls */ | |
| typedef struct wsrep_ws_handle | |
| { | |
|     wsrep_trx_id_t trx_id; //!< transaction ID | |
|     void*          opaque; //!< opaque provider transaction context data | |
| } wsrep_ws_handle_t; | |
| 
 | |
| /*! | |
|  * @brief Helper method to reset trx writeset handle state when trx id changes | |
|  * | |
|  * Instead of passing wsrep_ws_handle_t directly to wsrep calls, | |
|  * wrapping handle with this call offloads bookkeeping from | |
|  * application. | |
|  */ | |
| static inline wsrep_ws_handle_t* wsrep_ws_handle_for_trx( | |
|     wsrep_ws_handle_t* ws_handle, | |
|     wsrep_trx_id_t     trx_id) | |
| { | |
|     if (ws_handle->trx_id != trx_id) | |
|     { | |
|         ws_handle->trx_id = trx_id; | |
|         ws_handle->opaque = NULL; | |
|     } | |
|     return ws_handle; | |
| } | |
| 
 | |
| 
 | |
| /*! | |
|  *  A handle for processing preordered actions. | |
|  *  Must be initialized to WSREP_PO_INITIALIZER before use. | |
|  */ | |
| typedef struct wsrep_po_handle { void* opaque; } wsrep_po_handle_t; | |
| 
 | |
| static const wsrep_po_handle_t WSREP_PO_INITIALIZER = { NULL }; | |
| 
 | |
| 
 | |
| typedef struct wsrep wsrep_t; | |
| /*! | |
|  * wsrep interface for dynamically loadable libraries | |
|  */ | |
| struct wsrep { | |
| 
 | |
|     const char *version; //!< interface version string | |
|  | |
|   /*! | |
|    * @brief Initializes wsrep provider | |
|    * | |
|    * @param wsrep provider handle | |
|    * @param args  wsrep initialization parameters | |
|    */ | |
|     wsrep_status_t (*init)   (wsrep_t*                      wsrep, | |
|                               const struct wsrep_init_args* args); | |
| 
 | |
|   /*! | |
|    * @brief Returns provider capabilities flag bitmap | |
|    * | |
|    * @param wsrep provider handle | |
|    */ | |
|     uint64_t (*capabilities) (wsrep_t* wsrep); | |
| 
 | |
|   /*! | |
|    * @brief Passes provider-specific configuration string to provider. | |
|    * | |
|    * @param wsrep provider handle | |
|    * @param conf  configuration string | |
|    * | |
|    * @retval WSREP_OK      configuration string was parsed successfully | |
|    * @retval WSREP_WARNING could't not parse conf string, no action taken | |
|    */ | |
|     wsrep_status_t (*options_set) (wsrep_t* wsrep, const char* conf); | |
| 
 | |
|   /*! | |
|    * @brief Returns provider-specific string with current configuration values. | |
|    * | |
|    * @param wsrep provider handle | |
|    * | |
|    * @return a dynamically allocated string with current configuration | |
|    *         parameter values | |
|    */ | |
|     char*          (*options_get) (wsrep_t* wsrep); | |
| 
 | |
|   /*! | |
|    * @brief Opens connection to cluster | |
|    * | |
|    * Returns when either node is ready to operate as a part of the clsuter | |
|    * or fails to reach operating status. | |
|    * | |
|    * @param wsrep        provider handle | |
|    * @param cluster_name unique symbolic cluster name | |
|    * @param cluster_url  URL-like cluster address (backend://address) | |
|    * @param state_donor  name of the node to be asked for state transfer. | |
|    * @param bootstrap    a flag to request initialization of a new wsrep | |
|    *                     service rather then a connection to the existing one. | |
|    *                     clister_url may still carry important initialization | |
|    *                     parameters, like backend spec and/or listen address. | |
|    */ | |
|     wsrep_status_t (*connect) (wsrep_t*     wsrep, | |
|                                const char*  cluster_name, | |
|                                const char*  cluster_url, | |
|                                const char*  state_donor, | |
|                                wsrep_bool_t bootstrap); | |
| 
 | |
|   /*! | |
|    * @brief Closes connection to cluster. | |
|    * | |
|    * If state_uuid and/or state_seqno is not NULL, will store final state | |
|    * in there. | |
|    * | |
|    * @param wsrep this  wsrep handler | |
|    */ | |
|     wsrep_status_t (*disconnect)(wsrep_t* wsrep); | |
| 
 | |
|   /*! | |
|    * @brief start receiving replication events | |
|    * | |
|    * This function never returns | |
|    * | |
|    * @param wsrep provider handle | |
|    * @param recv_ctx receiver context | |
|    */ | |
|     wsrep_status_t (*recv)(wsrep_t* wsrep, void* recv_ctx); | |
| 
 | |
|   /*! | |
|    * @brief Replicates/logs result of transaction to other nodes and allocates | |
|    * required resources. | |
|    * | |
|    * Must be called before transaction commit. Returns success code, which | |
|    * caller must check. | |
|    * In case of WSREP_OK, starts commit critical section, transaction can | |
|    * commit. Otherwise transaction must rollback. | |
|    * | |
|    * @param wsrep      provider handle | |
|    * @param ws_handle  writeset of committing transaction | |
|    * @param conn_id    connection ID | |
|    * @param flags      fine tuning the replication WSREP_FLAG_* | |
|    * @param meta       transaction meta data | |
|    * | |
|    * @retval WSREP_OK         cluster-wide commit succeeded | |
|    * @retval WSREP_TRX_FAIL   must rollback transaction | |
|    * @retval WSREP_CONN_FAIL  must close client connection | |
|    * @retval WSREP_NODE_FAIL  must close all connections and reinit | |
|    */ | |
|     wsrep_status_t (*pre_commit)(wsrep_t*                wsrep, | |
|                                  wsrep_conn_id_t         conn_id, | |
|                                  wsrep_ws_handle_t*      ws_handle, | |
|                                  uint32_t                flags, | |
|                                  wsrep_trx_meta_t*       meta); | |
| 
 | |
|   /*! | |
|    * @brief Releases resources after transaction commit. | |
|    * | |
|    * Ends commit critical section. | |
|    * | |
|    * @param wsrep      provider handle | |
|    * @param ws_handle  writeset of committing transaction | |
|    * @retval WSREP_OK  post_commit succeeded | |
|    */ | |
|     wsrep_status_t (*post_commit) (wsrep_t*            wsrep, | |
|                                    wsrep_ws_handle_t*  ws_handle); | |
| 
 | |
|   /*! | |
|    * @brief Releases resources after transaction rollback. | |
|    * | |
|    * @param wsrep      provider handle | |
|    * @param ws_handle  writeset of committing transaction | |
|    * @retval WSREP_OK  post_rollback succeeded | |
|    */ | |
|     wsrep_status_t (*post_rollback)(wsrep_t*            wsrep, | |
|                                     wsrep_ws_handle_t*  ws_handle); | |
| 
 | |
|   /*! | |
|    * @brief Replay trx as a slave writeset | |
|    * | |
|    * If local trx has been aborted by brute force, and it has already | |
|    * replicated before this abort, we must try if we can apply it as | |
|    * slave trx. Note that slave nodes see only trx writesets and certification | |
|    * test based on write set content can be different to DBMS lock conflicts. | |
|    * | |
|    * @param wsrep      provider handle | |
|    * @param ws_handle  writeset of committing transaction | |
|    * @param trx_ctx    transaction context | |
|    * | |
|    * @retval WSREP_OK         cluster commit succeeded | |
|    * @retval WSREP_TRX_FAIL   must rollback transaction | |
|    * @retval WSREP_BF_ABORT   brute force abort happened after trx replicated | |
|    *                          must rollback transaction and try to replay | |
|    * @retval WSREP_CONN_FAIL  must close client connection | |
|    * @retval WSREP_NODE_FAIL  must close all connections and reinit | |
|    */ | |
|     wsrep_status_t (*replay_trx)(wsrep_t*            wsrep, | |
|                                  wsrep_ws_handle_t*  ws_handle, | |
|                                  void*               trx_ctx); | |
| 
 | |
|   /*! | |
|    * @brief Abort pre_commit() call of another thread. | |
|    * | |
|    * It is possible, that some high-priority transaction needs to abort | |
|    * another transaction which is in pre_commit() call waiting for resources. | |
|    * | |
|    * The kill routine checks that abort is not attmpted against a transaction | |
|    * which is front of the caller (in total order). | |
|    * | |
|    * @param wsrep      provider handle | |
|    * @param bf_seqno   seqno of brute force trx, running this cancel | |
|    * @param victim_trx transaction to be aborted, and which is committing | |
|    * | |
|    * @retval WSREP_OK       abort secceded | |
|    * @retval WSREP_WARNING  abort failed | |
|    */ | |
|     wsrep_status_t (*abort_pre_commit)(wsrep_t*       wsrep, | |
|                                        wsrep_seqno_t  bf_seqno, | |
|                                        wsrep_trx_id_t victim_trx); | |
| 
 | |
|   /*! | |
|    * @brief Appends a row reference to transaction writeset | |
|    * | |
|    * Both copy flag and key_type can be ignored by provider (key type | |
|    * interpreted as WSREP_KEY_EXCLUSIVE). | |
|    * | |
|    * @param wsrep      provider handle | |
|    * @param ws_handle  writeset handle | |
|    * @param keys       array of keys | |
|    * @param count      length of the array of keys | |
|    * @param type       type ot the key | |
|    * @param copy       can be set to FALSE if keys persist through commit. | |
|    */ | |
|     wsrep_status_t (*append_key)(wsrep_t*            wsrep, | |
|                                  wsrep_ws_handle_t*  ws_handle, | |
|                                  const wsrep_key_t*  keys, | |
|                                  size_t              count, | |
|                                  enum wsrep_key_type type, | |
|                                  wsrep_bool_t        copy); | |
| 
 | |
|   /*! | |
|    * @brief Appends data to transaction writeset | |
|    * | |
|    * This method can be called any time before commit and it | |
|    * appends a number of data buffers to transaction writeset. | |
|    * | |
|    * Both copy and unordered flags can be ignored by provider. | |
|    * | |
|    * @param wsrep      provider handle | |
|    * @param ws_handle  writeset handle | |
|    * @param data       array of data buffers | |
|    * @param count      buffer count | |
|    * @param type       type of data | |
|    * @param copy       can be set to FALSE if data persists through commit. | |
|    */ | |
|     wsrep_status_t (*append_data)(wsrep_t*                wsrep, | |
|                                   wsrep_ws_handle_t*      ws_handle, | |
|                                   const struct wsrep_buf* data, | |
|                                   size_t                  count, | |
|                                   enum wsrep_data_type    type, | |
|                                   wsrep_bool_t            copy); | |
| 
 | |
|   /*! | |
|    * @brief Get causal ordering for read operation | |
|    * | |
|    * This call will block until causal ordering with all possible | |
|    * preceding writes in the cluster is guaranteed. If pointer to | |
|    * gtid is non-null, the call stores the global transaction ID | |
|    * of the last transaction which is guaranteed to be ordered | |
|    * causally before this call. | |
|    * | |
|    * @param wsrep provider handle | |
|    * @param gtid  location to store GTID | |
|    */ | |
|     wsrep_status_t (*causal_read)(wsrep_t* wsrep, wsrep_gtid_t* gtid); | |
| 
 | |
|   /*! | |
|    * @brief Clears allocated connection context. | |
|    * | |
|    * Whenever a new connection ID is passed to wsrep provider through | |
|    * any of the API calls, a connection context is allocated for this | |
|    * connection. This call is to explicitly notify provider fo connection | |
|    * closing. | |
|    * | |
|    * @param wsrep       provider handle | |
|    * @param conn_id     connection ID | |
|    * @param query       the 'set database' query | |
|    * @param query_len   length of query (does not end with 0) | |
|    */ | |
|     wsrep_status_t (*free_connection)(wsrep_t*        wsrep, | |
|                                       wsrep_conn_id_t conn_id); | |
| 
 | |
|   /*! | |
|    * @brief Replicates a query and starts "total order isolation" section. | |
|    * | |
|    * Replicates the action spec and returns success code, which caller must | |
|    * check. Total order isolation continues until to_execute_end() is called. | |
|    * | |
|    * @param wsrep       provider handle | |
|    * @param conn_id     connection ID | |
|    * @param keys        array of keys | |
|    * @param keys_num    lenght of the array of keys | |
|    * @param action      action buffer array to be executed | |
|    * @param count       action buffer count | |
|    * @param meta        transaction meta data | |
|    * | |
|    * @retval WSREP_OK         cluster commit succeeded | |
|    * @retval WSREP_CONN_FAIL  must close client connection | |
|    * @retval WSREP_NODE_FAIL  must close all connections and reinit | |
|    */ | |
|     wsrep_status_t (*to_execute_start)(wsrep_t*                wsrep, | |
|                                        wsrep_conn_id_t         conn_id, | |
|                                        const wsrep_key_t*      keys, | |
|                                        size_t                  keys_num, | |
|                                        const struct wsrep_buf* action, | |
|                                        size_t                  count, | |
|                                        wsrep_trx_meta_t*       meta); | |
| 
 | |
|   /*! | |
|    * @brief Ends the total order isolation section. | |
|    * | |
|    * Marks the end of total order isolation. TO locks are freed | |
|    * and other transactions are free to commit from this point on. | |
|    * | |
|    * @param wsrep provider handle | |
|    * @param conn_id connection ID | |
|    * | |
|    * @retval WSREP_OK         cluster commit succeeded | |
|    * @retval WSREP_CONN_FAIL  must close client connection | |
|    * @retval WSREP_NODE_FAIL  must close all connections and reinit | |
|    */ | |
|     wsrep_status_t (*to_execute_end)(wsrep_t* wsrep, wsrep_conn_id_t conn_id); | |
| 
 | |
|   /*! | |
|    * @brief Collects preordered replication events into a writeset. | |
|    * | |
|    * @param wsrep   wsrep provider handle | |
|    * @param handle  a handle associated with a given writeset | |
|    * @param data    an array of data buffers. | |
|    * @param count   length of data buffer array. | |
|    * @param copy    whether provider needs to make a copy of events. | |
|    * | |
|    * @retval WSREP_OK         cluster-wide commit succeeded | |
|    * @retval WSREP_TRX_FAIL   operation failed (e.g. trx size exceeded limit) | |
|    * @retval WSREP_NODE_FAIL  must close all connections and reinit | |
|    */ | |
|     wsrep_status_t (*preordered_collect) (wsrep_t*                 wsrep, | |
|                                           wsrep_po_handle_t*       handle, | |
|                                           const struct wsrep_buf*  data, | |
|                                           size_t                   count, | |
|                                           wsrep_bool_t             copy); | |
| 
 | |
|   /*! | |
|    * @brief "Commits" preordered writeset to cluster. | |
|    * | |
|    * The contract is that the writeset will be committed in the same (partial) | |
|    * order this method was called. Frees resources associated with the writeset | |
|    * handle and reinitializes the handle. | |
|    * | |
|    * @param wsrep     wsrep provider handle | |
|    * @param po_handle a handle associated with a given writeset | |
|    * @param source_id ID of the event producer, also serves as the partial order | |
|    *                  or stream ID - events with different source_ids won't be | |
|    *                  ordered with respect to each other. | |
|    * @param flags     WSREP_FLAG_... flags | |
|    * @param pa_range  the number of preceding events this event can be processed | |
|    *                  in parallel with. A value of 0 means strict serial | |
|    *                  processing. Note: commits always happen in wsrep order. | |
|    * @param commit    'true'  to commit writeset to cluster (replicate) or | |
|    *                  'false' to rollback (cancel) the writeset. | |
|    * | |
|    * @retval WSREP_OK         cluster-wide commit succeeded | |
|    * @retval WSREP_TRX_FAIL   operation failed (e.g. NON-PRIMARY component) | |
|    * @retval WSREP_NODE_FAIL  must close all connections and reinit | |
|    */ | |
|     wsrep_status_t (*preordered_commit)  (wsrep_t*             wsrep, | |
|                                           wsrep_po_handle_t*   handle, | |
|                                           const wsrep_uuid_t*  source_id, | |
|                                           uint32_t             flags, | |
|                                           int                  pa_range, | |
|                                           wsrep_bool_t         commit); | |
| 
 | |
|   /*! | |
|    * @brief Signals to wsrep provider that state snapshot has been sent to | |
|    *        joiner. | |
|    * | |
|    * @param wsrep    provider handle | |
|    * @param state_id state ID | |
|    * @param rcode    0 or negative error code of the operation. | |
|    */ | |
|     wsrep_status_t (*sst_sent)(wsrep_t*            wsrep, | |
|                                const wsrep_gtid_t* state_id, | |
|                                int                 rcode); | |
| 
 | |
|   /*! | |
|    * @brief Signals to wsrep provider that new state snapshot has been received. | |
|    *        May deadlock if called from sst_prepare_cb. | |
|    * | |
|    * @param wsrep     provider handle | |
|    * @param state_id  state ID | |
|    * @param state     initial state provided by SST donor | |
|    * @param state_len length of state buffer | |
|    * @param rcode     0 or negative error code of the operation. | |
|    */ | |
|     wsrep_status_t (*sst_received)(wsrep_t*            wsrep, | |
|                                    const wsrep_gtid_t* state_id, | |
|                                    const void*         state, | |
|                                    size_t              state_len, | |
|                                    int                 rcode); | |
| 
 | |
| 
 | |
|   /*! | |
|    * @brief Generate request for consistent snapshot. | |
|    * | |
|    * If successfull, this call will generate internally SST request | |
|    * which in turn triggers calling SST donate callback on the nodes | |
|    * specified in donor_spec. If donor_spec is null, callback is | |
|    * called only locally. This call will block until sst_sent is called | |
|    * from callback. | |
|    * | |
|    * @param wsrep      provider handle | |
|    * @param msg        context message for SST donate callback | |
|    * @param msg_len    length of context message | |
|    * @param donor_spec list of snapshot donors | |
|    */ | |
|     wsrep_status_t (*snapshot)(wsrep_t*    wsrep, | |
|                                const void* msg, | |
|                                size_t      msg_len, | |
|                                const char* donor_spec); | |
| 
 | |
|   /*! | |
|    * @brief Returns an array fo status variables. | |
|    *        Array is terminated by Null variable name. | |
|    * | |
|    * @param wsrep provider handle | |
|    * @return array of struct wsrep_status_var. | |
|    */ | |
|     struct wsrep_stats_var* (*stats_get) (wsrep_t* wsrep); | |
| 
 | |
|   /*! | |
|    * @brief Release resources that might be associated with the array. | |
|    * | |
|    * @param wsrep     provider handle. | |
|    * @param var_array array returned by stats_get(). | |
|    */ | |
|     void (*stats_free) (wsrep_t* wsrep, struct wsrep_stats_var* var_array); | |
| 
 | |
|   /*! | |
|    * @brief Reset some stats variables to inital value, provider-dependent. | |
|    * | |
|    * @param wsrep provider handle. | |
|    */ | |
|     void (*stats_reset) (wsrep_t* wsrep); | |
| 
 | |
|   /*! | |
|    * @brief Pauses writeset applying/committing. | |
|    * | |
|    * @return global sequence number of the paused state or negative error code. | |
|    */ | |
|     wsrep_seqno_t (*pause) (wsrep_t* wsrep); | |
| 
 | |
|   /*! | |
|    * @brief Resumes writeset applying/committing. | |
|    */ | |
|     wsrep_status_t (*resume) (wsrep_t* wsrep); | |
| 
 | |
|   /*! | |
|    * @brief Desynchronize from cluster | |
|    * | |
|    * Effectively turns off flow control for this node, allowing it | |
|    * to fall behind the cluster. | |
|    */ | |
|     wsrep_status_t (*desync) (wsrep_t* wsrep); | |
| 
 | |
|   /*! | |
|    * @brief Request to resynchronize with cluster. | |
|    * | |
|    * Effectively turns on flow control. Asynchronous - actual synchronization | |
|    * event to be deliverred via sync_cb. | |
|    */ | |
|     wsrep_status_t (*resync) (wsrep_t* wsrep); | |
| 
 | |
|   /*! | |
|    * @brief Acquire global named lock | |
|    * | |
|    * @param wsrep  wsrep provider handle | |
|    * @param name   lock name | |
|    * @param shared shared or exclusive lock | |
|    * @param owner  64-bit owner ID | |
|    * @param tout   timeout in nanoseconds. | |
|    *               0 - return immediately, -1 wait forever. | |
|    * @return          wsrep status or negative error code | |
|    * @retval -EDEADLK lock was already acquired by this thread | |
|    * @retval -EBUSY   lock was busy | |
|    */ | |
|     wsrep_status_t (*lock) (wsrep_t* wsrep, | |
|                             const char* name, wsrep_bool_t shared, | |
|                             uint64_t owner, int64_t tout); | |
| 
 | |
|   /*! | |
|    * @brief Release global named lock | |
|    * | |
|    * @param wsrep   wsrep provider handle | |
|    * @param name    lock name | |
|    * @param owner   64-bit owner ID | |
|    * @return        wsrep status or negative error code | |
|    * @retval -EPERM lock does not belong to this owner | |
|    */ | |
|     wsrep_status_t (*unlock) (wsrep_t* wsrep, const char* name, uint64_t owner); | |
| 
 | |
|   /*! | |
|    * @brief Check if global named lock is locked | |
|    * | |
|    * @param wsrep wsrep provider handle | |
|    * @param name  lock name | |
|    * @param owner if not NULL will contain 64-bit owner ID | |
|    * @param node  if not NULL will contain owner's node UUID | |
|    * @return true if lock is locked | |
|    */ | |
|     wsrep_bool_t (*is_locked) (wsrep_t* wsrep, const char* name, uint64_t* conn, | |
|                                wsrep_uuid_t* node); | |
| 
 | |
|   /*! | |
|    * wsrep provider name | |
|    */ | |
|     const char* provider_name; | |
| 
 | |
|   /*! | |
|    * wsrep provider version | |
|    */ | |
|     const char* provider_version; | |
| 
 | |
|   /*! | |
|    * wsrep provider vendor name | |
|    */ | |
|     const char* provider_vendor; | |
| 
 | |
|   /*! | |
|    * @brief Frees allocated resources before unloading the library. | |
|    * @param wsrep provider handle | |
|    */ | |
|     void (*free)(wsrep_t* wsrep); | |
| 
 | |
|     void *dlh;    //!< reserved for future use | |
|     void *ctx;    //!< reserved for implemetation private context | |
| }; | |
| 
 | |
| 
 | |
| /*! | |
|  * | |
|  * @brief Loads wsrep library | |
|  * | |
|  * @param spec   path to wsrep library. If NULL or WSREP_NONE initialises dummy | |
|  *               pass-through implementation. | |
|  * @param hptr   wsrep handle | |
|  * @param log_cb callback to handle loader messages. Otherwise writes to stderr. | |
|  * | |
|  * @return zero on success, errno on failure | |
|  */ | |
| int wsrep_load(const char* spec, wsrep_t** hptr, wsrep_log_cb_t log_cb); | |
| 
 | |
| /*! | |
|  * @brief Unloads wsrep library and frees associated resources | |
|  * | |
|  * @param hptr wsrep handler pointer | |
|  */ | |
| void wsrep_unload(wsrep_t* hptr); | |
| 
 | |
| #ifdef __cplusplus | |
| } | |
| #endif | |
|  | |
| #endif /* WSREP_H */
 |