Commit 00d80fff authored by unknown's avatar unknown

Added read log caching and fixed a possible bug in write cacheing.

This should cause fewer seeks when using replication.


Docs/manual.texi:
  Changelog
parent 8c335b8a
...@@ -46851,6 +46851,10 @@ Fixed bug when joining with caching (unlikely to happen). ...@@ -46851,6 +46851,10 @@ Fixed bug when joining with caching (unlikely to happen).
Fixed race condition when using the binary log and @code{INSERT DELAYED} Fixed race condition when using the binary log and @code{INSERT DELAYED}
which could cause the binary log to have rows that was not yet written which could cause the binary log to have rows that was not yet written
to MyISAM tables. to MyISAM tables.
@item
Changed caching of binary log to make replication slightly faster.
@item
Fixed bug in replication on Mac OS X.
@end itemize @end itemize
@node News-3.23.45, News-3.23.44, News-3.23.46, News-3.23.x @node News-3.23.45, News-3.23.44, News-3.23.46, News-3.23.x
...@@ -32,20 +32,35 @@ ...@@ -32,20 +32,35 @@
void my_b_seek(IO_CACHE *info,my_off_t pos) void my_b_seek(IO_CACHE *info,my_off_t pos)
{ {
my_off_t offset = (pos - info->pos_in_file);
DBUG_ENTER("my_b_seek");
DBUG_PRINT("enter",("pos: %lu", (ulong) pos));
if (info->type == READ_CACHE) if (info->type == READ_CACHE)
{ {
if ((ulonglong) offset < (ulonglong) (info->rc_end - info->buffer))
{
/* The read is in the current buffer; Reuse it */
info->rc_pos = info->buffer + offset;
DBUG_VOID_RETURN;
}
else
{
/* Force a new read on next my_b_read */
info->rc_pos=info->rc_end=info->buffer; info->rc_pos=info->rc_end=info->buffer;
} }
}
else if (info->type == WRITE_CACHE) else if (info->type == WRITE_CACHE)
{ {
byte* try_rc_pos; /* If write is in current buffer, reuse it */
try_rc_pos = info->rc_pos + (pos - info->pos_in_file); if ((ulonglong) offset <
if (try_rc_pos >= info->buffer && try_rc_pos <= info->rc_end) (ulonglong) (info->rc_end - info->buffer))
{ {
info->rc_pos = try_rc_pos; info->rc_pos = info->buffer + offset;
return; DBUG_VOID_RETURN;
} }
flush_io_cache(info); flush_io_cache(info);
info->rc_end=(info->buffer+info->buffer_length-(pos & (IO_SIZE-1)));
} }
info->pos_in_file=pos; info->pos_in_file=pos;
info->seek_not_done=1; info->seek_not_done=1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment