mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Avoid calls to my_seek() and my_tell() on log files so that
non-seekable files like FIFOs can be used for logs other than the binlog. (Bug #8271) include/my_sys.h: Add APPEND_CACHE cache type mysys/mf_iocache.c: Handle APPEND_CACHE cache type to avoid calling my_seek() and my_tell() on logs opened O_APPEND that we never read from (so they can be a non-seekable file like a FIFO). sql/mysqld.cc: Use APPEND_CACHE for log files not set to SEQ_READ_APPEND.
This commit is contained in:
@ -270,6 +270,7 @@ enum loglevel {
|
|||||||
enum cache_type
|
enum cache_type
|
||||||
{
|
{
|
||||||
READ_CACHE,WRITE_CACHE,
|
READ_CACHE,WRITE_CACHE,
|
||||||
|
APPEND_CACHE, /* Like WRITE_CACHE, but only append */
|
||||||
SEQ_READ_APPEND /* sequential read or append */,
|
SEQ_READ_APPEND /* sequential read or append */,
|
||||||
READ_FIFO, READ_NET,WRITE_NET};
|
READ_FIFO, READ_NET,WRITE_NET};
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ static void my_aiowait(my_aio_result *result);
|
|||||||
void setup_io_cache(IO_CACHE* info)
|
void setup_io_cache(IO_CACHE* info)
|
||||||
{
|
{
|
||||||
/* Ensure that my_b_tell() and my_b_bytes_in_cache works */
|
/* Ensure that my_b_tell() and my_b_bytes_in_cache works */
|
||||||
if (info->type == WRITE_CACHE)
|
if (info->type == WRITE_CACHE || info->type == APPEND_CACHE)
|
||||||
{
|
{
|
||||||
info->current_pos= &info->write_pos;
|
info->current_pos= &info->write_pos;
|
||||||
info->current_end= &info->write_end;
|
info->current_end= &info->write_end;
|
||||||
@ -223,7 +223,7 @@ int init_io_cache(IO_CACHE *info, File file, uint cachesize,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == WRITE_CACHE)
|
if (type == WRITE_CACHE || type == APPEND_CACHE)
|
||||||
info->write_end=
|
info->write_end=
|
||||||
info->buffer+info->buffer_length- (seek_offset & (IO_SIZE-1));
|
info->buffer+info->buffer_length- (seek_offset & (IO_SIZE-1));
|
||||||
else
|
else
|
||||||
@ -293,6 +293,7 @@ my_bool reinit_io_cache(IO_CACHE *info, enum cache_type type,
|
|||||||
/* One can't do reinit with the following types */
|
/* One can't do reinit with the following types */
|
||||||
DBUG_ASSERT(type != READ_NET && info->type != READ_NET &&
|
DBUG_ASSERT(type != READ_NET && info->type != READ_NET &&
|
||||||
type != WRITE_NET && info->type != WRITE_NET &&
|
type != WRITE_NET && info->type != WRITE_NET &&
|
||||||
|
type != APPEND_CACHE && info->type != APPEND_CACHE &&
|
||||||
type != SEQ_READ_APPEND && info->type != SEQ_READ_APPEND);
|
type != SEQ_READ_APPEND && info->type != SEQ_READ_APPEND);
|
||||||
|
|
||||||
/* If the whole file is in memory, avoid flushing to disk */
|
/* If the whole file is in memory, avoid flushing to disk */
|
||||||
@ -1098,7 +1099,8 @@ int my_b_flush_io_cache(IO_CACHE *info, int need_append_buffer_lock)
|
|||||||
my_off_t pos_in_file;
|
my_off_t pos_in_file;
|
||||||
DBUG_ENTER("my_b_flush_io_cache");
|
DBUG_ENTER("my_b_flush_io_cache");
|
||||||
|
|
||||||
if (!(append_cache = (info->type == SEQ_READ_APPEND)))
|
if (!(append_cache = (info->type == SEQ_READ_APPEND ||
|
||||||
|
info->type == APPEND_CACHE)))
|
||||||
need_append_buffer_lock=0;
|
need_append_buffer_lock=0;
|
||||||
|
|
||||||
if (info->type == WRITE_CACHE || append_cache)
|
if (info->type == WRITE_CACHE || append_cache)
|
||||||
@ -1145,7 +1147,13 @@ int my_b_flush_io_cache(IO_CACHE *info, int need_append_buffer_lock)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
info->end_of_file+=(info->write_pos-info->append_read_pos);
|
info->end_of_file+=(info->write_pos-info->append_read_pos);
|
||||||
DBUG_ASSERT(info->end_of_file == my_tell(info->file,MYF(0)));
|
/*
|
||||||
|
We only need to worry that info->end_of_file is really accurate
|
||||||
|
for SEQ_READ_APPEND. For APPEND_CACHE, it is possible that the
|
||||||
|
file is non-seekable, like a FIFO.
|
||||||
|
*/
|
||||||
|
DBUG_ASSERT(info->type != SEQ_READ_APPEND ||
|
||||||
|
info->end_of_file == my_tell(info->file,MYF(0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
info->append_read_pos=info->write_pos=info->write_buffer;
|
info->append_read_pos=info->write_pos=info->write_buffer;
|
||||||
|
@ -2198,7 +2198,7 @@ bool open_log(MYSQL_LOG *log, const char *hostname,
|
|||||||
opt_name=tmp;
|
opt_name=tmp;
|
||||||
}
|
}
|
||||||
return log->open(opt_name, type, 0, index_file_name,
|
return log->open(opt_name, type, 0, index_file_name,
|
||||||
(read_append) ? SEQ_READ_APPEND : WRITE_CACHE,
|
(read_append) ? SEQ_READ_APPEND : APPEND_CACHE,
|
||||||
no_auto_events, max_size);
|
no_auto_events, max_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user