Use my_b_append instead of my_b_write on a SEQ_READ_APPEND cache, when we write
the first 4 bytes of the relay log. Indeed comments in mysys/mf_iocache.c say we must always use my_b_append for such a cache. This *could* avoid a very rare assertion failure which is: 030524 19:32:38 Slave SQL thread initialized, starting replication in log 'FIRST' at position 0, relay log '/ users/gbichot/4.1.1/mysql-test/var/log/slave-relay-bin.000001' position: 4 030524 19:32:38 next log '/users/gbichot/4.1.1/mysql-test/var/log/slave-relay-bin.000002' is currently active mysqld: mf_iocache.c:701: _my_b_seq_read: Assertion `pos_in_file == info->end_of_file' failed. and which seemed to happen always when the SQL thread and/or the I/O thread were at position 4 in a relay log. include/my_sys.h: moving a function from log_event.cc so that it can be widely used mysys/mf_iocache.c: moving a function from log_event.cc so that it can be widely used sql/log.cc: my_b_write should not be used on a SEQ_READ_APPEND cache, one should use my_b_append (otherwise there could be some locking problems). sql/log_event.cc: moved to mysys/mf_iocache.c for wider use. A typo.
This commit is contained in:
parent
fe0e546434
commit
d43a347db1
@ -677,6 +677,8 @@ extern int _my_b_get(IO_CACHE *info);
|
||||
extern int _my_b_async_read(IO_CACHE *info,byte *Buffer,uint Count);
|
||||
extern int _my_b_write(IO_CACHE *info,const byte *Buffer,uint Count);
|
||||
extern int my_b_append(IO_CACHE *info,const byte *Buffer,uint Count);
|
||||
extern int my_b_safe_write(IO_CACHE *info,const byte *Buffer,uint Count);
|
||||
|
||||
extern int my_block_write(IO_CACHE *info, const byte *Buffer,
|
||||
uint Count, my_off_t pos);
|
||||
extern int _flush_io_cache(IO_CACHE *info, int need_append_buffer_lock);
|
||||
|
@ -988,6 +988,20 @@ end:
|
||||
}
|
||||
|
||||
|
||||
int my_b_safe_write(IO_CACHE *info, const byte *Buffer, uint Count)
|
||||
{
|
||||
/*
|
||||
Sasha: We are not writing this with the ? operator to avoid hitting
|
||||
a possible compiler bug. At least gcc 2.95 cannot deal with
|
||||
several layers of ternary operators that evaluated comma(,) operator
|
||||
expressions inside - I do have a test case if somebody wants it
|
||||
*/
|
||||
if (info->type == SEQ_READ_APPEND)
|
||||
return my_b_append(info, Buffer, Count);
|
||||
return my_b_write(info, Buffer, Count);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Write a block to disk where part of the data may be inside the record
|
||||
buffer. As all write calls to the data goes through the cache,
|
||||
|
@ -263,7 +263,7 @@ bool MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg,
|
||||
an extension for the binary log files.
|
||||
In this case we write a standard header to it.
|
||||
*/
|
||||
if (my_b_write(&log_file, (byte*) BINLOG_MAGIC, BIN_LOG_HEADER_SIZE))
|
||||
if (my_b_safe_write(&log_file, (byte*) BINLOG_MAGIC, BIN_LOG_HEADER_SIZE))
|
||||
goto err;
|
||||
bytes_written += BIN_LOG_HEADER_SIZE;
|
||||
write_file_name_to_index_file=1;
|
||||
|
@ -26,20 +26,6 @@
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
inline int my_b_safe_write(IO_CACHE* file, const byte *buf,
|
||||
int len)
|
||||
{
|
||||
/*
|
||||
Sasha: We are not writing this with the ? operator to avoid hitting
|
||||
a possible compiler bug. At least gcc 2.95 cannot deal with
|
||||
several layers of ternary operators that evaluated comma(,) operator
|
||||
expressions inside - I do have a test case if somebody wants it
|
||||
*/
|
||||
if (file->type == SEQ_READ_APPEND)
|
||||
return my_b_append(file, buf,len);
|
||||
return my_b_write(file, buf,len);
|
||||
}
|
||||
|
||||
#ifdef MYSQL_CLIENT
|
||||
static void pretty_print_str(FILE* file, char* str, int len)
|
||||
{
|
||||
@ -2039,7 +2025,7 @@ Slave: load data infile on table '%s' at log position %s in log \
|
||||
err=ER(sql_errno);
|
||||
}
|
||||
slave_print_error(rli,sql_errno,"\
|
||||
Error '%s' running lOAD DATA INFILE on table '%s'. Default database: '%s'",
|
||||
Error '%s' running LOAD DATA INFILE on table '%s'. Default database: '%s'",
|
||||
err, (char*)table_name, print_slave_db_safe(db));
|
||||
free_root(&thd->mem_root,0);
|
||||
return 1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user