summaryrefslogtreecommitdiff
path: root/mysys/mf_iocache2.c
diff options
context:
space:
mode:
authorunknown <monty@hundin.mysql.fi>2001-11-28 15:18:29 +0200
committerunknown <monty@hundin.mysql.fi>2001-11-28 15:18:29 +0200
commitfa7ba453f92412f82e7d982e8e64494e9df257d8 (patch)
tree2dd4497fe2f19df48908a85a4cae1d9426040533 /mysys/mf_iocache2.c
parent7f0e721e5073855b1fd57df3a14e41ecf1eb62b7 (diff)
downloadmariadb-git-fa7ba453f92412f82e7d982e8e64494e9df257d8.tar.gz
Added read log caching and fixed a possible bug in write cacheing.
This should cause fewer seeks when using replication. Docs/manual.texi: Changelog
Diffstat (limited to 'mysys/mf_iocache2.c')
-rw-r--r--mysys/mf_iocache2.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/mysys/mf_iocache2.c b/mysys/mf_iocache2.c
index 9c0f99aea82..3e9cc74e0a2 100644
--- a/mysys/mf_iocache2.c
+++ b/mysys/mf_iocache2.c
@@ -32,20 +32,35 @@
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)
{
- info->rc_pos=info->rc_end=info->buffer;
+ 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;
+ }
}
else if (info->type == WRITE_CACHE)
{
- byte* try_rc_pos;
- try_rc_pos = info->rc_pos + (pos - info->pos_in_file);
- if (try_rc_pos >= info->buffer && try_rc_pos <= info->rc_end)
+ /* If write is in current buffer, reuse it */
+ if ((ulonglong) offset <
+ (ulonglong) (info->rc_end - info->buffer))
{
- info->rc_pos = try_rc_pos;
- return;
+ info->rc_pos = info->buffer + offset;
+ DBUG_VOID_RETURN;
}
flush_io_cache(info);
+ info->rc_end=(info->buffer+info->buffer_length-(pos & (IO_SIZE-1)));
}
info->pos_in_file=pos;
info->seek_not_done=1;