13
13
along with this program; if not, write to the Free Software
14
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
16
#include <drizzled/server_includes.h>
18
#if TIME_WITH_SYS_TIME
19
# include <sys/time.h>
23
# include <sys/time.h>
16
#include "mysql_priv.h"
30
18
#include "rpl_mi.h"
31
19
#include "rpl_rli.h"
32
21
#include "sql_repl.h" // For check_binlog_magic
33
22
#include "rpl_utility.h"
35
#include <libdrizzle/gettext.h>
37
static int32_t count_relay_log_space(Relay_log_info* rli);
24
static int count_relay_log_space(Relay_log_info* rli);
39
26
// Defined in slave.cc
40
int32_t init_intvar_from_file(int32_t* var, IO_CACHE* f, int32_t default_val);
41
int32_t init_strvar_from_file(char *var, int32_t max_size, IO_CACHE *f,
27
int init_intvar_from_file(int* var, IO_CACHE* f, int default_val);
28
int init_strvar_from_file(char *var, int max_size, IO_CACHE *f,
42
29
const char *default_val);
61
48
group_relay_log_name[0]= event_relay_log_name[0]=
62
49
group_master_log_name[0]= 0;
63
50
until_log_name[0]= ign_master_log_name_end[0]= 0;
64
memset(&info_file, 0, sizeof(info_file));
65
memset(&cache_buf, 0, sizeof(cache_buf));
51
bzero((char*) &info_file, sizeof(info_file));
52
bzero((char*) &cache_buf, sizeof(cache_buf));
53
cached_charset_invalidate();
66
54
pthread_mutex_init(&run_lock, MY_MUTEX_INIT_FAST);
67
55
pthread_mutex_init(&data_lock, MY_MUTEX_INIT_FAST);
68
56
pthread_mutex_init(&log_space_lock, MY_MUTEX_INIT_FAST);
168
155
/* if file does not exist */
169
156
if (access(fname,F_OK))
171
/* Create a new file */
159
If someone removed the file from underneath our feet, just close
160
the old descriptor and re-create the old file
163
my_close(info_fd, MYF(MY_WME));
164
if ((info_fd = my_open(fname, O_CREAT|O_RDWR|O_BINARY, MYF(MY_WME))) < 0)
166
sql_print_error("Failed to create a new relay log info file (\
167
file '%s', errno %d)", fname, my_errno);
168
msg= current_thd->main_da.message();
171
if (init_io_cache(&rli->info_file, info_fd, IO_SIZE*2, READ_CACHE, 0L,0,
174
sql_print_error("Failed to create a cache on relay log info file '%s'",
176
msg= current_thd->main_da.message();
180
/* Init relay log with first entry in the relay index file */
181
if (init_relay_log_pos(rli,NullS,BIN_LOG_HEADER_SIZE,0 /* no data lock */,
184
sql_print_error("Failed to open the relay log 'FIRST' (relay_log_pos 4)");
187
rli->group_master_log_name[0]= 0;
188
rli->group_master_log_pos= 0;
189
rli->info_fd= info_fd;
173
191
else // file exists
175
/* Open up fname here and pull out the relay.info data */
194
reinit_io_cache(&rli->info_file, READ_CACHE, 0L,0,0);
198
if ((info_fd = my_open(fname, O_RDWR|O_BINARY, MYF(MY_WME))) < 0)
201
Failed to open the existing relay log info file '%s' (errno %d)",
205
else if (init_io_cache(&rli->info_file, info_fd,
206
IO_SIZE*2, READ_CACHE, 0L, 0, MYF(MY_WME)))
208
sql_print_error("Failed to create a cache on relay log info file '%s'",
215
my_close(info_fd, MYF(0));
217
rli->relay_log.close(LOG_CLOSE_INDEX | LOG_CLOSE_STOP_EVENT);
218
pthread_mutex_unlock(&rli->data_lock);
223
rli->info_fd = info_fd;
224
int relay_log_pos, master_log_pos;
225
if (init_strvar_from_file(rli->group_relay_log_name,
226
sizeof(rli->group_relay_log_name),
227
&rli->info_file, "") ||
228
init_intvar_from_file(&relay_log_pos,
229
&rli->info_file, BIN_LOG_HEADER_SIZE) ||
230
init_strvar_from_file(rli->group_master_log_name,
231
sizeof(rli->group_master_log_name),
232
&rli->info_file, "") ||
233
init_intvar_from_file(&master_log_pos, &rli->info_file, 0))
235
msg="Error reading slave log configuration";
238
strmake(rli->event_relay_log_name,rli->group_relay_log_name,
239
sizeof(rli->event_relay_log_name)-1);
240
rli->group_relay_log_pos= rli->event_relay_log_pos= relay_log_pos;
241
rli->group_master_log_pos= master_log_pos;
243
if (init_relay_log_pos(rli,
244
rli->group_relay_log_name,
245
rli->group_relay_log_pos,
250
sql_print_error("Failed to open the relay log '%s' (relay_log_pos %s)",
251
rli->group_relay_log_name,
252
llstr(rli->group_relay_log_pos, llbuf));
256
char llbuf1[22], llbuf2[22];
257
assert(rli->event_relay_log_pos >= BIN_LOG_HEADER_SIZE);
258
assert(my_b_tell(rli->cur_log) == rli->event_relay_log_pos);
179
261
Now change the cache from READ to WRITE - must do this
521
602
handle all possible log names comparisons (e.g. 999 vs 1000).
522
We use uint32_t for string->number conversion ; this is no
603
We use ulong for string->number conversion ; this is no
523
604
stronger limitation than in find_uniq_filename in sql/log.cc
525
uint32_t log_name_extension;
606
ulong log_name_extension;
526
607
char log_name_tmp[FN_REFLEN]; //make a char[] from String
528
strmake(log_name_tmp, log_name->ptr(), cmin(log_name->length(), (uint32_t)FN_REFLEN-1));
609
strmake(log_name_tmp, log_name->ptr(), min(log_name->length(), FN_REFLEN-1));
530
611
char *p= fn_ext(log_name_tmp);
581
662
if the names do not match up to '.' included, return error
583
664
char *q= (char*)(fn_ext(basename)+1);
584
if (strncmp(basename, log_name_tmp, (int32_t)(q-basename)))
665
if (strncmp(basename, log_name_tmp, (int)(q-basename)))
589
670
// Now compare extensions.
591
uint32_t group_master_log_name_extension= strtoul(q, &q_end, 10);
672
ulong group_master_log_name_extension= strtoul(q, &q_end, 10);
592
673
if (group_master_log_name_extension < log_name_extension)
595
676
cmp_result= (group_master_log_name_extension > log_name_extension) ? 1 : 0 ;
597
pos_reached= ((!cmp_result && group_master_log_pos >= (uint64_t)log_pos) ||
678
pos_reached= ((!cmp_result && group_master_log_pos >= (ulonglong)log_pos) ||
599
680
if (pos_reached || thd->killed)
779
861
/* Save name of used relay log file */
780
rli->group_relay_log_name.assign(rli->relay_log.get_log_fname());
781
rli->event_relay_log_name.assign(rli->relay_log.get_log_fname());
862
strmake(rli->group_relay_log_name, rli->relay_log.get_log_fname(),
863
sizeof(rli->group_relay_log_name)-1);
864
strmake(rli->event_relay_log_name, rli->relay_log.get_log_fname(),
865
sizeof(rli->event_relay_log_name)-1);
782
866
rli->group_relay_log_pos= rli->event_relay_log_pos= BIN_LOG_HEADER_SIZE;
783
867
if (count_relay_log_space(rli))
862
946
const char *basename= log_name + dirname_length(log_name);
864
948
const char *q= (const char*)(fn_ext(basename)+1);
865
if (strncmp(basename, until_log_name, (int32_t)(q-basename)) == 0)
949
if (strncmp(basename, until_log_name, (int)(q-basename)) == 0)
867
951
/* Now compare extensions. */
869
uint32_t log_name_extension= strtoul(q, &q_end, 10);
953
ulong log_name_extension= strtoul(q, &q_end, 10);
870
954
if (log_name_extension < until_log_name_extension)
871
955
until_log_names_cmp_result= UNTIL_LOG_NAMES_CMP_LESS;
979
void Relay_log_info::cached_charset_invalidate()
981
/* Full of zeroes means uninitialized. */
982
bzero(cached_charset, sizeof(cached_charset));
987
bool Relay_log_info::cached_charset_compare(char *charset) const
989
if (bcmp((uchar*) cached_charset, (uchar*) charset,
990
sizeof(cached_charset)))
992
memcpy(const_cast<char*>(cached_charset), charset, sizeof(cached_charset));
895
999
void Relay_log_info::stmt_done(my_off_t event_master_log_pos,
896
1000
time_t event_creation_time)
898
extern uint32_t debug_not_change_ts_if_art_event;
1002
extern uint debug_not_change_ts_if_art_event;
899
1003
clear_flag(IN_STMT);