summaryrefslogtreecommitdiff
path: root/storage/maria/ma_blockrec.c
diff options
context:
space:
mode:
authorMichael Widenius <monty@askmonty.org>2010-07-30 10:45:27 +0300
committerMichael Widenius <monty@askmonty.org>2010-07-30 10:45:27 +0300
commitd2f8b7d04503478ab6b6998194a2070891f0c2bb (patch)
tree14754871eed2adea6fdfcc5c3971dabc3ac53093 /storage/maria/ma_blockrec.c
parentcf86a5ae5284c744bc4cc727073387d0799da5c2 (diff)
downloadmariadb-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.c44
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())