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 |
||
243.1.17
by Jay Pipes
FINAL PHASE removal of mysql_priv.h (Bye, bye my friend.) |
16 |
#ifndef DRIZZLE_SERVER_SLAVE_H
|
17 |
#define DRIZZLE_SERVER_SLAVE_H
|
|
1
by brian
clean slate |
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 |
/**
|
|
130
by Brian Aker
ulong cleanup |
32 |
The maximum is defined as (ULONG_MAX/1000) with 4 bytes uint32_t
|
1
by brian
clean slate |
33 |
*/
|
34 |
#define SLAVE_MAX_HEARTBEAT_PERIOD 4294967
|
|
35 |
||
36 |
#ifdef HAVE_REPLICATION
|
|
37 |
||
38 |
#include "log.h" |
|
212.5.28
by Monty Taylor
Moved my_bit and my_list |
39 |
#include <mysys/my_list.h> |
1
by brian
clean slate |
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,
|
|
319.1.1
by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_ |
96 |
position) and relay log (DRIZZLE_BIN_LOG object).
|
1
by brian
clean slate |
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 |
||
319.1.1
by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_ |
104 |
In DRIZZLE_BIN_LOG: LOCK_log, LOCK_index of the binlog and the relay log
|
1
by brian
clean slate |
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 |
||
130
by Brian Aker
ulong cleanup |
109 |
extern uint32_t master_retry_count; |
1
by brian
clean slate |
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; |
|
150
by Brian Aker
More bool removal. More cow bell! |
115 |
extern bool opt_skip_slave_start; |
116 |
extern bool opt_reckless_slave; |
|
117 |
extern bool opt_log_slave_updates; |
|
130
by Brian Aker
ulong cleanup |
118 |
extern uint64_t relay_log_space_limit; |
1
by brian
clean slate |
119 |
|
120 |
/*
|
|
121 |
3 possible values for Master_info::slave_running and
|
|
122 |
Relay_log_info::slave_running.
|
|
123 |
The values 0,1,2 are very important: to keep the diff small, I didn't
|
|
124 |
substitute places where we use 0/1 with the newly defined symbols. So don't change
|
|
125 |
these values.
|
|
126 |
The same way, code is assuming that in Relay_log_info we use only values
|
|
127 |
0/1.
|
|
128 |
I started with using an enum, but
|
|
129 |
enum_variable=1; is not legal so would have required many line changes.
|
|
130 |
*/
|
|
319.1.1
by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_ |
131 |
#define DRIZZLE_SLAVE_NOT_RUN 0
|
132 |
#define DRIZZLE_SLAVE_RUN_NOT_CONNECT 1
|
|
133 |
#define DRIZZLE_SLAVE_RUN_CONNECT 2
|
|
1
by brian
clean slate |
134 |
|
135 |
#define RPL_LOG_NAME (rli->group_master_log_name[0] ? rli->group_master_log_name :\
|
|
136 |
"FIRST")
|
|
137 |
#define IO_RPL_LOG_NAME (mi->master_log_name[0] ? mi->master_log_name :\
|
|
138 |
"FIRST")
|
|
139 |
||
140 |
/*
|
|
141 |
If the following is set, if first gives an error, second will be
|
|
142 |
tried. Otherwise, if first fails, we fail.
|
|
143 |
*/
|
|
144 |
#define SLAVE_FORCE_ALL 4
|
|
145 |
||
130
by Brian Aker
ulong cleanup |
146 |
int32_t init_slave(); |
1
by brian
clean slate |
147 |
void init_slave_skip_errors(const char* arg); |
148 |
bool flush_relay_log_info(Relay_log_info* rli); |
|
206.3.1
by Patrick Galbraith
Most everything working with client rename |
149 |
int32_t register_slave_on_master(DRIZZLE *drizzle); |
130
by Brian Aker
ulong cleanup |
150 |
int32_t terminate_slave_threads(Master_info* mi, int32_t thread_mask, |
1
by brian
clean slate |
151 |
bool skip_lock = 0); |
130
by Brian Aker
ulong cleanup |
152 |
int32_t start_slave_threads(bool need_slave_mutex, bool wait_for_start, |
1
by brian
clean slate |
153 |
Master_info* mi, const char* master_info_fname, |
130
by Brian Aker
ulong cleanup |
154 |
const char* slave_info_fname, int32_t thread_mask); |
1
by brian
clean slate |
155 |
/*
|
156 |
cond_lock is usually same as start_lock. It is needed for the case when
|
|
157 |
start_lock is 0 which happens if start_slave_thread() is called already
|
|
158 |
inside the start_lock section, but at the same time we want a
|
|
159 |
pthread_cond_wait() on start_cond,start_lock
|
|
160 |
*/
|
|
130
by Brian Aker
ulong cleanup |
161 |
int32_t start_slave_thread(pthread_handler h_func, pthread_mutex_t* start_lock, |
1
by brian
clean slate |
162 |
pthread_mutex_t *cond_lock, |
163 |
pthread_cond_t* start_cond, |
|
130
by Brian Aker
ulong cleanup |
164 |
volatile uint32_t *slave_running, |
165 |
volatile uint32_t *slave_run_id, |
|
1
by brian
clean slate |
166 |
Master_info* mi, |
167 |
bool high_priority); |
|
168 |
||
169 |
/* If fd is -1, dump to NET */
|
|
130
by Brian Aker
ulong cleanup |
170 |
int32_t mysql_table_dump(THD* thd, const char* db, |
171 |
const char* tbl_name, int32_t fd = -1); |
|
1
by brian
clean slate |
172 |
|
173 |
/* retrieve table from master and copy to slave*/
|
|
130
by Brian Aker
ulong cleanup |
174 |
int32_t fetch_master_table(THD* thd, const char* db_name, const char* table_name, |
206.3.1
by Patrick Galbraith
Most everything working with client rename |
175 |
Master_info* mi, DRIZZLE *drizzle, bool overwrite); |
1
by brian
clean slate |
176 |
|
177 |
bool show_master_info(THD* thd, Master_info* mi); |
|
178 |
bool show_binlog_info(THD* thd); |
|
130
by Brian Aker
ulong cleanup |
179 |
bool rpl_master_has_bug(Relay_log_info *rli, uint32_t bug_id, bool report= true); |
1
by brian
clean slate |
180 |
bool rpl_master_erroneous_autoinc(THD* thd); |
181 |
||
182 |
const char *print_slave_db_safe(const char *db); |
|
130
by Brian Aker
ulong cleanup |
183 |
int32_t check_expected_error(THD* thd, Relay_log_info const *rli, int32_t error_code); |
1
by brian
clean slate |
184 |
void skip_load_data_infile(NET* net); |
185 |
||
186 |
void end_slave(); /* clean up */ |
|
187 |
void clear_until_condition(Relay_log_info* rli); |
|
188 |
void clear_slave_error(Relay_log_info* rli); |
|
189 |
void end_relay_log_info(Relay_log_info* rli); |
|
190 |
void lock_slave_threads(Master_info* mi); |
|
191 |
void unlock_slave_threads(Master_info* mi); |
|
130
by Brian Aker
ulong cleanup |
192 |
void init_thread_mask(int32_t* mask,Master_info* mi,bool inverse); |
193 |
int32_t init_relay_log_pos(Relay_log_info* rli,const char* log,uint64_t pos, |
|
1
by brian
clean slate |
194 |
bool need_data_lock, const char** errmsg, |
195 |
bool look_for_description_event); |
|
196 |
||
130
by Brian Aker
ulong cleanup |
197 |
int32_t purge_relay_logs(Relay_log_info* rli, THD *thd, bool just_reset, |
1
by brian
clean slate |
198 |
const char** errmsg); |
199 |
void set_slave_thread_options(THD* thd); |
|
200 |
void set_slave_thread_default_charset(THD *thd, Relay_log_info const *rli); |
|
201 |
void rotate_relay_log(Master_info* mi); |
|
130
by Brian Aker
ulong cleanup |
202 |
int32_t apply_event_and_update_pos(Log_event* ev, THD* thd, Relay_log_info* rli, |
1
by brian
clean slate |
203 |
bool skip); |
204 |
||
205 |
pthread_handler_t handle_slave_io(void *arg); |
|
206 |
pthread_handler_t handle_slave_sql(void *arg); |
|
207 |
extern bool volatile abort_loop; |
|
208 |
extern Master_info main_mi, *active_mi; /* active_mi for multi-master */ |
|
209 |
extern LIST master_list; |
|
197
by Brian Aker
More my_bool cleanup. |
210 |
extern bool replicate_same_server_id; |
1
by brian
clean slate |
211 |
|
130
by Brian Aker
ulong cleanup |
212 |
extern int32_t disconnect_slave_event_count, abort_slave_event_count ; |
1
by brian
clean slate |
213 |
|
214 |
/* the master variables are defaults read from my.cnf or command line */
|
|
130
by Brian Aker
ulong cleanup |
215 |
extern uint32_t master_port, master_connect_retry, report_port; |
1
by brian
clean slate |
216 |
extern char * master_user, *master_password, *master_host; |
217 |
extern char *master_info_file, *relay_log_info_file, *report_user; |
|
218 |
extern char *report_host, *report_password; |
|
219 |
||
197
by Brian Aker
More my_bool cleanup. |
220 |
extern bool master_ssl; |
1
by brian
clean slate |
221 |
extern char *master_ssl_ca, *master_ssl_capath, *master_ssl_cert; |
222 |
extern char *master_ssl_cipher, *master_ssl_key; |
|
223 |
||
224 |
extern I_List<THD> threads; |
|
225 |
||
226 |
#endif /* HAVE_REPLICATION */ |
|
227 |
||
228 |
/* masks for start/stop operations on io and sql slave threads */
|
|
229 |
#define SLAVE_IO 1
|
|
230 |
#define SLAVE_SQL 2
|
|
231 |
||
232 |
/**
|
|
233 |
@} (end of group Replication)
|
|
234 |
*/
|
|
235 |
||
243.1.17
by Jay Pipes
FINAL PHASE removal of mysql_priv.h (Bye, bye my friend.) |
236 |
#endif /* DRIZZLE_SERVER_SLAVE_H */ |