1
/* Copyright (C) 2001-2006 MySQL AB & Sasha
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.
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.
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 */
19
All of the functions defined in this file which are not used (the ones to
20
handle failsafe) are not used; their code has not been updated for more
21
than one year now so should be considered as BADLY BROKEN. Do not enable
22
it. The used functions (to handle LOAD DATA FROM MASTER, plus some small
23
functions like register_slave()) are working.
26
#include "mysql_priv.h"
27
#ifdef HAVE_REPLICATION
29
#include "repl_failsafe.h"
33
#include "rpl_filter.h"
34
#include "log_event.h"
36
#define SLAVE_LIST_CHUNK 128
37
#define SLAVE_ERRMSG_SIZE (FN_REFLEN+64)
40
RPL_STATUS rpl_status=RPL_NULL;
41
pthread_mutex_t LOCK_rpl_status;
42
pthread_cond_t COND_rpl_status;
45
const char *rpl_role_type[] = {"MASTER","SLAVE",NullS};
46
TYPELIB rpl_role_typelib = {array_elements(rpl_role_type)-1,"",
49
const char* rpl_status_type[]=
51
"AUTH_MASTER","ACTIVE_SLAVE","IDLE_SLAVE", "LOST_SOLDIER","TROOP_SOLDIER",
52
"RECOVERY_CAPTAIN","NULL",NullS
54
TYPELIB rpl_status_typelib= {array_elements(rpl_status_type)-1,"",
55
rpl_status_type, NULL};
58
void change_rpl_status(RPL_STATUS from_status, RPL_STATUS to_status)
60
pthread_mutex_lock(&LOCK_rpl_status);
61
if (rpl_status == from_status || rpl_status == RPL_ANY)
62
rpl_status = to_status;
63
pthread_cond_signal(&COND_rpl_status);
64
pthread_mutex_unlock(&LOCK_rpl_status);
68
#define get_object(p, obj, msg) \
70
uint len = (uint)*p++; \
71
if (p + len > p_end || len >= sizeof(obj)) \
76
strmake(obj,(char*) p,len); \
81
static inline int cmp_master_pos(Slave_log_event* sev, LEX_MASTER_INFO* mi)
83
return cmp_master_pos(sev->master_log, sev->master_pos, mi->log_file_name,
88
void unregister_slave(THD* thd, bool only_mine, bool need_mutex)
93
pthread_mutex_lock(&LOCK_slave_list);
96
if ((old_si = (SLAVE_INFO*)hash_search(&slave_list,
97
(uchar*)&thd->server_id, 4)) &&
98
(!only_mine || old_si->thd == thd))
99
hash_delete(&slave_list, (uchar*)old_si);
102
pthread_mutex_unlock(&LOCK_slave_list);
108
Register slave in 'slave_list' hash table.
113
1 Error. Error message sent to client
116
int register_slave(THD* thd, uchar* packet, uint packet_length)
120
uchar *p= packet, *p_end= packet + packet_length;
121
const char *errmsg= "Wrong parameters to function register_slave";
123
if (!(si = (SLAVE_INFO*)my_malloc(sizeof(SLAVE_INFO), MYF(MY_WME))))
126
thd->server_id= si->server_id= uint4korr(p);
128
get_object(p,si->host, "Failed to register slave: too long 'report-host'");
129
get_object(p,si->user, "Failed to register slave: too long 'report-user'");
130
get_object(p,si->password, "Failed to register slave; too long 'report-password'");
133
si->port= uint2korr(p);
135
si->rpl_recovery_rank= uint4korr(p);
137
if (!(si->master_id= uint4korr(p)))
138
si->master_id= server_id;
141
pthread_mutex_lock(&LOCK_slave_list);
142
unregister_slave(thd,0,0);
143
res= my_hash_insert(&slave_list, (uchar*) si);
144
pthread_mutex_unlock(&LOCK_slave_list);
148
my_free(si, MYF(MY_WME));
149
my_message(ER_UNKNOWN_ERROR, errmsg, MYF(0)); /* purecov: inspected */
155
*slave_list_key(SLAVE_INFO* si, size_t *len,
156
my_bool not_used __attribute__((unused)))
159
return &si->server_id;
162
extern "C" void slave_info_free(void *s)
164
my_free(s, MYF(MY_WME));
167
void init_slave_list()
169
hash_init(&slave_list, system_charset_info, SLAVE_LIST_CHUNK, 0, 0,
170
(hash_get_key) slave_list_key, (hash_free_key) slave_info_free, 0);
171
pthread_mutex_init(&LOCK_slave_list, MY_MUTEX_INIT_FAST);
174
void end_slave_list()
176
/* No protection by a mutex needed as we are only called at shutdown */
177
if (hash_inited(&slave_list))
179
hash_free(&slave_list);
180
pthread_mutex_destroy(&LOCK_slave_list);
185
bool show_slave_hosts(THD* thd)
187
List<Item> field_list;
188
Protocol *protocol= thd->protocol;
190
field_list.push_back(new Item_return_int("Server_id", 10,
192
field_list.push_back(new Item_empty_string("Host", 20));
193
if (opt_show_slave_auth_info)
195
field_list.push_back(new Item_empty_string("User",20));
196
field_list.push_back(new Item_empty_string("Password",20));
198
field_list.push_back(new Item_return_int("Port", 7, MYSQL_TYPE_LONG));
199
field_list.push_back(new Item_return_int("Rpl_recovery_rank", 7,
201
field_list.push_back(new Item_return_int("Master_id", 10,
204
if (protocol->send_fields(&field_list,
205
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
208
pthread_mutex_lock(&LOCK_slave_list);
210
for (uint i = 0; i < slave_list.records; ++i)
212
SLAVE_INFO* si = (SLAVE_INFO*) hash_element(&slave_list, i);
213
protocol->prepare_for_resend();
214
protocol->store((uint32) si->server_id);
215
protocol->store(si->host, &my_charset_bin);
216
if (opt_show_slave_auth_info)
218
protocol->store(si->user, &my_charset_bin);
219
protocol->store(si->password, &my_charset_bin);
221
protocol->store((uint32) si->port);
222
protocol->store((uint32) si->rpl_recovery_rank);
223
protocol->store((uint32) si->master_id);
224
if (protocol->write())
226
pthread_mutex_unlock(&LOCK_slave_list);
230
pthread_mutex_unlock(&LOCK_slave_list);
235
#endif /* HAVE_REPLICATION */