Commit 06a45722 authored by Michael Widenius's avatar Michael Widenius

Automatic merge

parents 4339204c 7cf51004
...@@ -270,6 +270,7 @@ extern size_t sf_malloc_cur_memory, sf_malloc_max_memory; ...@@ -270,6 +270,7 @@ extern size_t sf_malloc_cur_memory, sf_malloc_max_memory;
extern ulong my_default_record_cache_size; extern ulong my_default_record_cache_size;
extern my_bool NEAR my_disable_locking,NEAR my_disable_async_io, extern my_bool NEAR my_disable_locking,NEAR my_disable_async_io,
NEAR my_disable_flush_key_blocks, NEAR my_disable_symlinks; NEAR my_disable_flush_key_blocks, NEAR my_disable_symlinks;
extern my_bool my_disable_sync;
extern char wild_many,wild_one,wild_prefix; extern char wild_many,wild_one,wild_prefix;
extern const char *charsets_dir; extern const char *charsets_dir;
/* from default.c */ /* from default.c */
......
...@@ -1799,6 +1799,7 @@ sub mysql_fix_arguments () { ...@@ -1799,6 +1799,7 @@ sub mysql_fix_arguments () {
mtr_add_arg($args, "--basedir=%s", $basedir); mtr_add_arg($args, "--basedir=%s", $basedir);
mtr_add_arg($args, "--bindir=%s", $path_client_bindir); mtr_add_arg($args, "--bindir=%s", $path_client_bindir);
mtr_add_arg($args, "--verbose"); mtr_add_arg($args, "--verbose");
mtr_add_arg($args, "--sync-sys=0"); # Speed up test suite
return mtr_args2str($exe, @$args); return mtr_args2str($exe, @$args);
} }
......
...@@ -119,6 +119,7 @@ ulonglong query_performance_frequency, query_performance_offset; ...@@ -119,6 +119,7 @@ ulonglong query_performance_frequency, query_performance_offset;
/* How to disable options */ /* How to disable options */
my_bool NEAR my_disable_locking=0; my_bool NEAR my_disable_locking=0;
my_bool NEAR my_disable_sync=0;
my_bool NEAR my_disable_async_io=0; my_bool NEAR my_disable_async_io=0;
my_bool NEAR my_disable_flush_key_blocks=0; my_bool NEAR my_disable_flush_key_blocks=0;
my_bool NEAR my_disable_symlinks=0; my_bool NEAR my_disable_symlinks=0;
......
...@@ -48,6 +48,9 @@ int my_sync(File fd, myf my_flags) ...@@ -48,6 +48,9 @@ int my_sync(File fd, myf my_flags)
DBUG_ENTER("my_sync"); DBUG_ENTER("my_sync");
DBUG_PRINT("my",("fd: %d my_flags: %d", fd, my_flags)); DBUG_PRINT("my",("fd: %d my_flags: %d", fd, my_flags));
if (my_disable_sync)
DBUG_RETURN(0);
statistic_increment(my_sync_count,&THR_LOCK_open); statistic_increment(my_sync_count,&THR_LOCK_open);
do do
{ {
......
...@@ -429,6 +429,7 @@ static bool volatile ready_to_exit; ...@@ -429,6 +429,7 @@ static bool volatile ready_to_exit;
static my_bool opt_debugging= 0, opt_external_locking= 0, opt_console= 0; static my_bool opt_debugging= 0, opt_external_locking= 0, opt_console= 0;
static my_bool opt_short_log_format= 0; static my_bool opt_short_log_format= 0;
static my_bool opt_ignore_wrong_options= 0, opt_expect_abort= 0; static my_bool opt_ignore_wrong_options= 0, opt_expect_abort= 0;
static my_bool opt_sync= 0;
static uint kill_cached_threads, wake_thread; static uint kill_cached_threads, wake_thread;
ulong thread_created; ulong thread_created;
uint thread_handling; uint thread_handling;
...@@ -5945,7 +5946,7 @@ enum options_mysqld ...@@ -5945,7 +5946,7 @@ enum options_mysqld
OPT_RANGE_ALLOC_BLOCK_SIZE, OPT_ALLOW_SUSPICIOUS_UDFS, OPT_RANGE_ALLOC_BLOCK_SIZE, OPT_ALLOW_SUSPICIOUS_UDFS,
OPT_QUERY_ALLOC_BLOCK_SIZE, OPT_QUERY_PREALLOC_SIZE, OPT_QUERY_ALLOC_BLOCK_SIZE, OPT_QUERY_PREALLOC_SIZE,
OPT_TRANS_ALLOC_BLOCK_SIZE, OPT_TRANS_PREALLOC_SIZE, OPT_TRANS_ALLOC_BLOCK_SIZE, OPT_TRANS_PREALLOC_SIZE,
OPT_SYNC_FRM, OPT_SYNC_BINLOG, OPT_SYNC_FRM, OPT_SYNC_BINLOG, OPT_SYNC,
OPT_SYNC_REPLICATION, OPT_SYNC_REPLICATION,
OPT_SYNC_REPLICATION_SLAVE_ID, OPT_SYNC_REPLICATION_SLAVE_ID,
OPT_SYNC_REPLICATION_TIMEOUT, OPT_SYNC_REPLICATION_TIMEOUT,
...@@ -7474,6 +7475,10 @@ thread is in the relay logs.", ...@@ -7474,6 +7475,10 @@ thread is in the relay logs.",
{"sync-frm", OPT_SYNC_FRM, "Sync .frm to disk on create. Enabled by default.", {"sync-frm", OPT_SYNC_FRM, "Sync .frm to disk on create. Enabled by default.",
&opt_sync_frm, &opt_sync_frm, 0, GET_BOOL, NO_ARG, 1, 0, &opt_sync_frm, &opt_sync_frm, 0, GET_BOOL, NO_ARG, 1, 0,
0, 0, 0, 0}, 0, 0, 0, 0},
{"sync-sys", OPT_SYNC,
"Enable/disable system sync calls. Should only be turned off when running "
"tests or debugging!!",
&opt_sync, &opt_sync, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
{"table_cache", OPT_TABLE_OPEN_CACHE, {"table_cache", OPT_TABLE_OPEN_CACHE,
"Deprecated; use --table_open_cache instead.", "Deprecated; use --table_open_cache instead.",
&table_cache_size, &table_cache_size, 0, GET_ULONG, &table_cache_size, &table_cache_size, 0, GET_ULONG,
...@@ -9230,6 +9235,7 @@ static int get_options(int *argc,char **argv) ...@@ -9230,6 +9235,7 @@ static int get_options(int *argc,char **argv)
In most cases the global variables will not be used In most cases the global variables will not be used
*/ */
my_disable_locking= myisam_single_user= test(opt_external_locking == 0); my_disable_locking= myisam_single_user= test(opt_external_locking == 0);
my_disable_sync= opt_sync == 0;
my_default_record_cache_size=global_system_variables.read_buff_size; my_default_record_cache_size=global_system_variables.read_buff_size;
myisam_max_temp_length= myisam_max_temp_length=
(my_off_t) global_system_variables.myisam_max_sort_file_size; (my_off_t) global_system_variables.myisam_max_sort_file_size;
......
...@@ -165,7 +165,7 @@ command. Not tested on Windows. */ ...@@ -165,7 +165,7 @@ command. Not tested on Windows. */
#define UNIV_COMPILE_TEST_FUNCS #define UNIV_COMPILE_TEST_FUNCS
*/ */
#if defined HAVE_VALGRIND #if defined(HAVE_valgrind)&& defined(HAVE_VALGRIND_MEMCHECK_H)
# define UNIV_DEBUG_VALGRIND # define UNIV_DEBUG_VALGRIND
#endif /* HAVE_VALGRIND */ #endif /* HAVE_VALGRIND */
#if 0 #if 0
......
...@@ -494,7 +494,8 @@ my_bool _ma_log_add(MARIA_PAGE *ma_page, ...@@ -494,7 +494,8 @@ my_bool _ma_log_add(MARIA_PAGE *ma_page,
my_bool handle_overflow __attribute__ ((unused))) my_bool handle_overflow __attribute__ ((unused)))
{ {
LSN lsn; LSN lsn;
uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 3 + 3 + 3 + 3 + 7 + 2]; uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 2 + 3 + 3 + 3 + 3 + 7 +
2];
uchar *log_pos; uchar *log_pos;
uchar *buff= ma_page->buff; uchar *buff= ma_page->buff;
LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 3]; LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 3];
...@@ -509,6 +510,7 @@ my_bool _ma_log_add(MARIA_PAGE *ma_page, ...@@ -509,6 +510,7 @@ my_bool _ma_log_add(MARIA_PAGE *ma_page,
(ulong) ma_page->pos, org_page_length, changed_length, (ulong) ma_page->pos, org_page_length, changed_length,
move_length)); move_length));
DBUG_ASSERT(info->s->now_transactional); DBUG_ASSERT(info->s->now_transactional);
DBUG_ASSERT(move_length <= (int) changed_length);
/* /*
Write REDO entry that contains the logical operations we need Write REDO entry that contains the logical operations we need
...@@ -519,6 +521,11 @@ my_bool _ma_log_add(MARIA_PAGE *ma_page, ...@@ -519,6 +521,11 @@ my_bool _ma_log_add(MARIA_PAGE *ma_page,
page_store(log_pos, page_pos); page_store(log_pos, page_pos);
log_pos+= PAGE_STORE_SIZE; log_pos+= PAGE_STORE_SIZE;
#ifdef EXTRA_DEBUG_KEY_CHANGES
*log_pos++= KEY_OP_DEBUG;
*log_pos++= KEY_OP_DEBUG_LOG_ADD;
#endif
/* Store keypage_flag */ /* Store keypage_flag */
*log_pos++= KEY_OP_SET_PAGEFLAG; *log_pos++= KEY_OP_SET_PAGEFLAG;
*log_pos++= buff[KEYPAGE_TRANSFLAG_OFFSET]; *log_pos++= buff[KEYPAGE_TRANSFLAG_OFFSET];
...@@ -533,21 +540,31 @@ my_bool _ma_log_add(MARIA_PAGE *ma_page, ...@@ -533,21 +540,31 @@ my_bool _ma_log_add(MARIA_PAGE *ma_page,
DBUG_ASSERT(handle_overflow); DBUG_ASSERT(handle_overflow);
if (offset + changed_length > page_length) if (offset + changed_length > page_length)
{ {
/* Log that data changed to end of page */
changed_length= page_length - offset; changed_length= page_length - offset;
move_length= 0; move_length= 0;
/* Set page to max length */
org_page_length= page_length;
*log_pos++= KEY_OP_MAX_PAGELENGTH;
} }
else else
{ {
/* They key will not be part of the page ; Don't log it */
uint diff= org_page_length + move_length - page_length; uint diff= org_page_length + move_length - page_length;
log_pos[0]= KEY_OP_DEL_SUFFIX; log_pos[0]= KEY_OP_DEL_SUFFIX;
int2store(log_pos+1, diff); int2store(log_pos+1, diff);
log_pos+= 3; log_pos+= 3;
org_page_length= page_length - move_length; org_page_length-= diff;
DBUG_ASSERT(org_page_length == page_length - move_length);
} }
DBUG_ASSERT(offset != org_page_length);
} }
if (offset == org_page_length) if (offset == org_page_length)
{
DBUG_ASSERT(move_length == (int) changed_length);
log_pos[0]= KEY_OP_ADD_SUFFIX; log_pos[0]= KEY_OP_ADD_SUFFIX;
}
else else
{ {
log_pos[0]= KEY_OP_OFFSET; log_pos[0]= KEY_OP_OFFSET;
...@@ -832,6 +849,8 @@ err: ...@@ -832,6 +849,8 @@ err:
KEY_OP_CHECK 6 page_length[2},CRC Used only when debugging KEY_OP_CHECK 6 page_length[2},CRC Used only when debugging
KEY_OP_COMPACT_PAGE 6 transid KEY_OP_COMPACT_PAGE 6 transid
KEY_OP_SET_PAGEFLAG 1 flag for page KEY_OP_SET_PAGEFLAG 1 flag for page
KEY_OP_MAX_PAGELENGTH 0 Set page to max length
KEY_OP_DEBUG 1 Info where logging was done
@return Operation status @return Operation status
@retval 0 OK @retval 0 OK
...@@ -850,6 +869,7 @@ uint _ma_apply_redo_index(MARIA_HA *info, ...@@ -850,6 +869,7 @@ uint _ma_apply_redo_index(MARIA_HA *info,
const uchar *header_end= header + head_length; const uchar *header_end= header + head_length;
uint page_offset= 0, org_page_length; uint page_offset= 0, org_page_length;
uint nod_flag, page_length, keypage_header, keynr; uint nod_flag, page_length, keypage_header, keynr;
uint max_page_length= share->block_size - KEYPAGE_CHECKSUM_SIZE;
int result; int result;
MARIA_PAGE page; MARIA_PAGE page;
DBUG_ENTER("_ma_apply_redo_index"); DBUG_ENTER("_ma_apply_redo_index");
...@@ -898,7 +918,7 @@ uint _ma_apply_redo_index(MARIA_HA *info, ...@@ -898,7 +918,7 @@ uint _ma_apply_redo_index(MARIA_HA *info,
header+= 2; header+= 2;
DBUG_PRINT("redo", ("key_op_shift: %d", length)); DBUG_PRINT("redo", ("key_op_shift: %d", length));
DBUG_ASSERT(page_offset != 0 && page_offset <= page_length && DBUG_ASSERT(page_offset != 0 && page_offset <= page_length &&
page_length + length < share->block_size); page_length + length <= max_page_length);
if (length < 0) if (length < 0)
bmove(buff + page_offset, buff + page_offset - length, bmove(buff + page_offset, buff + page_offset - length,
...@@ -927,7 +947,7 @@ uint _ma_apply_redo_index(MARIA_HA *info, ...@@ -927,7 +947,7 @@ uint _ma_apply_redo_index(MARIA_HA *info,
insert_length, changed_length)); insert_length, changed_length));
DBUG_ASSERT(insert_length <= changed_length && DBUG_ASSERT(insert_length <= changed_length &&
page_length + changed_length <= share->block_size); page_length + changed_length <= max_page_length);
bmove_upp(buff + page_length + insert_length, buff + page_length, bmove_upp(buff + page_length + insert_length, buff + page_length,
page_length - keypage_header); page_length - keypage_header);
...@@ -954,7 +974,7 @@ uint _ma_apply_redo_index(MARIA_HA *info, ...@@ -954,7 +974,7 @@ uint _ma_apply_redo_index(MARIA_HA *info,
{ {
uint insert_length= uint2korr(header); uint insert_length= uint2korr(header);
DBUG_PRINT("redo", ("key_op_add_prefix: %u", insert_length)); DBUG_PRINT("redo", ("key_op_add_prefix: %u", insert_length));
DBUG_ASSERT(page_length + insert_length <= share->block_size); DBUG_ASSERT(page_length + insert_length <= max_page_length);
memcpy(buff + page_length, header+2, insert_length); memcpy(buff + page_length, header+2, insert_length);
page_length+= insert_length; page_length+= insert_length;
...@@ -983,7 +1003,7 @@ uint _ma_apply_redo_index(MARIA_HA *info, ...@@ -983,7 +1003,7 @@ uint _ma_apply_redo_index(MARIA_HA *info,
page_length - LSN_STORE_SIZE)) page_length - LSN_STORE_SIZE))
{ {
DBUG_PRINT("error", ("page_length %u",page_length)); DBUG_PRINT("error", ("page_length %u",page_length));
DBUG_DUMP("KEY_OP_CHECK bad page", buff, share->block_size); DBUG_DUMP("KEY_OP_CHECK bad page", buff, max_page_length);
DBUG_ASSERT("crc" == "failure in REDO_INDEX"); DBUG_ASSERT("crc" == "failure in REDO_INDEX");
} }
#endif #endif
...@@ -991,6 +1011,14 @@ uint _ma_apply_redo_index(MARIA_HA *info, ...@@ -991,6 +1011,14 @@ uint _ma_apply_redo_index(MARIA_HA *info,
header+= 6; header+= 6;
break; break;
} }
case KEY_OP_DEBUG:
DBUG_PRINT("redo", ("Debug: %u", (uint) header[0]));
header++;
break;
case KEY_OP_MAX_PAGELENGTH:
DBUG_PRINT("redo", ("key_op_max_page_length"));
page_length= max_page_length;
break;
case KEY_OP_MULTI_COPY: /* 9 */ case KEY_OP_MULTI_COPY: /* 9 */
{ {
/* /*
...@@ -1011,7 +1039,7 @@ uint _ma_apply_redo_index(MARIA_HA *info, ...@@ -1011,7 +1039,7 @@ uint _ma_apply_redo_index(MARIA_HA *info,
log_memcpy_length= uint2korr(header); log_memcpy_length= uint2korr(header);
header+= 2; header+= 2;
log_memcpy_end= header + log_memcpy_length; log_memcpy_end= header + log_memcpy_length;
DBUG_ASSERT(full_length < share->block_size); DBUG_ASSERT(full_length <= max_page_length);
while (header < log_memcpy_end) while (header < log_memcpy_end)
{ {
uint to, from; uint to, from;
...@@ -1020,7 +1048,7 @@ uint _ma_apply_redo_index(MARIA_HA *info, ...@@ -1020,7 +1048,7 @@ uint _ma_apply_redo_index(MARIA_HA *info,
from= uint2korr(header); from= uint2korr(header);
header+= 2; header+= 2;
/* "from" is a place in the existing page */ /* "from" is a place in the existing page */
DBUG_ASSERT(max(from, to) < share->block_size); DBUG_ASSERT(max(from, to) < max_page_length);
memcpy(buff + to, buff + from, full_length); memcpy(buff + to, buff + from, full_length);
} }
break; break;
......
...@@ -72,7 +72,8 @@ my_bool _ma_log_add(MARIA_PAGE *page, uint buff_length, uchar *key_pos, ...@@ -72,7 +72,8 @@ my_bool _ma_log_add(MARIA_PAGE *page, uint buff_length, uchar *key_pos,
my_bool handle_overflow); my_bool handle_overflow);
my_bool _ma_log_delete(MARIA_PAGE *page, const uchar *key_pos, my_bool _ma_log_delete(MARIA_PAGE *page, const uchar *key_pos,
uint changed_length, uint move_length); uint changed_length, uint move_length);
my_bool _ma_log_change(MARIA_PAGE *page, const uchar *key_pos, uint length); my_bool _ma_log_change(MARIA_PAGE *page, const uchar *key_pos, uint length,
enum en_key_debug debug_marker);
my_bool _ma_log_new(MARIA_PAGE *page, my_bool root_page); my_bool _ma_log_new(MARIA_PAGE *page, my_bool root_page);
uint _ma_apply_redo_index_new_page(MARIA_HA *info, LSN lsn, uint _ma_apply_redo_index_new_page(MARIA_HA *info, LSN lsn,
......
...@@ -165,7 +165,20 @@ enum en_key_op ...@@ -165,7 +165,20 @@ enum en_key_op
KEY_OP_CHECK, /* For debugging; CRC of used part of page */ KEY_OP_CHECK, /* For debugging; CRC of used part of page */
KEY_OP_MULTI_COPY, /* List of memcpy()s with fixed-len sources in page */ KEY_OP_MULTI_COPY, /* List of memcpy()s with fixed-len sources in page */
KEY_OP_SET_PAGEFLAG, /* Set pageflag from next byte */ KEY_OP_SET_PAGEFLAG, /* Set pageflag from next byte */
KEY_OP_COMPACT_PAGE /* Compact key page */ KEY_OP_COMPACT_PAGE, /* Compact key page */
KEY_OP_MAX_PAGELENGTH, /* Set page to max page length */
KEY_OP_DEBUG /* Entry for storing what triggered redo_index */
};
enum en_key_debug
{
KEY_OP_DEBUG_RTREE_COMBINE,
KEY_OP_DEBUG_RTREE_SPLIT,
KEY_OP_DEBUG_RTREE_SET_KEY,
KEY_OP_DEBUG_FATHER_CHANGED_1,
KEY_OP_DEBUG_FATHER_CHANGED_2,
KEY_OP_DEBUG_LOG_SPLIT,
KEY_OP_DEBUG_LOG_ADD
}; };
......
...@@ -625,7 +625,8 @@ static int maria_rtree_insert_req(MARIA_HA *info, MARIA_KEY *key, ...@@ -625,7 +625,8 @@ static int maria_rtree_insert_req(MARIA_HA *info, MARIA_KEY *key,
{ {
maria_rtree_combine_rect(keyinfo->seg, k, key->data, k, key_length); maria_rtree_combine_rect(keyinfo->seg, k, key->data, k, key_length);
if (share->now_transactional && if (share->now_transactional &&
_ma_log_change(&page, k, key_length)) _ma_log_change(&page, k, key_length,
KEY_OP_DEBUG_RTREE_COMBINE))
goto err; goto err;
page_mark_changed(info, &page); page_mark_changed(info, &page);
if (_ma_write_keypage(&page, PAGECACHE_LOCK_LEFT_WRITELOCKED, if (_ma_write_keypage(&page, PAGECACHE_LOCK_LEFT_WRITELOCKED,
...@@ -652,7 +653,8 @@ static int maria_rtree_insert_req(MARIA_HA *info, MARIA_KEY *key, ...@@ -652,7 +653,8 @@ static int maria_rtree_insert_req(MARIA_HA *info, MARIA_KEY *key,
if (maria_rtree_set_key_mbr(info, &k_key, _ma_kpos(nod_flag, k))) if (maria_rtree_set_key_mbr(info, &k_key, _ma_kpos(nod_flag, k)))
goto err; goto err;
if (share->now_transactional && if (share->now_transactional &&
_ma_log_change(&page, k, key_length)) _ma_log_change(&page, k, key_length,
KEY_OP_DEBUG_RTREE_SPLIT))
goto err; goto err;
/* add new key for new page */ /* add new key for new page */
_ma_kpointer(info, new_key_buff - nod_flag, *new_page); _ma_kpointer(info, new_key_buff - nod_flag, *new_page);
...@@ -964,7 +966,8 @@ static int maria_rtree_delete_req(MARIA_HA *info, const MARIA_KEY *key, ...@@ -964,7 +966,8 @@ static int maria_rtree_delete_req(MARIA_HA *info, const MARIA_KEY *key,
_ma_kpos(nod_flag, k))) _ma_kpos(nod_flag, k)))
goto err; goto err;
if (share->now_transactional && if (share->now_transactional &&
_ma_log_change(&page, k, key->data_length)) _ma_log_change(&page, k, key->data_length,
KEY_OP_DEBUG_RTREE_SET_KEY))
goto err; goto err;
page_mark_changed(info, &page) page_mark_changed(info, &page)
if (_ma_write_keypage(&page, if (_ma_write_keypage(&page,
......
...@@ -1416,7 +1416,8 @@ static int _ma_balance_page(MARIA_HA *info, MARIA_KEYDEF *keyinfo, ...@@ -1416,7 +1416,8 @@ static int _ma_balance_page(MARIA_HA *info, MARIA_KEYDEF *keyinfo,
/* Log changes to father (one level up) page */ /* Log changes to father (one level up) page */
if (share->now_transactional && if (share->now_transactional &&
_ma_log_change(father_page, father_key_pos, k_length)) _ma_log_change(father_page, father_key_pos, k_length,
KEY_OP_DEBUG_FATHER_CHANGED_1))
goto err; goto err;
/* /*
...@@ -1583,7 +1584,8 @@ static int _ma_balance_page(MARIA_HA *info, MARIA_KEYDEF *keyinfo, ...@@ -1583,7 +1584,8 @@ static int _ma_balance_page(MARIA_HA *info, MARIA_KEYDEF *keyinfo,
/* Log changes to father (one level up) page */ /* Log changes to father (one level up) page */
if (share->now_transactional && if (share->now_transactional &&
_ma_log_change(father_page, father_key_pos, k_length)) _ma_log_change(father_page, father_key_pos, k_length,
KEY_OP_DEBUG_FATHER_CHANGED_2))
goto err; goto err;
} }
...@@ -1905,11 +1907,11 @@ my_bool _ma_log_new(MARIA_PAGE *ma_page, my_bool root_page) ...@@ -1905,11 +1907,11 @@ my_bool _ma_log_new(MARIA_PAGE *ma_page, my_bool root_page)
Log when some part of the key page changes Log when some part of the key page changes
*/ */
my_bool _ma_log_change(MARIA_PAGE *ma_page, my_bool _ma_log_change(MARIA_PAGE *ma_page, const uchar *key_pos, uint length,
const uchar *key_pos, uint length) enum en_key_debug debug_marker __attribute__((unused)))
{ {
LSN lsn; LSN lsn;
uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 6 + 7], *log_pos; uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 2 + 6 + 7], *log_pos;
LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 3]; LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 3];
uint offset= (uint) (key_pos - ma_page->buff), translog_parts; uint offset= (uint) (key_pos - ma_page->buff), translog_parts;
uint extra_length= 0; uint extra_length= 0;
...@@ -1919,18 +1921,26 @@ my_bool _ma_log_change(MARIA_PAGE *ma_page, ...@@ -1919,18 +1921,26 @@ my_bool _ma_log_change(MARIA_PAGE *ma_page,
DBUG_PRINT("enter", ("page: %lu length: %u", (ulong) ma_page->pos, length)); DBUG_PRINT("enter", ("page: %lu length: %u", (ulong) ma_page->pos, length));
DBUG_ASSERT(info->s->now_transactional); DBUG_ASSERT(info->s->now_transactional);
DBUG_ASSERT(offset + length <= ma_page->size);
/* Store address of new root page */ /* Store address of new root page */
page= ma_page->pos / info->s->block_size; page= ma_page->pos / info->s->block_size;
page_store(log_data + FILEID_STORE_SIZE, page); page_store(log_data + FILEID_STORE_SIZE, page);
log_pos= log_data+ FILEID_STORE_SIZE + PAGE_STORE_SIZE; log_pos= log_data+ FILEID_STORE_SIZE + PAGE_STORE_SIZE;
#ifdef EXTRA_DEBUG_KEY_CHANGES
(*log_pos++)= KEY_OP_DEBUG;
(*log_pos++)= debug_marker;
#endif
log_pos[0]= KEY_OP_OFFSET; log_pos[0]= KEY_OP_OFFSET;
int2store(log_pos+1, offset); int2store(log_pos+1, offset);
log_pos[3]= KEY_OP_CHANGE; log_pos[3]= KEY_OP_CHANGE;
int2store(log_pos+4, length); int2store(log_pos+4, length);
log_pos+= 6;
log_array[TRANSLOG_INTERNAL_PARTS + 0].str= log_data; log_array[TRANSLOG_INTERNAL_PARTS + 0].str= log_data;
log_array[TRANSLOG_INTERNAL_PARTS + 0].length= sizeof(log_data) - 7; log_array[TRANSLOG_INTERNAL_PARTS + 0].length= (log_pos - log_data);
log_array[TRANSLOG_INTERNAL_PARTS + 1].str= key_pos; log_array[TRANSLOG_INTERNAL_PARTS + 1].str= key_pos;
log_array[TRANSLOG_INTERNAL_PARTS + 1].length= length; log_array[TRANSLOG_INTERNAL_PARTS + 1].length= length;
translog_parts= 2; translog_parts= 2;
...@@ -1941,7 +1951,6 @@ my_bool _ma_log_change(MARIA_PAGE *ma_page, ...@@ -1941,7 +1951,6 @@ my_bool _ma_log_change(MARIA_PAGE *ma_page,
ha_checksum crc; ha_checksum crc;
crc= my_checksum(0, ma_page->buff + LSN_STORE_SIZE, crc= my_checksum(0, ma_page->buff + LSN_STORE_SIZE,
page_length - LSN_STORE_SIZE); page_length - LSN_STORE_SIZE);
log_pos+= 6;
log_pos[0]= KEY_OP_CHECK; log_pos[0]= KEY_OP_CHECK;
int2store(log_pos+1, page_length); int2store(log_pos+1, page_length);
int4store(log_pos+3, crc); int4store(log_pos+3, crc);
...@@ -1987,7 +1996,7 @@ static my_bool _ma_log_split(MARIA_PAGE *ma_page, ...@@ -1987,7 +1996,7 @@ static my_bool _ma_log_split(MARIA_PAGE *ma_page,
uint changed_length) uint changed_length)
{ {
LSN lsn; LSN lsn;
uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 3+3+3+3+3+2 +7]; uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 2 + 3+3+3+3+3+2 +7];
uchar *log_pos; uchar *log_pos;
LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 4]; LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 4];
uint offset= (uint) (key_pos - ma_page->buff); uint offset= (uint) (key_pos - ma_page->buff);
...@@ -2003,6 +2012,11 @@ static my_bool _ma_log_split(MARIA_PAGE *ma_page, ...@@ -2003,6 +2012,11 @@ static my_bool _ma_log_split(MARIA_PAGE *ma_page,
page_store(log_pos, page); page_store(log_pos, page);
log_pos+= PAGE_STORE_SIZE; log_pos+= PAGE_STORE_SIZE;
#ifdef EXTRA_DEBUG_KEY_CHANGES
(*log_pos++)= KEY_OP_DEBUG;
(*log_pos++)= KEY_OP_DEBUG_LOG_SPLIT;
#endif
if (new_length <= offset || !key_pos) if (new_length <= offset || !key_pos)
{ {
/* /*
......
...@@ -168,7 +168,7 @@ command. Not tested on Windows. */ ...@@ -168,7 +168,7 @@ command. Not tested on Windows. */
#define UNIV_COMPILE_TEST_FUNCS #define UNIV_COMPILE_TEST_FUNCS
*/ */
#ifdef HAVE_valgrind #if defined(HAVE_valgrind)&& defined(HAVE_VALGRIND_MEMCHECK_H)
# define UNIV_DEBUG_VALGRIND # define UNIV_DEBUG_VALGRIND
#endif /* HAVE_valgrind */ #endif /* HAVE_valgrind */
#if 0 #if 0
......
...@@ -81,14 +81,14 @@ char *longlong2str(longlong val,char *dst,int radix, int upcase) ...@@ -81,14 +81,14 @@ char *longlong2str(longlong val,char *dst,int radix, int upcase)
{ {
ulonglong quo= uval/(uint) radix; ulonglong quo= uval/(uint) radix;
uint rem= (uint) (uval- quo* (uint) radix); uint rem= (uint) (uval- quo* (uint) radix);
*--p = _dig_vec[rem]; *--p = dig_vec[rem];
uval= quo; uval= quo;
} }
long_val= (long) uval; long_val= (long) uval;
while (long_val != 0) while (long_val != 0)
{ {
long quo= long_val/radix; long quo= long_val/radix;
*--p = _dig_vec[(uchar) (long_val - quo*radix)]; *--p = dig_vec[(uchar) (long_val - quo*radix)];
long_val= quo; long_val= quo;
} }
while ((*dst++ = *p++) != 0) ; while ((*dst++ = *p++) != 0) ;
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
extern char *longlong2str_with_dig_vector(longlong val,char *dst,int radix, extern char *longlong2str_with_dig_vector(longlong val,char *dst,int radix,
const char *dig_vector); const char *dig_vector);
char *longlong2str(longlong val,char *dst,int radix) char *longlong2str(longlong val,char *dst,int radix, int upcase)
{ {
return longlong2str_with_dig_vector(val, dst, radix, _dig_vec_upper); return longlong2str_with_dig_vector(val, dst, radix, upcase ? _dig_vec_upper : _dig_vec_lower);
} }
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