| 1 | #ifndef MYSQL_SERVICE_WSREP_INCLUDED |
| 2 | /* Copyright (c) 2015 MariaDB Corporation Ab |
| 3 | |
| 4 | This program is free software; you can redistribute it and/or modify |
| 5 | it under the terms of the GNU General Public License as published by |
| 6 | the Free Software Foundation; version 2 of the License. |
| 7 | |
| 8 | This program is distributed in the hope that it will be useful, |
| 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 11 | GNU General Public License for more details. |
| 12 | |
| 13 | You should have received a copy of the GNU General Public License |
| 14 | along with this program; if not, write to the Free Software |
| 15 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ |
| 16 | |
| 17 | /** |
| 18 | @file |
| 19 | wsrep service |
| 20 | |
| 21 | Interface to WSREP functionality in the server. |
| 22 | For engines that want to support galera. |
| 23 | */ |
| 24 | |
| 25 | #ifdef __cplusplus |
| 26 | extern "C" { |
| 27 | #endif |
| 28 | |
| 29 | enum wsrep_conflict_state { |
| 30 | NO_CONFLICT, |
| 31 | MUST_ABORT, |
| 32 | ABORTING, |
| 33 | ABORTED, |
| 34 | MUST_REPLAY, |
| 35 | REPLAYING, |
| 36 | RETRY_AUTOCOMMIT, |
| 37 | CERT_FAILURE, |
| 38 | }; |
| 39 | |
| 40 | enum wsrep_exec_mode { |
| 41 | /* Transaction processing before replication. */ |
| 42 | LOCAL_STATE, |
| 43 | /* Slave thread applying write sets from other nodes or replaying thread. */ |
| 44 | REPL_RECV, |
| 45 | /* Total-order-isolation mode. */ |
| 46 | TOTAL_ORDER, |
| 47 | /* |
| 48 | Transaction procession after it has been replicated in prepare stage and |
| 49 | has passed certification. |
| 50 | */ |
| 51 | LOCAL_COMMIT |
| 52 | }; |
| 53 | |
| 54 | enum wsrep_query_state { |
| 55 | QUERY_IDLE, |
| 56 | QUERY_EXEC, |
| 57 | QUERY_COMMITTING, |
| 58 | QUERY_EXITING, |
| 59 | QUERY_ROLLINGBACK, |
| 60 | }; |
| 61 | |
| 62 | enum wsrep_trx_status { |
| 63 | WSREP_TRX_OK, |
| 64 | WSREP_TRX_CERT_FAIL, /* certification failure, must abort */ |
| 65 | WSREP_TRX_SIZE_EXCEEDED, /* trx size exceeded */ |
| 66 | WSREP_TRX_ERROR, /* native mysql error */ |
| 67 | }; |
| 68 | |
| 69 | struct xid_t; |
| 70 | struct wsrep; |
| 71 | struct wsrep_ws_handle; |
| 72 | struct wsrep_buf; |
| 73 | |
| 74 | extern struct wsrep_service_st { |
| 75 | struct wsrep * (*get_wsrep_func)(); |
| 76 | my_bool (*get_wsrep_certify_nonPK_func)(); |
| 77 | my_bool (*get_wsrep_debug_func)(); |
| 78 | my_bool (*get_wsrep_drupal_282555_workaround_func)(); |
| 79 | my_bool (*get_wsrep_recovery_func)(); |
| 80 | my_bool (*get_wsrep_load_data_splitting_func)(); |
| 81 | my_bool (*get_wsrep_log_conflicts_func)(); |
| 82 | long (*get_wsrep_protocol_version_func)(); |
| 83 | my_bool (*wsrep_aborting_thd_contains_func)(THD *thd); |
| 84 | void (*wsrep_aborting_thd_enqueue_func)(THD *thd); |
| 85 | bool (*wsrep_consistency_check_func)(THD *thd); |
| 86 | int (*wsrep_is_wsrep_xid_func)(const struct xid_t *xid); |
| 87 | long long (*wsrep_xid_seqno_func)(const struct xid_t *xid); |
| 88 | const unsigned char* (*wsrep_xid_uuid_func)(const struct xid_t *xid); |
| 89 | void (*wsrep_lock_rollback_func)(); |
| 90 | int (*wsrep_on_func)(MYSQL_THD); |
| 91 | void (*wsrep_post_commit_func)(THD* thd, bool all); |
| 92 | bool (*wsrep_prepare_key_func)(const unsigned char*, size_t, const unsigned char*, size_t, struct wsrep_buf*, size_t*); |
| 93 | enum wsrep_trx_status (*wsrep_run_wsrep_commit_func)(THD *thd, bool all); |
| 94 | void (*wsrep_thd_LOCK_func)(THD *thd); |
| 95 | void (*wsrep_thd_UNLOCK_func)(THD *thd); |
| 96 | void (*wsrep_thd_awake_func)(THD *thd, my_bool signal); |
| 97 | enum wsrep_conflict_state (*wsrep_thd_conflict_state_func)(MYSQL_THD, my_bool); |
| 98 | const char * (*wsrep_thd_conflict_state_str_func)(THD *thd); |
| 99 | enum wsrep_exec_mode (*wsrep_thd_exec_mode_func)(THD *thd); |
| 100 | const char * (*wsrep_thd_exec_mode_str_func)(THD *thd); |
| 101 | enum wsrep_conflict_state (*wsrep_thd_get_conflict_state_func)(MYSQL_THD); |
| 102 | my_bool (*wsrep_thd_is_BF_func)(MYSQL_THD , my_bool); |
| 103 | my_bool (*wsrep_thd_is_wsrep_func)(MYSQL_THD thd); |
| 104 | char * (*wsrep_thd_query_func)(THD *thd); |
| 105 | enum wsrep_query_state (*wsrep_thd_query_state_func)(THD *thd); |
| 106 | const char * (*wsrep_thd_query_state_str_func)(THD *thd); |
| 107 | int (*wsrep_thd_retry_counter_func)(THD *thd); |
| 108 | void (*wsrep_thd_set_conflict_state_func)(THD *thd, enum wsrep_conflict_state state); |
| 109 | bool (*wsrep_thd_ignore_table_func)(THD *thd); |
| 110 | long long (*wsrep_thd_trx_seqno_func)(THD *thd); |
| 111 | struct wsrep_ws_handle * (*wsrep_thd_ws_handle_func)(THD *thd); |
| 112 | int (*wsrep_trx_is_aborting_func)(MYSQL_THD thd); |
| 113 | int (*wsrep_trx_order_before_func)(MYSQL_THD, MYSQL_THD); |
| 114 | void (*wsrep_unlock_rollback_func)(); |
| 115 | } *wsrep_service; |
| 116 | |
| 117 | #ifdef MYSQL_DYNAMIC_PLUGIN |
| 118 | #define get_wsrep() wsrep_service->get_wsrep_func() |
| 119 | #define get_wsrep_certify_nonPK() wsrep_service->get_wsrep_certify_nonPK_func() |
| 120 | #define get_wsrep_debug() wsrep_service->get_wsrep_debug_func() |
| 121 | #define get_wsrep_drupal_282555_workaround() wsrep_service->get_wsrep_drupal_282555_workaround_func() |
| 122 | #define get_wsrep_recovery() wsrep_service->get_wsrep_recovery_func() |
| 123 | #define get_wsrep_load_data_splitting() wsrep_service->get_wsrep_load_data_splitting_func() |
| 124 | #define get_wsrep_log_conflicts() wsrep_service->get_wsrep_log_conflicts_func() |
| 125 | #define get_wsrep_protocol_version() wsrep_service->get_wsrep_protocol_version_func() |
| 126 | #define wsrep_aborting_thd_contains(T) wsrep_service->wsrep_aborting_thd_contains_func(T) |
| 127 | #define wsrep_aborting_thd_enqueue(T) wsrep_service->wsrep_aborting_thd_enqueue_func(T) |
| 128 | #define wsrep_consistency_check(T) wsrep_service->wsrep_consistency_check_func(T) |
| 129 | #define wsrep_is_wsrep_xid(X) wsrep_service->wsrep_is_wsrep_xid_func(X) |
| 130 | #define wsrep_xid_seqno(X) wsrep_service->wsrep_xid_seqno_func(X) |
| 131 | #define wsrep_xid_uuid(X) wsrep_service->wsrep_xid_uuid_func(X) |
| 132 | #define wsrep_lock_rollback() wsrep_service->wsrep_lock_rollback_func() |
| 133 | #define wsrep_on(X) wsrep_service->wsrep_on_func(X) |
| 134 | #define wsrep_post_commit(T,A) wsrep_service->wsrep_post_commit_func(T,A) |
| 135 | #define wsrep_prepare_key(A,B,C,D,E,F) wsrep_service->wsrep_prepare_key_func(A,B,C,D,E,F) |
| 136 | #define wsrep_run_wsrep_commit(T,A) wsrep_service->wsrep_run_wsrep_commit_func(T,A) |
| 137 | #define wsrep_thd_LOCK(T) wsrep_service->wsrep_thd_LOCK_func(T) |
| 138 | #define wsrep_thd_UNLOCK(T) wsrep_service->wsrep_thd_UNLOCK_func(T) |
| 139 | #define wsrep_thd_awake(T,S) wsrep_service->wsrep_thd_awake_func(T,S) |
| 140 | #define wsrep_thd_conflict_state(T,S) wsrep_service->wsrep_thd_conflict_state_func(T,S) |
| 141 | #define wsrep_thd_conflict_state_str(T) wsrep_service->wsrep_thd_conflict_state_str_func(T) |
| 142 | #define wsrep_thd_exec_mode(T) wsrep_service->wsrep_thd_exec_mode_func(T) |
| 143 | #define wsrep_thd_exec_mode_str(T) wsrep_service->wsrep_thd_exec_mode_str_func(T) |
| 144 | #define wsrep_thd_get_conflict_state(T) wsrep_service->wsrep_thd_get_conflict_state_func(T) |
| 145 | #define wsrep_thd_is_BF(T,S) wsrep_service->wsrep_thd_is_BF_func(T,S) |
| 146 | #define wsrep_thd_is_wsrep(T) wsrep_service->wsrep_thd_is_wsrep_func(T) |
| 147 | #define wsrep_thd_query(T) wsrep_service->wsrep_thd_query_func(T) |
| 148 | #define wsrep_thd_query_state(T) wsrep_service->wsrep_thd_query_state_func(T) |
| 149 | #define wsrep_thd_query_state_str(T) wsrep_service->wsrep_thd_query_state_str_func(T) |
| 150 | #define wsrep_thd_retry_counter(T) wsrep_service->wsrep_thd_retry_counter_func(T) |
| 151 | #define wsrep_thd_set_conflict_state(T,S) wsrep_service->wsrep_thd_set_conflict_state_func(T,S) |
| 152 | #define wsrep_thd_ignore_table(T) wsrep_service->wsrep_thd_ignore_table_func(T) |
| 153 | #define wsrep_thd_trx_seqno(T) wsrep_service->wsrep_thd_trx_seqno_func(T) |
| 154 | #define wsrep_thd_ws_handle(T) wsrep_service->wsrep_thd_ws_handle_func(T) |
| 155 | #define wsrep_trx_is_aborting(T) wsrep_service->wsrep_trx_is_aborting_func(T) |
| 156 | #define wsrep_trx_order_before(T1,T2) wsrep_service->wsrep_trx_order_before_func(T1,T2) |
| 157 | #define wsrep_unlock_rollback() wsrep_service->wsrep_unlock_rollback_func() |
| 158 | |
| 159 | #define wsrep_debug get_wsrep_debug() |
| 160 | #define wsrep_log_conflicts get_wsrep_log_conflicts() |
| 161 | #define wsrep_certify_nonPK get_wsrep_certify_nonPK() |
| 162 | #define wsrep_load_data_splitting get_wsrep_load_data_splitting() |
| 163 | #define wsrep_drupal_282555_workaround get_wsrep_drupal_282555_workaround() |
| 164 | #define wsrep_recovery get_wsrep_recovery() |
| 165 | #define wsrep_protocol_version get_wsrep_protocol_version() |
| 166 | |
| 167 | #else |
| 168 | |
| 169 | extern my_bool wsrep_debug; |
| 170 | extern my_bool wsrep_log_conflicts; |
| 171 | extern my_bool wsrep_certify_nonPK; |
| 172 | extern my_bool wsrep_load_data_splitting; |
| 173 | extern my_bool wsrep_drupal_282555_workaround; |
| 174 | extern my_bool wsrep_recovery; |
| 175 | extern long wsrep_protocol_version; |
| 176 | |
| 177 | bool wsrep_consistency_check(THD *thd); |
| 178 | bool wsrep_prepare_key(const unsigned char* cache_key, size_t cache_key_len, const unsigned char* row_id, size_t row_id_len, struct wsrep_buf* key, size_t* key_len); |
| 179 | char *wsrep_thd_query(THD *thd); |
| 180 | const char *wsrep_thd_conflict_state_str(THD *thd); |
| 181 | const char *wsrep_thd_exec_mode_str(THD *thd); |
| 182 | const char *wsrep_thd_query_state_str(THD *thd); |
| 183 | enum wsrep_conflict_state wsrep_thd_conflict_state(MYSQL_THD thd, my_bool sync); |
| 184 | enum wsrep_conflict_state wsrep_thd_get_conflict_state(MYSQL_THD thd); |
| 185 | enum wsrep_exec_mode wsrep_thd_exec_mode(THD *thd); |
| 186 | enum wsrep_query_state wsrep_thd_query_state(THD *thd); |
| 187 | enum wsrep_trx_status wsrep_run_wsrep_commit(THD *thd, bool all); |
| 188 | int wsrep_is_wsrep_xid(const struct xid_t* xid); |
| 189 | long long wsrep_xid_seqno(const struct xid_t* xid); |
| 190 | const unsigned char* wsrep_xid_uuid(const struct xid_t* xid); |
| 191 | int wsrep_on(MYSQL_THD thd); |
| 192 | int wsrep_thd_retry_counter(THD *thd); |
| 193 | int wsrep_trx_is_aborting(MYSQL_THD thd); |
| 194 | int wsrep_trx_order_before(MYSQL_THD thd1, MYSQL_THD thd2); |
| 195 | long get_wsrep_protocol_version(); |
| 196 | long long wsrep_thd_trx_seqno(THD *thd); |
| 197 | my_bool get_wsrep_certify_nonPK(); |
| 198 | my_bool get_wsrep_debug(); |
| 199 | my_bool get_wsrep_drupal_282555_workaround(); |
| 200 | my_bool get_wsrep_recovery(); |
| 201 | my_bool get_wsrep_load_data_splitting(); |
| 202 | my_bool get_wsrep_log_conflicts(); |
| 203 | my_bool wsrep_aborting_thd_contains(THD *thd); |
| 204 | my_bool wsrep_thd_is_BF(MYSQL_THD thd, my_bool sync); |
| 205 | my_bool wsrep_thd_is_wsrep(MYSQL_THD thd); |
| 206 | struct wsrep *get_wsrep(); |
| 207 | struct wsrep_ws_handle *wsrep_thd_ws_handle(THD *thd); |
| 208 | void wsrep_aborting_thd_enqueue(THD *thd); |
| 209 | void wsrep_lock_rollback(); |
| 210 | void wsrep_post_commit(THD* thd, bool all); |
| 211 | void wsrep_thd_LOCK(THD *thd); |
| 212 | void wsrep_thd_UNLOCK(THD *thd); |
| 213 | void wsrep_thd_awake(THD *thd, my_bool signal); |
| 214 | void wsrep_thd_set_conflict_state(THD *thd, enum wsrep_conflict_state state); |
| 215 | bool wsrep_thd_ignore_table(THD *thd); |
| 216 | void wsrep_unlock_rollback(); |
| 217 | |
| 218 | #endif |
| 219 | |
| 220 | #ifdef __cplusplus |
| 221 | } |
| 222 | #endif |
| 223 | |
| 224 | #define MYSQL_SERVICE_WSREP_INCLUDED |
| 225 | #endif |
| 226 | |
| 227 | |