diff options
author | Vasil Dimov <vasil.dimov@galeracluster.com> | 2018-06-15 20:30:42 +0200 |
---|---|---|
committer | Jan Lindström <jan.lindstrom@mariadb.com> | 2018-10-10 13:02:25 +0300 |
commit | 6aa578ec5a4009e33757d91d15947f51c98a5c88 (patch) | |
tree | 591792c87f3d396ce3844cc07c53faad601eb558 /storage | |
parent | bfc9aca1f546490de72497c5289f80a8ae54ee41 (diff) | |
download | mariadb-git-6aa578ec5a4009e33757d91d15947f51c98a5c88.tar.gz |
Generalize "bool shared/exclusive" argument to enum
wsrep_append_foreign_key() and wsrep_append_key() used to take a boolean
argument denoting whether the relevant certification key type is shared
(assuming it is exclusive if the argument is false). Change that
argument to the enum wsrep_key_type from wsrep_api.h, so that eventually
other types can also be passed (like WSREP_KEY_SEMI).
This is a non-functional change.
(cherry picked from commit 360bf36dbb9378b36ef57921c725a9505e19e0d9)
Diffstat (limited to 'storage')
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 69 | ||||
-rw-r--r-- | storage/innobase/handler/ha_innodb.h | 6 | ||||
-rw-r--r-- | storage/innobase/row/row0ins.c | 12 | ||||
-rw-r--r-- | storage/xtradb/handler/ha_innodb.cc | 68 | ||||
-rw-r--r-- | storage/xtradb/handler/ha_innodb.h | 6 | ||||
-rw-r--r-- | storage/xtradb/row/row0ins.c | 14 |
6 files changed, 123 insertions, 52 deletions
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 7aab200fed1..e6689f68704 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -110,6 +110,7 @@ enum_tx_isolation thd_get_trx_isolation(const THD* thd); # endif /* MYSQL_PLUGIN_IMPORT */ #ifdef WITH_WSREP +#include "../../../wsrep/wsrep_api.h" #include <wsrep_mysqld.h> #include <my_md5.h> extern my_bool wsrep_certify_nonPK; @@ -6019,7 +6020,8 @@ report_error: BINLOG_FORMAT_ROW)) { */ - if (wsrep_append_keys(user_thd, false, record, NULL)) { + if (wsrep_append_keys(user_thd, WSREP_KEY_EXCLUSIVE, record, + NULL)) { DBUG_PRINT("wsrep", ("row key failed")); error_result = HA_ERR_INTERNAL_ERROR; goto wsrep_error; @@ -6391,7 +6393,8 @@ ha_innobase::update_row( DBUG_PRINT("wsrep", ("update row key")); - if (wsrep_append_keys(user_thd, false, old_row, new_row)) { + if (wsrep_append_keys(user_thd, WSREP_KEY_EXCLUSIVE, old_row, + new_row)) { DBUG_PRINT("wsrep", ("row key failed")); error = HA_ERR_INTERNAL_ERROR; goto wsrep_error; @@ -6446,7 +6449,8 @@ ha_innobase::delete_row( if (!error && wsrep_thd_exec_mode(user_thd) == LOCAL_STATE && wsrep_on(user_thd)) { - if (wsrep_append_keys(user_thd, false, record, NULL)) { + if (wsrep_append_keys(user_thd, WSREP_KEY_EXCLUSIVE, record, + NULL)) { DBUG_PRINT("wsrep", ("delete fail")); error = HA_ERR_INTERNAL_ERROR; goto wsrep_error; @@ -7259,6 +7263,21 @@ wsrep_dict_foreign_find_index( ibool check_charsets, ulint check_null); +inline +const char* +wsrep_key_type_to_str(wsrep_key_type type) +{ + switch (type) { + case WSREP_KEY_SHARED: + return "shared"; + case WSREP_KEY_SEMI: + return "semi"; + case WSREP_KEY_EXCLUSIVE: + return "exclusive"; + }; + return "unknown"; +} + ulint wsrep_append_foreign_key( /*===========================*/ @@ -7267,7 +7286,8 @@ wsrep_append_foreign_key( const rec_t* rec, /*!<in: clustered index record */ dict_index_t* index, /*!<in: clustered index */ ibool referenced, /*!<in: is check for referenced table */ - ibool shared) /*!<in: is shared access */ + wsrep_key_type key_type) /*!< in: access type of this key + (shared, exclusive, semi...) */ { ut_a(trx); THD* thd = (THD*)trx->mysql_thd; @@ -7363,19 +7383,21 @@ wsrep_append_foreign_key( key[0] = (char)i; rcode = wsrep_rec_get_foreign_key( - &key[1], &len, rec, index, idx, + &key[1], &len, rec, index, idx, wsrep_protocol_version > 1); + if (rcode != DB_SUCCESS) { WSREP_ERROR( - "FK key set failed: %lu (%lu %lu), index: %s %s, %s", - rcode, referenced, shared, + "FK key set failed: %lu (%lu %s), index: %s %s, %s", + rcode, referenced, wsrep_key_type_to_str(key_type), (index && index->name) ? index->name : - "void index", - (index && index->table_name) ? index->table_name : - "void table", + "void index", + (index && index->table_name) ? index->table_name : + "void table", wsrep_thd_query(thd)); return rcode; } + strncpy(cache_key, (wsrep_protocol_version > 1) ? ((referenced) ? @@ -7419,7 +7441,7 @@ wsrep_append_foreign_key( wsrep_ws_handle(thd, trx), &wkey, 1, - shared ? WSREP_KEY_SHARED : WSREP_KEY_EXCLUSIVE, + key_type, copy); if (rcode) { DBUG_PRINT("wsrep", ("row key failed: %lu", rcode)); @@ -7442,15 +7464,16 @@ wsrep_append_key( TABLE *table, const char* key, uint16_t key_len, - bool shared + wsrep_key_type key_type /*!< in: access type of this key + (shared, exclusive, semi...) */ ) { DBUG_ENTER("wsrep_append_key"); bool const copy = true; #ifdef WSREP_DEBUG_PRINT fprintf(stderr, "%s conn %ld, trx %llu, keylen %d, table %s\n Query: %s ", - (shared) ? "Shared" : "Exclusive", - wsrep_thd_thread_id(thd), trx->id, key_len, + wsrep_key_type_to_str(key_type), + wsrep_thd_thread_id(thd), trx->id, key_len, table_share->table_name.str, wsrep_thd_query(thd)); for (int i=0; i<key_len; i++) { fprintf(stderr, "%hhX, ", key[i]); @@ -7476,7 +7499,7 @@ wsrep_append_key( wsrep_ws_handle(thd, trx), &wkey, 1, - shared ? WSREP_KEY_SHARED : WSREP_KEY_EXCLUSIVE, + key_type, copy); if (rcode) { DBUG_PRINT("wsrep", ("row key failed: %d", rcode)); @@ -7492,7 +7515,8 @@ int ha_innobase::wsrep_append_keys( /*==================*/ THD *thd, - bool shared, + wsrep_key_type key_type, /*!< in: access type of this key + (shared, exclusive, semi...) */ const uchar* record0, /* in: row in MySQL format */ const uchar* record1) /* in: row in MySQL format */ { @@ -7523,7 +7547,7 @@ ha_innobase::wsrep_append_keys( if (!is_null) { int rcode = wsrep_append_key( thd, trx, table_share, table, keyval, - len, shared); + len, key_type); if (rcode) DBUG_RETURN(rcode); } else @@ -7579,10 +7603,11 @@ ha_innobase::wsrep_append_keys( if (!is_null) { int rcode = wsrep_append_key( thd, trx, table_share, table, - keyval0, len+1, shared); + keyval0, len+1, key_type); if (rcode) DBUG_RETURN(rcode); - if (key_info->flags & HA_NOSAME || shared) + if (key_info->flags & HA_NOSAME || + key_type == WSREP_KEY_SHARED) key_appended = true; } else @@ -7599,7 +7624,7 @@ ha_innobase::wsrep_append_keys( int rcode = wsrep_append_key( thd, trx, table_share, table, - keyval1, len+1, shared); + keyval1, len+1, key_type); if (rcode) DBUG_RETURN(rcode); } } @@ -7615,7 +7640,7 @@ ha_innobase::wsrep_append_keys( wsrep_calc_row_hash(digest, record0, table, prebuilt, thd); if ((rcode = wsrep_append_key(thd, trx, table_share, table, (const char*) digest, 16, - shared))) { + key_type))) { DBUG_RETURN(rcode); } @@ -7625,7 +7650,7 @@ ha_innobase::wsrep_append_keys( if ((rcode = wsrep_append_key(thd, trx, table_share, table, (const char*) digest, - 16, shared))) { + 16, key_type))) { DBUG_RETURN(rcode); } } diff --git a/storage/innobase/handler/ha_innodb.h b/storage/innobase/handler/ha_innodb.h index f5660b79027..c239a3218b1 100644 --- a/storage/innobase/handler/ha_innodb.h +++ b/storage/innobase/handler/ha_innodb.h @@ -28,6 +28,10 @@ this program; if not, write to the Free Software Foundation, Inc., #pragma interface /* gcc class implementation */ #endif +#ifdef WITH_WSREP +#include "../../../wsrep/wsrep_api.h" +#endif /* WITH_WSREP */ + /* Structure defines translation table between mysql index and innodb index structures */ typedef struct innodb_idx_translate_struct { @@ -115,7 +119,7 @@ class ha_innobase: public handler int info_low(uint flag, bool called_from_analyze); #ifdef WITH_WSREP - int wsrep_append_keys(THD *thd, bool shared, + int wsrep_append_keys(THD *thd, wsrep_key_type key_type, const uchar* record0, const uchar* record1); #endif /* Init values for the class: */ diff --git a/storage/innobase/row/row0ins.c b/storage/innobase/row/row0ins.c index 28cfcc582f3..21e7f1609ff 100644 --- a/storage/innobase/row/row0ins.c +++ b/storage/innobase/row/row0ins.c @@ -56,6 +56,10 @@ Created 4/20/1996 Heikki Tuuri #define ROW_INS_PREV 1 #define ROW_INS_NEXT 2 +#ifdef WITH_WSREP +#include "../../../wsrep/wsrep_api.h" +#endif /* WITH_WSREP */ + /************************************************************************* IMPORTANT NOTE: Any operation that generates redo MUST check that there is enough space in the redo log before for that operation. This is @@ -767,7 +771,7 @@ ulint wsrep_append_foreign_key(trx_t *trx, const rec_t* clust_rec, dict_index_t* clust_index, ibool referenced, - ibool shared); + enum wsrep_key_type key_type); #endif /* WITH_WSREP */ /*********************************************************************//** @@ -1088,7 +1092,7 @@ row_ins_foreign_check_on_constraint( foreign, clust_rec, clust_index, - FALSE, FALSE); + FALSE, WSREP_KEY_EXCLUSIVE); if (err != DB_SUCCESS) { fprintf(stderr, "WSREP: foreign key append failed: %lu\n", err); @@ -1437,7 +1441,9 @@ run_again: rec, check_index, check_ref, - (upd_node) ? TRUE : FALSE); + upd_node != NULL + ? WSREP_KEY_SHARED + : WSREP_KEY_EXCLUSIVE); #endif /* WITH_WSREP */ goto end_scan; } else if (foreign->type != 0) { diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index fca29d50e0a..363f6634c2d 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -127,6 +127,7 @@ extern ib_int64_t trx_sys_mysql_relay_log_pos; # endif /* MYSQL_PLUGIN_IMPORT */ #ifdef WITH_WSREP +#include "../../../wsrep/wsrep_api.h" #include <wsrep_mysqld.h> #include <my_md5.h> extern my_bool wsrep_certify_nonPK; @@ -7043,7 +7044,7 @@ report_error: thd_binlog_format(user_thd) == BINLOG_FORMAT_ROW)) { */ - if (wsrep_append_keys(user_thd, false, record, NULL)) { + if (wsrep_append_keys(user_thd, WSREP_KEY_EXCLUSIVE, record, NULL)) { DBUG_PRINT("wsrep", ("row key failed")); error_result = HA_ERR_INTERNAL_ERROR; goto wsrep_error; @@ -7437,7 +7438,8 @@ ha_innobase::update_row( DBUG_PRINT("wsrep", ("update row key")); - if (wsrep_append_keys(user_thd, false, old_row, new_row)) { + if (wsrep_append_keys(user_thd, WSREP_KEY_EXCLUSIVE, old_row, + new_row)) { DBUG_PRINT("wsrep", ("row key failed")); error = HA_ERR_INTERNAL_ERROR; goto wsrep_error; @@ -7506,7 +7508,8 @@ ha_innobase::delete_row( if (!error && wsrep_thd_exec_mode(user_thd) == LOCAL_STATE && wsrep_on(user_thd)) { - if (wsrep_append_keys(user_thd, false, record, NULL)) { + if (wsrep_append_keys(user_thd, WSREP_KEY_EXCLUSIVE, record, + NULL)) { DBUG_PRINT("wsrep", ("delete fail")); error = HA_ERR_INTERNAL_ERROR; goto wsrep_error; @@ -8366,6 +8369,21 @@ wsrep_dict_foreign_find_index( ibool check_charsets, ulint check_null); +inline +const char* +wsrep_key_type_to_str(wsrep_key_type type) +{ + switch (type) { + case WSREP_KEY_SHARED: + return "shared"; + case WSREP_KEY_SEMI: + return "semi"; + case WSREP_KEY_EXCLUSIVE: + return "exclusive"; + }; + return "unknown"; +} + ulint wsrep_append_foreign_key( /*===========================*/ @@ -8374,7 +8392,8 @@ wsrep_append_foreign_key( const rec_t* rec, /*!<in: clustered index record */ dict_index_t* index, /*!<in: clustered index */ ibool referenced, /*!<in: is check for referenced table */ - ibool shared) /*!<in: is shared access */ + wsrep_key_type key_type) /*!< in: access type of this key + (shared, exclusive, semi...) */ { ut_a(trx); THD* thd = (THD*)trx->mysql_thd; @@ -8470,19 +8489,21 @@ wsrep_append_foreign_key( key[0] = (char)i; rcode = wsrep_rec_get_foreign_key( - &key[1], &len, rec, index, idx, + &key[1], &len, rec, index, idx, wsrep_protocol_version > 1); + if (rcode != DB_SUCCESS) { WSREP_ERROR( - "FK key set failed: %lu (%lu %lu), index: %s %s, %s", - rcode, referenced, shared, + "FK key set failed: %lu (%lu %s), index: %s %s, %s", + rcode, referenced, wsrep_key_type_to_str(key_type), (index && index->name) ? index->name : - "void index", - (index && index->table_name) ? index->table_name : - "void table", + "void index", + (index && index->table_name) ? index->table_name : + "void table", wsrep_thd_query(thd)); return rcode; } + strncpy(cache_key, (wsrep_protocol_version > 1) ? ((referenced) ? @@ -8526,7 +8547,7 @@ wsrep_append_foreign_key( wsrep_ws_handle(thd, trx), &wkey, 1, - shared ? WSREP_KEY_SHARED : WSREP_KEY_EXCLUSIVE, + key_type, copy); if (rcode) { DBUG_PRINT("wsrep", ("row key failed: %lu", rcode)); @@ -8549,15 +8570,16 @@ wsrep_append_key( TABLE *table, const char* key, uint16_t key_len, - bool shared + wsrep_key_type key_type /*!< in: access type of this key + (shared, exclusive, semi...) */ ) { DBUG_ENTER("wsrep_append_key"); bool const copy = true; #ifdef WSREP_DEBUG_PRINT fprintf(stderr, "%s conn %ld, trx %llu, keylen %d, table %s\n Query: %s ", - (shared) ? "Shared" : "Exclusive", - wsrep_thd_thread_id(thd), trx->id, key_len, + wsrep_key_type_to_str(key_type), + wsrep_thd_thread_id(thd), trx->id, key_len, table_share->table_name.str, wsrep_thd_query(thd)); for (int i=0; i<key_len; i++) { fprintf(stderr, "%hhX, ", key[i]); @@ -8583,7 +8605,7 @@ wsrep_append_key( wsrep_ws_handle(thd, trx), &wkey, 1, - shared ? WSREP_KEY_SHARED : WSREP_KEY_EXCLUSIVE, + key_type, copy); if (rcode) { DBUG_PRINT("wsrep", ("row key failed: %d", rcode)); @@ -8599,7 +8621,8 @@ int ha_innobase::wsrep_append_keys( /*==================*/ THD *thd, - bool shared, + wsrep_key_type key_type, /*!< in: access type of this key + (shared, exclusive, semi...) */ const uchar* record0, /* in: row in MySQL format */ const uchar* record1) /* in: row in MySQL format */ { @@ -8630,7 +8653,7 @@ ha_innobase::wsrep_append_keys( if (!is_null) { int rcode = wsrep_append_key( thd, trx, table_share, table, keyval, - len, shared); + len, key_type); if (rcode) DBUG_RETURN(rcode); } else @@ -8686,10 +8709,11 @@ ha_innobase::wsrep_append_keys( if (!is_null) { int rcode = wsrep_append_key( thd, trx, table_share, table, - keyval0, len+1, shared); + keyval0, len+1, key_type); if (rcode) DBUG_RETURN(rcode); - if (key_info->flags & HA_NOSAME || shared) + if (key_info->flags & HA_NOSAME || + key_type == WSREP_KEY_SHARED) key_appended = true; } else @@ -8706,7 +8730,7 @@ ha_innobase::wsrep_append_keys( int rcode = wsrep_append_key( thd, trx, table_share, table, - keyval1, len+1, shared); + keyval1, len+1, key_type); if (rcode) DBUG_RETURN(rcode); } } @@ -8722,7 +8746,7 @@ ha_innobase::wsrep_append_keys( wsrep_calc_row_hash(digest, record0, table, prebuilt, thd); if ((rcode = wsrep_append_key(thd, trx, table_share, table, (const char*) digest, 16, - shared))) { + key_type))) { DBUG_RETURN(rcode); } @@ -8732,7 +8756,7 @@ ha_innobase::wsrep_append_keys( if ((rcode = wsrep_append_key(thd, trx, table_share, table, (const char*) digest, - 16, shared))) { + 16, key_type))) { DBUG_RETURN(rcode); } } diff --git a/storage/xtradb/handler/ha_innodb.h b/storage/xtradb/handler/ha_innodb.h index f087a2d6ea0..4f177fb7a79 100644 --- a/storage/xtradb/handler/ha_innodb.h +++ b/storage/xtradb/handler/ha_innodb.h @@ -28,6 +28,10 @@ this program; if not, write to the Free Software Foundation, Inc., #pragma interface /* gcc class implementation */ #endif +#ifdef WITH_WSREP +#include "../../../wsrep/wsrep_api.h" +#endif /* WITH_WSREP */ + /* Structure defines translation table between mysql index and innodb index structures */ typedef struct innodb_idx_translate_struct { @@ -116,7 +120,7 @@ class ha_innobase: public handler int info_low(uint flag, bool called_from_analyze); #ifdef WITH_WSREP - int wsrep_append_keys(THD *thd, bool shared, + int wsrep_append_keys(THD *thd, wsrep_key_type key_type, const uchar* record0, const uchar* record1); #endif /* Init values for the class: */ diff --git a/storage/xtradb/row/row0ins.c b/storage/xtradb/row/row0ins.c index 6187a1149f8..f0cea9e847d 100644 --- a/storage/xtradb/row/row0ins.c +++ b/storage/xtradb/row/row0ins.c @@ -56,6 +56,10 @@ Created 4/20/1996 Heikki Tuuri #define ROW_INS_PREV 1 #define ROW_INS_NEXT 2 +#ifdef WITH_WSREP +#include "../../../wsrep/wsrep_api.h" +#endif /* WITH_WSREP */ + /************************************************************************* IMPORTANT NOTE: Any operation that generates redo MUST check that there is enough space in the redo log before for that operation. This is @@ -768,7 +772,7 @@ ulint wsrep_append_foreign_key(trx_t *trx, const rec_t* clust_rec, dict_index_t* clust_index, ibool referenced, - ibool shared); + enum wsrep_key_type key_type); #endif /* WITH_WSREP */ /*********************************************************************//** @@ -1090,7 +1094,9 @@ row_ins_foreign_check_on_constraint( clust_rec, clust_index, FALSE, - (node) ? TRUE : FALSE); + node != NULL + ? WSREP_KEY_SHARED + : WSREP_KEY_EXCLUSIVE); if (err != DB_SUCCESS) { fprintf(stderr, "WSREP: foreign key append failed: %lu\n", err); @@ -1445,7 +1451,9 @@ run_again: rec, check_index, check_ref, - (upd_node) ? TRUE : FALSE); + upd_node != NULL + ? WSREP_KEY_SHARED + : WSREP_KEY_EXCLUSIVE); #endif /* WITH_WSREP */ goto end_scan; } else if (foreign->type != 0) { |