diff options
author | Michael Widenius <monty@askmonty.org> | 2010-07-30 10:45:27 +0300 |
---|---|---|
committer | Michael Widenius <monty@askmonty.org> | 2010-07-30 10:45:27 +0300 |
commit | d2f8b7d04503478ab6b6998194a2070891f0c2bb (patch) | |
tree | 14754871eed2adea6fdfcc5c3971dabc3ac53093 /storage/maria/ma_blockrec.c | |
parent | cf86a5ae5284c744bc4cc727073387d0799da5c2 (diff) | |
download | mariadb-git-d2f8b7d04503478ab6b6998194a2070891f0c2bb.tar.gz |
Fix for LP#602604: RQG: ma_blockrec.c:6187: _ma_apply_redo_insert_row_head_or_tail: Assertion `0' failed on Maria engine recovery
More DBUG_PRINT (to simplify future debugging)
Aria: Added STATE_IN_REPAIR, which is set on start of repair. This allows us to see if 'crashed' flag was set intentionally.
Aria: Some trivial speedup optimization
Aria: Better warning if table was marked crashed by unfinnished repair
mysql-test/lib/v1/mysql-test-run.pl:
Fix so one can run RQG
mysql-test/suite/maria/r/maria-recovery2.result:
Update for new error message.
mysys/stacktrace.c:
Fixed compiler warning
storage/maria/ha_maria.cc:
More DBUG_PRINT
Added STATE_IN_REPAIR flag, which is set on start of repair. This allows us to see if 'crashed' flag was set intentionally.
Don't log query for dropping temporary table.
storage/maria/ha_maria.h:
Added prototype for drop_table()
storage/maria/ma_blockrec.c:
More DBUG_PRINT
Make read_long_data() inline for most cases. (Trivial speedup optimization)
storage/maria/ma_check.c:
Better warning if table was marked crashed by unfinnished repair
storage/maria/ma_open.c:
More DBUG_PRINT
storage/maria/ma_recovery.c:
Give warning if found crashed table.
Changed warning for tables that can't be opened.
storage/maria/ma_recovery_util.c:
Write warnings to DBUG file
storage/maria/maria_chk.c:
Added STATE_IN_REPAIR flag, which is set on start of repair. This allows us to see if 'crashed' flag was set intentionally.
storage/maria/maria_def.h:
Added maria_mark_in_repair(x)
storage/maria/maria_read_log.c:
Added option: --character-sets-dir
storage/maria/trnman.c:
By default set min_read_from to max value.
This allows us to remove TRN:s from rows during recovery to get more space.
This fixes bug LP#602604: RQG: ma_blockrec.c:6187: _ma_apply_redo_insert_row_head_or_tail: Assertion `0' failed on Maria engine recovery
Diffstat (limited to 'storage/maria/ma_blockrec.c')
-rw-r--r-- | storage/maria/ma_blockrec.c | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/storage/maria/ma_blockrec.c b/storage/maria/ma_blockrec.c index 89701913c9a..2c29fa27278 100644 --- a/storage/maria/ma_blockrec.c +++ b/storage/maria/ma_blockrec.c @@ -1377,7 +1377,8 @@ void _ma_compact_block_page(uchar *buff, uint block_size, uint rownr, uint freed_size= 0; uchar *dir, *end; DBUG_ENTER("_ma_compact_block_page"); - DBUG_PRINT("enter", ("rownr: %u", rownr)); + DBUG_PRINT("enter", ("rownr: %u min_read_from: %lu", rownr, + (ulong) min_read_from)); DBUG_ASSERT(max_entry > 0 && max_entry < (block_size - PAGE_HEADER_SIZE - PAGE_SUFFIX_SIZE) / DIR_ENTRY_SIZE); @@ -3407,13 +3408,14 @@ static my_bool allocate_and_write_block_record(MARIA_HA *info, DBUG_ASSERT(row->checksum == (info->s->calc_checksum)(info, record)); } } + DBUG_PRINT("info", ("rowid: %lu (%lu:%u) length: %u", (ulong) row->lastpos, + (ulong) ma_recordpos_to_page(row->lastpos), + ma_recordpos_to_dir_entry(row->lastpos), + row_pos.length)); if (write_block_record(info, (uchar*) 0, record, row, blocks, blocks->block->org_bitmap_value != 0, &row_pos, undo_lsn, 0)) - goto err; /* Error reading bitmap */ - DBUG_PRINT("exit", ("rowid: %lu (%lu:%u)", (ulong) row->lastpos, - (ulong) ma_recordpos_to_page(row->lastpos), - ma_recordpos_to_dir_entry(row->lastpos))); + goto err; /* Now let checkpoint happen but don't commit */ DBUG_EXECUTE_IF("maria_over_alloc_bitmap", sleep(1000);); DBUG_RETURN(0); @@ -4404,13 +4406,15 @@ crashed: 1 error */ -static my_bool read_long_data(MARIA_HA *info, uchar *to, ulong length, +static my_bool read_long_data2(MARIA_HA *info, uchar *to, ulong length, MARIA_EXTENT_CURSOR *extent, uchar **data, uchar **end_of_data) { - DBUG_ENTER("read_long_data"); + uint left_length; + left_length= (uint) (*end_of_data - *data); + DBUG_ENTER("read_long_data2"); DBUG_PRINT("enter", ("length: %lu left_length: %u", - length, (uint) (*end_of_data - *data))); + length, left_length)); DBUG_ASSERT(*data <= *end_of_data); /* @@ -4422,14 +4426,15 @@ static my_bool read_long_data(MARIA_HA *info, uchar *to, ulong length, This may change in the future, which is why we have the loop written the way it's written. */ - if (extent->first_extent && length > (ulong) (*end_of_data - *data)) + if (extent->first_extent && length > left_length) + { *end_of_data= *data; + left_length= 0; + } for(;;) { - uint left_length; - left_length= (uint) (*end_of_data - *data); - if (likely(left_length >= length)) + if (unlikely(left_length >= length)) { memcpy(to, *data, length); (*data)+= length; @@ -4441,10 +4446,25 @@ static my_bool read_long_data(MARIA_HA *info, uchar *to, ulong length, length-= left_length; if (!(*data= read_next_extent(info, extent, end_of_data))) break; + left_length= (uint) (*end_of_data - *data); } DBUG_RETURN(1); } +static inline my_bool read_long_data(MARIA_HA *info, uchar *to, ulong length, + MARIA_EXTENT_CURSOR *extent, + uchar **data, uchar **end_of_data) +{ + uint left_length= (uint) (*end_of_data - *data); + if (likely(left_length >= length)) + { + memcpy(to, *data, length); + (*data)+= length; + return 0; + } + return read_long_data2(info, to, length, extent, data, end_of_data); +} + /* Read a record from page (helper function for _ma_read_block_record()) |