mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
Merge xiphis.org:/home/antony/work2/mysql-5.0-engines
into xiphis.org:/home/antony/work2/mysql-5.0-engines.merge sql/mysqld.cc: Auto merged
This commit is contained in:
@@ -46,7 +46,6 @@ typedef struct st_key_cache
|
|||||||
my_bool key_cache_inited;
|
my_bool key_cache_inited;
|
||||||
my_bool resize_in_flush; /* true during flush of resize operation */
|
my_bool resize_in_flush; /* true during flush of resize operation */
|
||||||
my_bool can_be_used; /* usage of cache for read/write is allowed */
|
my_bool can_be_used; /* usage of cache for read/write is allowed */
|
||||||
uint key_cache_shift;
|
|
||||||
ulong key_cache_mem_size; /* specified size of the cache memory */
|
ulong key_cache_mem_size; /* specified size of the cache memory */
|
||||||
uint key_cache_block_size; /* size of the page buffer of a cache block */
|
uint key_cache_block_size; /* size of the page buffer of a cache block */
|
||||||
ulong min_warm_blocks; /* min number of warm blocks; */
|
ulong min_warm_blocks; /* min number of warm blocks; */
|
||||||
|
@@ -341,3 +341,30 @@ Warning 1438 Cannot drop default keycache
|
|||||||
select @@global.key_buffer_size;
|
select @@global.key_buffer_size;
|
||||||
@@global.key_buffer_size
|
@@global.key_buffer_size
|
||||||
2097152
|
2097152
|
||||||
|
SET @bug28478_key_cache_block_size= @@global.key_cache_block_size;
|
||||||
|
SET GLOBAL key_cache_block_size= 1536;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
c1 CHAR(150),
|
||||||
|
c2 CHAR(150),
|
||||||
|
c3 CHAR(150),
|
||||||
|
KEY(c1, c2, c3)
|
||||||
|
) ENGINE= MyISAM;
|
||||||
|
INSERT INTO t1 (c1, c2, c3) VALUES
|
||||||
|
('a', 'b', 'c'), ('b', 'c', 'd'), ('c', 'd', 'e'), ('d', 'e', 'f'),
|
||||||
|
('e', 'f', 'g'), ('f', 'g', 'h'), ('g', 'h', 'i'), ('h', 'i', 'j'),
|
||||||
|
('i', 'j', 'k'), ('j', 'k', 'l'), ('k', 'l', 'm'), ('l', 'm', 'n'),
|
||||||
|
('m', 'n', 'o'), ('n', 'o', 'p'), ('o', 'p', 'q'), ('p', 'q', 'r'),
|
||||||
|
('q', 'r', 's'), ('r', 's', 't'), ('s', 't', 'u'), ('t', 'u', 'v'),
|
||||||
|
('u', 'v', 'w'), ('v', 'w', 'x'), ('w', 'x', 'y'), ('x', 'y', 'z');
|
||||||
|
INSERT INTO t1 (c1, c2, c3) SELECT c1, c2, c3 from t1;
|
||||||
|
INSERT INTO t1 (c1, c2, c3) SELECT c1, c2, c3 from t1;
|
||||||
|
INSERT INTO t1 (c1, c2, c3) SELECT c1, c2, c3 from t1;
|
||||||
|
CHECK TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
|
SHOW VARIABLES LIKE 'key_cache_block_size';
|
||||||
|
Variable_name Value
|
||||||
|
key_cache_block_size 1536
|
||||||
|
SET GLOBAL key_cache_block_size= @bug28478_key_cache_block_size;
|
||||||
|
DROP TABLE t1;
|
||||||
|
@@ -219,4 +219,31 @@ set global key_cache_block_size= @my_key_cache_block_size;
|
|||||||
set @@global.key_buffer_size=0;
|
set @@global.key_buffer_size=0;
|
||||||
select @@global.key_buffer_size;
|
select @@global.key_buffer_size;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#28478 - Improper key_cache_block_size corrupts MyISAM tables
|
||||||
|
#
|
||||||
|
SET @bug28478_key_cache_block_size= @@global.key_cache_block_size;
|
||||||
|
SET GLOBAL key_cache_block_size= 1536;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
c1 CHAR(150),
|
||||||
|
c2 CHAR(150),
|
||||||
|
c3 CHAR(150),
|
||||||
|
KEY(c1, c2, c3)
|
||||||
|
) ENGINE= MyISAM;
|
||||||
|
INSERT INTO t1 (c1, c2, c3) VALUES
|
||||||
|
('a', 'b', 'c'), ('b', 'c', 'd'), ('c', 'd', 'e'), ('d', 'e', 'f'),
|
||||||
|
('e', 'f', 'g'), ('f', 'g', 'h'), ('g', 'h', 'i'), ('h', 'i', 'j'),
|
||||||
|
('i', 'j', 'k'), ('j', 'k', 'l'), ('k', 'l', 'm'), ('l', 'm', 'n'),
|
||||||
|
('m', 'n', 'o'), ('n', 'o', 'p'), ('o', 'p', 'q'), ('p', 'q', 'r'),
|
||||||
|
('q', 'r', 's'), ('r', 's', 't'), ('s', 't', 'u'), ('t', 'u', 'v'),
|
||||||
|
('u', 'v', 'w'), ('v', 'w', 'x'), ('w', 'x', 'y'), ('x', 'y', 'z');
|
||||||
|
INSERT INTO t1 (c1, c2, c3) SELECT c1, c2, c3 from t1;
|
||||||
|
INSERT INTO t1 (c1, c2, c3) SELECT c1, c2, c3 from t1;
|
||||||
|
INSERT INTO t1 (c1, c2, c3) SELECT c1, c2, c3 from t1;
|
||||||
|
CHECK TABLE t1;
|
||||||
|
SHOW VARIABLES LIKE 'key_cache_block_size';
|
||||||
|
SET GLOBAL key_cache_block_size= @bug28478_key_cache_block_size;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
@@ -173,7 +173,7 @@ static void test_key_cache(KEY_CACHE *keycache,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define KEYCACHE_HASH(f, pos) \
|
#define KEYCACHE_HASH(f, pos) \
|
||||||
(((ulong) ((pos) >> keycache->key_cache_shift)+ \
|
(((ulong) ((pos) / keycache->key_cache_block_size) + \
|
||||||
(ulong) (f)) & (keycache->hash_entries-1))
|
(ulong) (f)) & (keycache->hash_entries-1))
|
||||||
#define FILE_HASH(f) ((uint) (f) & (CHANGED_BLOCKS_HASH-1))
|
#define FILE_HASH(f) ((uint) (f) & (CHANGED_BLOCKS_HASH-1))
|
||||||
|
|
||||||
@@ -329,7 +329,6 @@ int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size,
|
|||||||
|
|
||||||
keycache->key_cache_mem_size= use_mem;
|
keycache->key_cache_mem_size= use_mem;
|
||||||
keycache->key_cache_block_size= key_cache_block_size;
|
keycache->key_cache_block_size= key_cache_block_size;
|
||||||
keycache->key_cache_shift= my_bit_log2(key_cache_block_size);
|
|
||||||
DBUG_PRINT("info", ("key_cache_block_size: %u",
|
DBUG_PRINT("info", ("key_cache_block_size: %u",
|
||||||
key_cache_block_size));
|
key_cache_block_size));
|
||||||
|
|
||||||
@@ -352,7 +351,7 @@ int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size,
|
|||||||
ALIGN_SIZE(hash_links * sizeof(HASH_LINK)) +
|
ALIGN_SIZE(hash_links * sizeof(HASH_LINK)) +
|
||||||
ALIGN_SIZE(sizeof(HASH_LINK*) *
|
ALIGN_SIZE(sizeof(HASH_LINK*) *
|
||||||
keycache->hash_entries))) +
|
keycache->hash_entries))) +
|
||||||
((ulong) blocks << keycache->key_cache_shift) > use_mem)
|
((ulong) blocks * keycache->key_cache_block_size) > use_mem)
|
||||||
blocks--;
|
blocks--;
|
||||||
/* Allocate memory for cache page buffers */
|
/* Allocate memory for cache page buffers */
|
||||||
if ((keycache->block_mem=
|
if ((keycache->block_mem=
|
||||||
@@ -1807,7 +1806,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));
|
offset= (uint) (filepos % keycache->key_cache_block_size);
|
||||||
/* Read data in key_cache_block_size increments */
|
/* Read data in key_cache_block_size increments */
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -1946,7 +1945,7 @@ int key_cache_insert(KEY_CACHE *keycache,
|
|||||||
int error;
|
int error;
|
||||||
uint offset;
|
uint offset;
|
||||||
|
|
||||||
offset= (uint) (filepos & (keycache->key_cache_block_size-1));
|
offset= (uint) (filepos % keycache->key_cache_block_size);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
keycache_pthread_mutex_lock(&keycache->cache_lock);
|
keycache_pthread_mutex_lock(&keycache->cache_lock);
|
||||||
@@ -2081,7 +2080,7 @@ int key_cache_write(KEY_CACHE *keycache,
|
|||||||
int page_st;
|
int page_st;
|
||||||
uint offset;
|
uint offset;
|
||||||
|
|
||||||
offset= (uint) (filepos & (keycache->key_cache_block_size-1));
|
offset= (uint) (filepos % keycache->key_cache_block_size);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
keycache_pthread_mutex_lock(&keycache->cache_lock);
|
keycache_pthread_mutex_lock(&keycache->cache_lock);
|
||||||
|
@@ -88,6 +88,7 @@ my_off_t my_tell(File fd, myf MyFlags __attribute__((unused)))
|
|||||||
os_off_t pos;
|
os_off_t pos;
|
||||||
DBUG_ENTER("my_tell");
|
DBUG_ENTER("my_tell");
|
||||||
DBUG_PRINT("my",("Fd: %d MyFlags: %d",fd, MyFlags));
|
DBUG_PRINT("my",("Fd: %d MyFlags: %d",fd, MyFlags));
|
||||||
|
DBUG_ASSERT(fd >= 0);
|
||||||
#ifdef HAVE_TELL
|
#ifdef HAVE_TELL
|
||||||
pos=tell(fd);
|
pos=tell(fd);
|
||||||
#else
|
#else
|
||||||
|
@@ -178,6 +178,13 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count,
|
|||||||
}
|
}
|
||||||
else if (rc == 1) /* aborted */
|
else if (rc == 1) /* aborted */
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
reset_lock_data is required here. If thr_multi_lock fails it
|
||||||
|
resets lock type for tables, which were locked before (and
|
||||||
|
including) one that caused error. Lock type for other tables
|
||||||
|
preserved.
|
||||||
|
*/
|
||||||
|
reset_lock_data(sql_lock);
|
||||||
thd->some_tables_deleted=1; // Try again
|
thd->some_tables_deleted=1; // Try again
|
||||||
sql_lock->lock_count= 0; // Locks are already freed
|
sql_lock->lock_count= 0; // Locks are already freed
|
||||||
}
|
}
|
||||||
|
@@ -5827,7 +5827,7 @@ log and this option does nothing anymore.",
|
|||||||
(gptr*) &dflt_key_cache_var.param_block_size,
|
(gptr*) &dflt_key_cache_var.param_block_size,
|
||||||
(gptr*) 0,
|
(gptr*) 0,
|
||||||
0, (GET_ULONG | GET_ASK_ADDR), REQUIRED_ARG,
|
0, (GET_ULONG | GET_ASK_ADDR), REQUIRED_ARG,
|
||||||
KEY_CACHE_BLOCK_SIZE , 512, 1024*16, MALLOC_OVERHEAD, 512, 0},
|
KEY_CACHE_BLOCK_SIZE, 512, 1024 * 16, 0, 512, 0},
|
||||||
{"key_cache_division_limit", OPT_KEY_CACHE_DIVISION_LIMIT,
|
{"key_cache_division_limit", OPT_KEY_CACHE_DIVISION_LIMIT,
|
||||||
"The minimum percentage of warm blocks in key cache",
|
"The minimum percentage of warm blocks in key cache",
|
||||||
(gptr*) &dflt_key_cache_var.param_division_limit,
|
(gptr*) &dflt_key_cache_var.param_division_limit,
|
||||||
|
Reference in New Issue
Block a user