1
by brian
clean slate |
1 |
/* Copyright (C) 2000-2003 MySQL AB
|
2 |
||
3 |
This program is free software; you can redistribute it and/or modify
|
|
4 |
it under the terms of the GNU General Public License as published by
|
|
5 |
the Free Software Foundation; version 2 of the License.
|
|
6 |
||
7 |
This program is distributed in the hope that it will be useful,
|
|
8 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
9 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
10 |
GNU General Public License for more details.
|
|
11 |
||
12 |
You should have received a copy of the GNU General Public License
|
|
13 |
along with this program; if not, write to the Free Software
|
|
14 |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
15 |
||
16 |
#ifndef SLAVE_H
|
|
17 |
#define SLAVE_H
|
|
18 |
||
19 |
/**
|
|
20 |
@defgroup Replication Replication
|
|
21 |
@{
|
|
22 |
||
23 |
@file
|
|
24 |
*/
|
|
25 |
||
26 |
/**
|
|
27 |
Some of defines are need in parser even though replication is not
|
|
28 |
compiled in (embedded).
|
|
29 |
*/
|
|
30 |
||
31 |
/**
|
|
32 |
The maximum is defined as (ULONG_MAX/1000) with 4 bytes ulong
|
|
33 |
*/
|
|
34 |
#define SLAVE_MAX_HEARTBEAT_PERIOD 4294967
|
|
35 |
||
36 |
#ifdef HAVE_REPLICATION
|
|
37 |
||
38 |
#include "log.h" |
|
39 |
#include "my_list.h" |
|
40 |
#include "rpl_filter.h" |
|
41 |
#include "rpl_tblmap.h" |
|
42 |
||
43 |
#define SLAVE_NET_TIMEOUT 3600
|
|
44 |
||
45 |
#define MAX_SLAVE_ERROR 2000
|
|
46 |
||
47 |
// Forward declarations
|
|
48 |
class Relay_log_info; |
|
49 |
class Master_info; |
|
50 |
||
51 |
||
52 |
/*****************************************************************************
|
|
53 |
||
54 |
MySQL Replication
|
|
55 |
||
56 |
Replication is implemented via two types of threads:
|
|
57 |
||
58 |
I/O Thread - One of these threads is started for each master server.
|
|
59 |
They maintain a connection to their master server, read log
|
|
60 |
events from the master as they arrive, and queues them into
|
|
61 |
a single, shared relay log file. A Master_info
|
|
62 |
represents each of these threads.
|
|
63 |
||
64 |
SQL Thread - One of these threads is started and reads from the relay log
|
|
65 |
file, executing each event. A Relay_log_info
|
|
66 |
represents this thread.
|
|
67 |
||
68 |
Buffering in the relay log file makes it unnecessary to reread events from
|
|
69 |
a master server across a slave restart. It also decouples the slave from
|
|
70 |
the master where long-running updates and event logging are concerned--ie
|
|
71 |
it can continue to log new events while a slow query executes on the slave.
|
|
72 |
||
73 |
*****************************************************************************/
|
|
74 |
||
75 |
/*
|
|
76 |
MUTEXES in replication:
|
|
77 |
||
78 |
LOCK_active_mi: [note: this was originally meant for multimaster, to switch
|
|
79 |
from a master to another, to protect active_mi] It is used to SERIALIZE ALL
|
|
80 |
administrative commands of replication: START SLAVE, STOP SLAVE, CHANGE
|
|
81 |
MASTER, RESET SLAVE, end_slave() (when mysqld stops) [init_slave() does not
|
|
82 |
need it it's called early]. Any of these commands holds the mutex from the
|
|
83 |
start till the end. This thus protects us against a handful of deadlocks
|
|
84 |
(consider start_slave_thread() which, when starting the I/O thread, releases
|
|
85 |
mi->run_lock, keeps rli->run_lock, and tries to re-acquire mi->run_lock).
|
|
86 |
||
87 |
Currently active_mi never moves (it's created at startup and deleted at
|
|
88 |
shutdown, and not changed: it always points to the same Master_info struct),
|
|
89 |
because we don't have multimaster. So for the moment, mi does not move, and
|
|
90 |
mi->rli does not either.
|
|
91 |
||
92 |
In Master_info: run_lock, data_lock
|
|
93 |
run_lock protects all information about the run state: slave_running, thd
|
|
94 |
and the existence of the I/O thread to stop/start it, you need this mutex).
|
|
95 |
data_lock protects some moving members of the struct: counters (log name,
|
|
96 |
position) and relay log (MYSQL_BIN_LOG object).
|
|
97 |
||
98 |
In Relay_log_info: run_lock, data_lock
|
|
99 |
see Master_info
|
|
100 |
|
|
101 |
Order of acquisition: if you want to have LOCK_active_mi and a run_lock, you
|
|
102 |
must acquire LOCK_active_mi first.
|
|
103 |
||
104 |
In MYSQL_BIN_LOG: LOCK_log, LOCK_index of the binlog and the relay log
|
|
105 |
LOCK_log: when you write to it. LOCK_index: when you create/delete a binlog
|
|
106 |
(so that you have to update the .index file).
|
|
107 |
*/
|
|
108 |
||
109 |
extern ulong master_retry_count; |
|
110 |
extern MY_BITMAP slave_error_mask; |
|
111 |
extern bool use_slave_mask; |
|
112 |
extern char *slave_load_tmpdir; |
|
113 |
extern char *master_info_file, *relay_log_info_file; |
|
114 |
extern char *opt_relay_logname, *opt_relaylog_index_name; |
|
115 |
extern my_bool opt_skip_slave_start, opt_reckless_slave; |
|
116 |
extern my_bool opt_log_slave_updates; |
|
117 |
extern ulonglong relay_log_space_limit; |
|
118 |
||
119 |
/*
|
|
120 |
3 possible values for Master_info::slave_running and
|
|
121 |
Relay_log_info::slave_running.
|
|
122 |
The values 0,1,2 are very important: to keep the diff small, I didn't
|
|
123 |
substitute places where we use 0/1 with the newly defined symbols. So don't change
|
|
124 |
these values.
|
|
125 |
The same way, code is assuming that in Relay_log_info we use only values
|
|
126 |
0/1.
|
|
127 |
I started with using an enum, but
|
|
128 |
enum_variable=1; is not legal so would have required many line changes.
|
|
129 |
*/
|
|
130 |
#define MYSQL_SLAVE_NOT_RUN 0
|
|
131 |
#define MYSQL_SLAVE_RUN_NOT_CONNECT 1
|
|
132 |
#define MYSQL_SLAVE_RUN_CONNECT 2
|
|
133 |
||
134 |
#define RPL_LOG_NAME (rli->group_master_log_name[0] ? rli->group_master_log_name :\
|
|
135 |
"FIRST")
|
|
136 |
#define IO_RPL_LOG_NAME (mi->master_log_name[0] ? mi->master_log_name :\
|
|
137 |
"FIRST")
|
|
138 |
||
139 |
/*
|
|
140 |
If the following is set, if first gives an error, second will be
|
|
141 |
tried. Otherwise, if first fails, we fail.
|
|
142 |
*/
|
|
143 |
#define SLAVE_FORCE_ALL 4
|
|
144 |
||
145 |
int init_slave(); |
|
146 |
void init_slave_skip_errors(const char* arg); |
|
147 |
bool flush_relay_log_info(Relay_log_info* rli); |
|
148 |
int register_slave_on_master(MYSQL* mysql); |
|
149 |
int terminate_slave_threads(Master_info* mi, int thread_mask, |
|
150 |
bool skip_lock = 0); |
|
151 |
int start_slave_threads(bool need_slave_mutex, bool wait_for_start, |
|
152 |
Master_info* mi, const char* master_info_fname, |
|
153 |
const char* slave_info_fname, int thread_mask); |
|
154 |
/*
|
|
155 |
cond_lock is usually same as start_lock. It is needed for the case when
|
|
156 |
start_lock is 0 which happens if start_slave_thread() is called already
|
|
157 |
inside the start_lock section, but at the same time we want a
|
|
158 |
pthread_cond_wait() on start_cond,start_lock
|
|
159 |
*/
|
|
160 |
int start_slave_thread(pthread_handler h_func, pthread_mutex_t* start_lock, |
|
161 |
pthread_mutex_t *cond_lock, |
|
162 |
pthread_cond_t* start_cond, |
|
163 |
volatile uint *slave_running, |
|
164 |
volatile ulong *slave_run_id, |
|
165 |
Master_info* mi, |
|
166 |
bool high_priority); |
|
167 |
||
168 |
/* If fd is -1, dump to NET */
|
|
169 |
int mysql_table_dump(THD* thd, const char* db, |
|
170 |
const char* tbl_name, int fd = -1); |
|
171 |
||
172 |
/* retrieve table from master and copy to slave*/
|
|
173 |
int fetch_master_table(THD* thd, const char* db_name, const char* table_name, |
|
174 |
Master_info* mi, MYSQL* mysql, bool overwrite); |
|
175 |
||
176 |
bool show_master_info(THD* thd, Master_info* mi); |
|
177 |
bool show_binlog_info(THD* thd); |
|
178 |
bool rpl_master_has_bug(Relay_log_info *rli, uint bug_id, bool report=TRUE); |
|
179 |
bool rpl_master_erroneous_autoinc(THD* thd); |
|
180 |
||
181 |
const char *print_slave_db_safe(const char *db); |
|
182 |
int check_expected_error(THD* thd, Relay_log_info const *rli, int error_code); |
|
183 |
void skip_load_data_infile(NET* net); |
|
184 |
||
185 |
void end_slave(); /* clean up */ |
|
186 |
void clear_until_condition(Relay_log_info* rli); |
|
187 |
void clear_slave_error(Relay_log_info* rli); |
|
188 |
void end_relay_log_info(Relay_log_info* rli); |
|
189 |
void lock_slave_threads(Master_info* mi); |
|
190 |
void unlock_slave_threads(Master_info* mi); |
|
191 |
void init_thread_mask(int* mask,Master_info* mi,bool inverse); |
|
192 |
int init_relay_log_pos(Relay_log_info* rli,const char* log,ulonglong pos, |
|
193 |
bool need_data_lock, const char** errmsg, |
|
194 |
bool look_for_description_event); |
|
195 |
||
196 |
int purge_relay_logs(Relay_log_info* rli, THD *thd, bool just_reset, |
|
197 |
const char** errmsg); |
|
198 |
void set_slave_thread_options(THD* thd); |
|
199 |
void set_slave_thread_default_charset(THD *thd, Relay_log_info const *rli); |
|
200 |
void rotate_relay_log(Master_info* mi); |
|
201 |
int apply_event_and_update_pos(Log_event* ev, THD* thd, Relay_log_info* rli, |
|
202 |
bool skip); |
|
203 |
||
204 |
pthread_handler_t handle_slave_io(void *arg); |
|
205 |
pthread_handler_t handle_slave_sql(void *arg); |
|
206 |
extern bool volatile abort_loop; |
|
207 |
extern Master_info main_mi, *active_mi; /* active_mi for multi-master */ |
|
208 |
extern LIST master_list; |
|
209 |
extern my_bool replicate_same_server_id; |
|
210 |
||
211 |
extern int disconnect_slave_event_count, abort_slave_event_count ; |
|
212 |
||
213 |
/* the master variables are defaults read from my.cnf or command line */
|
|
214 |
extern uint master_port, master_connect_retry, report_port; |
|
215 |
extern char * master_user, *master_password, *master_host; |
|
216 |
extern char *master_info_file, *relay_log_info_file, *report_user; |
|
217 |
extern char *report_host, *report_password; |
|
218 |
||
219 |
extern my_bool master_ssl; |
|
220 |
extern char *master_ssl_ca, *master_ssl_capath, *master_ssl_cert; |
|
221 |
extern char *master_ssl_cipher, *master_ssl_key; |
|
222 |
||
223 |
extern I_List<THD> threads; |
|
224 |
||
225 |
#endif /* HAVE_REPLICATION */ |
|
226 |
||
227 |
/* masks for start/stop operations on io and sql slave threads */
|
|
228 |
#define SLAVE_IO 1
|
|
229 |
#define SLAVE_SQL 2
|
|
230 |
||
231 |
/**
|
|
232 |
@} (end of group Replication)
|
|
233 |
*/
|
|
234 |
||
235 |
#endif
|