mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
BUG#11757032 - 49030: OPTIMIZE TABLE BREAKS MYISAM TABLE WHEN
USING MYISAM_USE_MMAP ON WINDOWS When OPTIMIZE/REPAIR TABLE is switching to new data file, old data file is removed while memory mapping is still active. With 5.1 implementation of nt_share_delete() it is not permitted to remove mmaped file. This fix disables memory mapping for mi_repair() operations. mysql-test/r/myisam.result: A test case for BUG#11757032. mysql-test/t/myisam.test: A test case for BUG#11757032. storage/myisam/ha_myisam.cc: mi_repair*() functions family use file I/O even if memory mapping is available. Since mixing mmap I/O and file I/O may cause various artifacts, memory mapping must be disabled. storage/myisam/mi_delete_all.c: Clean-up: do not attempt to remap file after truncate, since there is nothing to map.
This commit is contained in:
@ -2412,4 +2412,28 @@ CARDINALITY
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET myisam_sort_buffer_size=@@global.myisam_sort_buffer_size;
|
SET myisam_sort_buffer_size=@@global.myisam_sort_buffer_size;
|
||||||
SET myisam_repair_threads=@@global.myisam_repair_threads;
|
SET myisam_repair_threads=@@global.myisam_repair_threads;
|
||||||
|
#
|
||||||
|
# BUG#11757032 - 49030: OPTIMIZE TABLE BREAKS MYISAM TABLE WHEN
|
||||||
|
# USING MYISAM_USE_MMAP ON WINDOWS
|
||||||
|
#
|
||||||
|
SET GLOBAL myisam_use_mmap=1;
|
||||||
|
CREATE TABLE t1(a INT);
|
||||||
|
INSERT INTO t1 VALUES(1),(2);
|
||||||
|
DELETE FROM t1 WHERE a=1;
|
||||||
|
FLUSH TABLE t1;
|
||||||
|
LOCK TABLE t1 WRITE;
|
||||||
|
OPTIMIZE TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 optimize status OK
|
||||||
|
INSERT INTO t1 VALUES(3);
|
||||||
|
UNLOCK TABLES;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a
|
||||||
|
2
|
||||||
|
3
|
||||||
|
CHECK TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET GLOBAL myisam_use_mmap=default;
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
|
@ -1645,4 +1645,22 @@ DROP TABLE t1;
|
|||||||
SET myisam_sort_buffer_size=@@global.myisam_sort_buffer_size;
|
SET myisam_sort_buffer_size=@@global.myisam_sort_buffer_size;
|
||||||
SET myisam_repair_threads=@@global.myisam_repair_threads;
|
SET myisam_repair_threads=@@global.myisam_repair_threads;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # BUG#11757032 - 49030: OPTIMIZE TABLE BREAKS MYISAM TABLE WHEN
|
||||||
|
--echo # USING MYISAM_USE_MMAP ON WINDOWS
|
||||||
|
--echo #
|
||||||
|
SET GLOBAL myisam_use_mmap=1;
|
||||||
|
CREATE TABLE t1(a INT);
|
||||||
|
INSERT INTO t1 VALUES(1),(2);
|
||||||
|
DELETE FROM t1 WHERE a=1;
|
||||||
|
FLUSH TABLE t1;
|
||||||
|
LOCK TABLE t1 WRITE;
|
||||||
|
OPTIMIZE TABLE t1;
|
||||||
|
INSERT INTO t1 VALUES(3);
|
||||||
|
UNLOCK TABLES;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
CHECK TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET GLOBAL myisam_use_mmap=default;
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
@ -1135,6 +1135,18 @@ int ha_myisam::repair(THD *thd, MI_CHECK ¶m, bool do_optimize)
|
|||||||
mi_get_mask_all_keys_active(share->base.keys) :
|
mi_get_mask_all_keys_active(share->base.keys) :
|
||||||
share->state.key_map);
|
share->state.key_map);
|
||||||
uint testflag=param.testflag;
|
uint testflag=param.testflag;
|
||||||
|
#ifdef HAVE_MMAP
|
||||||
|
bool remap= test(share->file_map);
|
||||||
|
/*
|
||||||
|
mi_repair*() functions family use file I/O even if memory
|
||||||
|
mapping is available.
|
||||||
|
|
||||||
|
Since mixing mmap I/O and file I/O may cause various artifacts,
|
||||||
|
memory mapping must be disabled.
|
||||||
|
*/
|
||||||
|
if (remap)
|
||||||
|
mi_munmap_file(file);
|
||||||
|
#endif
|
||||||
if (mi_test_if_sort_rep(file,file->state->records,key_map,0) &&
|
if (mi_test_if_sort_rep(file,file->state->records,key_map,0) &&
|
||||||
(local_testflag & T_REP_BY_SORT))
|
(local_testflag & T_REP_BY_SORT))
|
||||||
{
|
{
|
||||||
@ -1166,6 +1178,10 @@ int ha_myisam::repair(THD *thd, MI_CHECK ¶m, bool do_optimize)
|
|||||||
error= mi_repair(¶m, file, fixed_name,
|
error= mi_repair(¶m, file, fixed_name,
|
||||||
param.testflag & T_QUICK);
|
param.testflag & T_QUICK);
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_MMAP
|
||||||
|
if (remap)
|
||||||
|
mi_dynmap_file(file, file->state->data_file_length);
|
||||||
|
#endif
|
||||||
param.testflag=testflag;
|
param.testflag=testflag;
|
||||||
optimize_done=1;
|
optimize_done=1;
|
||||||
}
|
}
|
||||||
|
@ -63,11 +63,6 @@ int mi_delete_all_rows(MI_INFO *info)
|
|||||||
my_chsize(share->kfile, share->base.keystart, 0, MYF(MY_WME)) )
|
my_chsize(share->kfile, share->base.keystart, 0, MYF(MY_WME)) )
|
||||||
goto err;
|
goto err;
|
||||||
VOID(_mi_writeinfo(info,WRITEINFO_UPDATE_KEYFILE));
|
VOID(_mi_writeinfo(info,WRITEINFO_UPDATE_KEYFILE));
|
||||||
#ifdef HAVE_MMAP
|
|
||||||
/* Map again */
|
|
||||||
if (share->file_map)
|
|
||||||
mi_dynmap_file(info, (my_off_t) 0);
|
|
||||||
#endif
|
|
||||||
allow_break(); /* Allow SIGHUP & SIGINT */
|
allow_break(); /* Allow SIGHUP & SIGINT */
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user