mariadb/sql/wsrep_applier.h
Alexey Yurchenko 731a5aba0b Use only MySQL code for TOI error vote
For TOI events specifically we have a situation where in case of the
same error different nodes may generate different messages. This may
be for two reasons:
 - different locale setting between the current client session and
   server default (we can reasonably require server locales to be
   identical on all nodes, but user can change message locale for the
   session)
 - non-deterministic course of STATEMENT execution e.g. for ALTER TABLE

On the other hand we may reasonably expect TOI event failures since
they are executed after replication, so we must ensure that voting is
consistent. For that purpose error codes should be sufficiently unique
and deterministic for TOI event failures as DDLs normally deal with
a single object, so we can merely use MySQL error codes to vote on.

Notice that this problem does not happen with regular transactional
writesets, since the originator node will always vote success and
replica nodes are assumed to have the same global locale setting.
As such different error messages indicate different errors even if
the error code is the same (e.g. ER_DUP_KEY can happen on different
rows tables).

Use only MySQL error code (without the error message) for error voting
in case of TOI event failure.

Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
2024-09-01 02:58:27 +02:00

58 lines
2.6 KiB
C++

/* Copyright 2013-2019 Codership Oy <http://www.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-1335 USA */
#ifndef WSREP_APPLIER_H
#define WSREP_APPLIER_H
#include "sql_class.h" // THD class
#include "rpl_rli.h" // Relay_log_info
#include "log_event.h" // Format_description_log_event
int wsrep_apply_events(THD* thd,
Relay_log_info* rli,
const void* events_buf,
size_t buf_len);
/* Applier error codes, when nothing better is available. */
#define WSREP_RET_SUCCESS 0 // Success
#define WSREP_ERR_GENERIC 1 // When in doubt (MySQL default error code)
#define WSREP_ERR_BAD_EVENT 2 // Can't parse event
#define WSREP_ERR_NOT_FOUND 3 // Key. table, schema not found
#define WSREP_ERR_EXISTS 4 // Key, table, schema already exists
#define WSREP_ERR_WRONG_TYPE 5 // Incompatible data type
#define WSREP_ERR_FAILED 6 // Operation failed for some internal reason
#define WSREP_ERR_ABORTED 7 // Operation was aborted externally
/* Loops over THD diagnostic area and concatenates all error messages
* and error codes to a single continuous buffer to create a unique
* but consistent failure signature which provider can use for voting
* between the nodes in the cluster.
*
* @param thd THD context
* @param dst buffer to store the signature
* @param include_msg whether to use MySQL error message in addition to
* MySQL error code. Note that in the case of a TOI
* operation the message may be not consistent between
* the nodes e.g. due to a different client locale setting
* and should be omitted */
void wsrep_store_error(const THD* thd,
wsrep::mutable_buffer& buf,
bool include_msg);
class Format_description_log_event;
void wsrep_set_apply_format(THD*, Format_description_log_event*);
Format_description_log_event* wsrep_get_apply_format(THD* thd);
#endif /* WSREP_APPLIER_H */