1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
|
/* Copyright (C) 2015-2025 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. */
#ifndef WSREP_SCHEMA_H
#define WSREP_SCHEMA_H
/* wsrep-lib */
#include "wsrep_types.h"
#include "mysqld.h"
#include "wsrep_mysqld.h"
/*
Forward decls
*/
class THD;
class Relay_log_info;
struct TABLE;
struct TABLE_LIST;
struct st_mysql_lex_string;
typedef struct st_mysql_lex_string LEX_STRING;
class Gtid_log_event;
/** Name of the table in `wsrep_schema_str` used for storing streaming
replication data. In an InnoDB full format, e.g. "database/tablename". */
extern const char* wsrep_sr_table_name_full;
class Wsrep_schema
{
public:
Wsrep_schema();
~Wsrep_schema();
/*
Initialize wsrep schema. Storage engines must be running before
calling this function.
*/
int init();
/*
Store wsrep view info into wsrep schema.
*/
int store_view(THD*, const Wsrep_view& view);
/*
Restore view info from stable storage.
*/
Wsrep_view restore_view(THD* thd, const Wsrep_id& own_id) const;
/**
Append transaction fragment to fragment storage.
Transaction must have been started for THD before this call.
In order to make changes durable, transaction must be committed
separately after this call.
@param thd THD object
@param server_id Wsrep server identifier
@param transaction_id Transaction identifier
@param flags Flags for the fragment
@param data Fragment data buffer
@return Zero in case of success, non-zero on failure.
*/
int append_fragment(THD* thd,
const wsrep::id& server_id,
wsrep::transaction_id transaction_id,
wsrep::seqno seqno,
int flags,
const wsrep::const_buffer& data);
/**
Update existing fragment meta data. The fragment must have been
inserted before using append_fragment().
@param thd THD object
@param ws_meta Wsrep meta data
@return Zero in case of success, non-zero on failure.
*/
int update_fragment_meta(THD* thd,
const wsrep::ws_meta& ws_meta);
/**
Remove fragments from storage. This method must be called
inside active transaction. Fragment removal will be committed
once the transaction commits.
@param thd Pointer to THD object
@param server_id Identifier of the running server
@param transaction_id Identifier of the current transaction
@param fragments Vector of fragment seqnos to be removed
*/
int remove_fragments(THD* thd,
const wsrep::id& server_id,
wsrep::transaction_id transaction_id,
const std::vector<wsrep::seqno>& fragments);
/**
Replay a transaction from stored fragments. The caller must have
started a transaction for a thd.
@param thd Pointer to THD object
@param ws_meta Write set meta data for commit fragment.
@param fragments Vector of fragments to be replayed
@return Zero on success, non-zero on failure.
*/
int replay_transaction(THD* thd,
Relay_log_info* rli,
const wsrep::ws_meta& ws_meta,
const std::vector<wsrep::seqno>& fragments);
/**
Recover streaming transactions from SR table.
This method should be called after storage enignes are initialized.
It will scan SR table and replay found streaming transactions.
@param orig_thd The THD object of the calling thread.
@return Zero on success, non-zero on failure.
*/
int recover_sr_transactions(THD* orig_thd);
/**
Store GTID-event to mysql.gtid_slave_pos table.
@param thd The THD object of the calling thread.
@param gtid GTID event from binlog.
@return Zero on success, non-zero on failure.
*/
int store_gtid_event(THD* thd, const Gtid_log_event *gtid);
/**
Delete all rows on bootstrap from `wsrep_allowlist` variable
*/
void clear_allowlist();
/**
Store allowlist ip on bootstrap from `wsrep_allowlist` variable
*/
void store_allowlist(std::vector<std::string>& ip_allowlist);
/**
Scan white list table against accepted connection. Allow if ip
is found in table or if table is empty.
@param key Which allowlist column to compare
@param value Value to be checked against allowlist
@return True if found or empty table, false on not found
*/
bool allowlist_check(Wsrep_allowlist_key key, const std::string& val);
private:
/* Non-copyable */
Wsrep_schema(const Wsrep_schema&);
Wsrep_schema& operator=(const Wsrep_schema&);
};
extern Wsrep_schema* wsrep_schema;
extern LEX_CSTRING WSREP_LEX_STREAMING;
extern LEX_CSTRING WSREP_LEX_CLUSTER;
extern LEX_CSTRING WSREP_LEX_MEMBERS;
extern LEX_CSTRING WSREP_LEX_ALLOWLIST;
#endif /* !WSREP_SCHEMA_H */
|