mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
Fixed bug #19079.
The bug caused a reported index corruption in the cases when key_cache_block_size was not a multiple of myisam_block_size, e.g. when key_cache_block_size=1536 while myisam_block_size=1024. mysql-test/r/key_cache.result: Added a test case for bug #19079. mysql-test/t/key_cache.test: Added a test case for bug #19079.
This commit is contained in:
@@ -287,3 +287,45 @@ check table t1;
|
|||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 check status OK
|
test.t1 check status OK
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
CREATE TABLE t1(a int NOT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||||
|
SET GLOBAL key_cache_block_size=1536;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
SELECT @@key_cache_block_size;
|
||||||
|
@@key_cache_block_size
|
||||||
|
1536
|
||||||
|
CHECK TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1(a int NOT NULL AUTO_INCREMENT PRIMARY KEY, b int);
|
||||||
|
CREATE TABLE t2(a int NOT NULL AUTO_INCREMENT PRIMARY KEY, b int);
|
||||||
|
SET GLOBAL key_cache_block_size=1536;
|
||||||
|
INSERT INTO t1 VALUES (1,0);
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
SELECT COUNT(*) FROM t1;
|
||||||
|
COUNT(*)
|
||||||
|
4181
|
||||||
|
SELECT @@key_cache_block_size;
|
||||||
|
@@key_cache_block_size
|
||||||
|
1536
|
||||||
|
CHECK TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
@@ -149,6 +149,7 @@ show status like 'key_blocks_used';
|
|||||||
--replace_result 1812 KEY_BLOCKS_UNUSED 1793 KEY_BLOCKS_UNUSED 1674 KEY_BLOCKS_UNUSED 1818 KEY_BLOCKS_UNUSED 1824 KEY_BLOCKS_UNUSED
|
--replace_result 1812 KEY_BLOCKS_UNUSED 1793 KEY_BLOCKS_UNUSED 1674 KEY_BLOCKS_UNUSED 1818 KEY_BLOCKS_UNUSED 1824 KEY_BLOCKS_UNUSED
|
||||||
show status like 'key_blocks_unused';
|
show status like 'key_blocks_unused';
|
||||||
|
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
# We don't reset keycache2 as we want to ensure that mysqld will reset it
|
# We don't reset keycache2 as we want to ensure that mysqld will reset it
|
||||||
set global keycache2.key_buffer_size=0;
|
set global keycache2.key_buffer_size=0;
|
||||||
@@ -157,7 +158,7 @@ set global keycache2.key_buffer_size=0;
|
|||||||
set global keycache3.key_buffer_size=100;
|
set global keycache3.key_buffer_size=100;
|
||||||
set global keycache3.key_buffer_size=0;
|
set global keycache3.key_buffer_size=0;
|
||||||
|
|
||||||
# Test case for buf 6447
|
# Test case for bug 6447
|
||||||
|
|
||||||
create table t1 (mytext text, FULLTEXT (mytext));
|
create table t1 (mytext text, FULLTEXT (mytext));
|
||||||
insert t1 values ('aaabbb');
|
insert t1 values ('aaabbb');
|
||||||
@@ -168,4 +169,42 @@ check table t1;
|
|||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #19079: corrupted index when key_cache_block_size is not multiple of
|
||||||
|
# myisam_block_size
|
||||||
|
|
||||||
|
CREATE TABLE t1(a int NOT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||||
|
SET GLOBAL key_cache_block_size=1536;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
SELECT @@key_cache_block_size;
|
||||||
|
CHECK TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1(a int NOT NULL AUTO_INCREMENT PRIMARY KEY, b int);
|
||||||
|
CREATE TABLE t2(a int NOT NULL AUTO_INCREMENT PRIMARY KEY, b int);
|
||||||
|
SET GLOBAL key_cache_block_size=1536;
|
||||||
|
INSERT INTO t1 VALUES (1,0);
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
INSERT INTO t2(b) SELECT b FROM t1;
|
||||||
|
INSERT INTO t1(b) SELECT b FROM t2;
|
||||||
|
SELECT COUNT(*) FROM t1;
|
||||||
|
SELECT @@key_cache_block_size;
|
||||||
|
CHECK TABLE t1;
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
@@ -1741,6 +1741,7 @@ byte *key_cache_read(KEY_CACHE *keycache,
|
|||||||
uint status;
|
uint status;
|
||||||
int page_st;
|
int page_st;
|
||||||
|
|
||||||
|
offset= (uint) (filepos & (keycache->key_cache_block_size-1));
|
||||||
/* Read data in key_cache_block_size increments */
|
/* Read data in key_cache_block_size increments */
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -1750,7 +1751,6 @@ byte *key_cache_read(KEY_CACHE *keycache,
|
|||||||
keycache_pthread_mutex_unlock(&keycache->cache_lock);
|
keycache_pthread_mutex_unlock(&keycache->cache_lock);
|
||||||
goto no_key_cache;
|
goto no_key_cache;
|
||||||
}
|
}
|
||||||
offset= (uint) (filepos & (keycache->key_cache_block_size-1));
|
|
||||||
filepos-= offset;
|
filepos-= offset;
|
||||||
read_length= length;
|
read_length= length;
|
||||||
set_if_smaller(read_length, keycache->key_cache_block_size-offset);
|
set_if_smaller(read_length, keycache->key_cache_block_size-offset);
|
||||||
@@ -1826,6 +1826,7 @@ byte *key_cache_read(KEY_CACHE *keycache,
|
|||||||
#endif
|
#endif
|
||||||
buff+= read_length;
|
buff+= read_length;
|
||||||
filepos+= read_length+offset;
|
filepos+= read_length+offset;
|
||||||
|
offset= 0;
|
||||||
|
|
||||||
} while ((length-= read_length));
|
} while ((length-= read_length));
|
||||||
DBUG_RETURN(start);
|
DBUG_RETURN(start);
|
||||||
@@ -1877,17 +1878,17 @@ int key_cache_insert(KEY_CACHE *keycache,
|
|||||||
uint read_length;
|
uint read_length;
|
||||||
int page_st;
|
int page_st;
|
||||||
int error;
|
int error;
|
||||||
|
uint offset;
|
||||||
|
|
||||||
|
offset= (uint) (filepos & (keycache->key_cache_block_size-1));
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
uint offset;
|
|
||||||
keycache_pthread_mutex_lock(&keycache->cache_lock);
|
keycache_pthread_mutex_lock(&keycache->cache_lock);
|
||||||
if (!keycache->can_be_used)
|
if (!keycache->can_be_used)
|
||||||
{
|
{
|
||||||
keycache_pthread_mutex_unlock(&keycache->cache_lock);
|
keycache_pthread_mutex_unlock(&keycache->cache_lock);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
offset= (uint) (filepos & (keycache->key_cache_block_size-1));
|
|
||||||
/* Read data into key cache from buff in key_cache_block_size incr. */
|
/* Read data into key cache from buff in key_cache_block_size incr. */
|
||||||
filepos-= offset;
|
filepos-= offset;
|
||||||
read_length= length;
|
read_length= length;
|
||||||
@@ -1945,6 +1946,7 @@ int key_cache_insert(KEY_CACHE *keycache,
|
|||||||
|
|
||||||
buff+= read_length;
|
buff+= read_length;
|
||||||
filepos+= read_length+offset;
|
filepos+= read_length+offset;
|
||||||
|
offset= 0;
|
||||||
|
|
||||||
} while ((length-= read_length));
|
} while ((length-= read_length));
|
||||||
}
|
}
|
||||||
@@ -2011,17 +2013,17 @@ int key_cache_write(KEY_CACHE *keycache,
|
|||||||
/* Key cache is used */
|
/* Key cache is used */
|
||||||
uint read_length;
|
uint read_length;
|
||||||
int page_st;
|
int page_st;
|
||||||
|
uint offset;
|
||||||
|
|
||||||
|
offset= (uint) (filepos & (keycache->key_cache_block_size-1));
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
uint offset;
|
|
||||||
keycache_pthread_mutex_lock(&keycache->cache_lock);
|
keycache_pthread_mutex_lock(&keycache->cache_lock);
|
||||||
if (!keycache->can_be_used)
|
if (!keycache->can_be_used)
|
||||||
{
|
{
|
||||||
keycache_pthread_mutex_unlock(&keycache->cache_lock);
|
keycache_pthread_mutex_unlock(&keycache->cache_lock);
|
||||||
goto no_key_cache;
|
goto no_key_cache;
|
||||||
}
|
}
|
||||||
offset= (uint) (filepos & (keycache->key_cache_block_size-1));
|
|
||||||
/* Write data in key_cache_block_size increments */
|
/* Write data in key_cache_block_size increments */
|
||||||
filepos-= offset;
|
filepos-= offset;
|
||||||
read_length= length;
|
read_length= length;
|
||||||
|
Reference in New Issue
Block a user