mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-28 17:15:19 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			1118 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1118 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 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 <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 */
 |