Commit 9b1076b4 authored by Narayanan V's avatar Narayanan V

Bug#38848 myisam_use_mmap causes widespread myisam corruption on windows

            
Currently the memory map is being created
with a size that is greater than the size 
of the underlying datafile. This can cause
varying behaviour,

e.g. 

In windows the size of the datafile
is increased, while on linux it remains
the same.

This fix removes the increment margin to
the size that is used while creating the
memory map.
parent b745d02a
...@@ -66,7 +66,7 @@ static int _mi_cmp_buffer(File file, const uchar *buff, my_off_t filepos, ...@@ -66,7 +66,7 @@ static int _mi_cmp_buffer(File file, const uchar *buff, my_off_t filepos,
my_bool mi_dynmap_file(MI_INFO *info, my_off_t size) my_bool mi_dynmap_file(MI_INFO *info, my_off_t size)
{ {
DBUG_ENTER("mi_dynmap_file"); DBUG_ENTER("mi_dynmap_file");
if (size > (my_off_t) (~((size_t) 0)) - MEMMAP_EXTRA_MARGIN) if (size > (my_off_t) (~((size_t) 0)))
{ {
DBUG_PRINT("warning", ("File is too large for mmap")); DBUG_PRINT("warning", ("File is too large for mmap"));
DBUG_RETURN(1); DBUG_RETURN(1);
...@@ -80,7 +80,7 @@ my_bool mi_dynmap_file(MI_INFO *info, my_off_t size) ...@@ -80,7 +80,7 @@ my_bool mi_dynmap_file(MI_INFO *info, my_off_t size)
upon a write if no physical memory is available. upon a write if no physical memory is available.
*/ */
info->s->file_map= (uchar*) info->s->file_map= (uchar*)
my_mmap(0, (size_t)(size + MEMMAP_EXTRA_MARGIN), my_mmap(0, (size_t) size,
info->s->mode==O_RDONLY ? PROT_READ : info->s->mode==O_RDONLY ? PROT_READ :
PROT_READ | PROT_WRITE, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_NORESERVE, MAP_SHARED | MAP_NORESERVE,
...@@ -113,7 +113,7 @@ void mi_remap_file(MI_INFO *info, my_off_t size) ...@@ -113,7 +113,7 @@ void mi_remap_file(MI_INFO *info, my_off_t size)
if (info->s->file_map) if (info->s->file_map)
{ {
VOID(my_munmap((char*) info->s->file_map, VOID(my_munmap((char*) info->s->file_map,
(size_t) info->s->mmaped_length + MEMMAP_EXTRA_MARGIN)); (size_t) info->s->mmaped_length));
mi_dynmap_file(info, size); mi_dynmap_file(info, size);
} }
} }
......
...@@ -1502,7 +1502,9 @@ my_bool _mi_memmap_file(MI_INFO *info) ...@@ -1502,7 +1502,9 @@ my_bool _mi_memmap_file(MI_INFO *info)
DBUG_PRINT("warning",("File isn't extended for memmap")); DBUG_PRINT("warning",("File isn't extended for memmap"));
DBUG_RETURN(0); DBUG_RETURN(0);
} }
if (mi_dynmap_file(info, share->state.state.data_file_length)) if (mi_dynmap_file(info,
share->state.state.data_file_length +
MEMMAP_EXTRA_MARGIN))
DBUG_RETURN(0); DBUG_RETURN(0);
} }
info->opt_flag|= MEMMAP_USED; info->opt_flag|= MEMMAP_USED;
......
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