diff options
author | unknown <guilhem@gbichot4.local> | 2008-01-29 22:20:59 +0100 |
---|---|---|
committer | unknown <guilhem@gbichot4.local> | 2008-01-29 22:20:59 +0100 |
commit | 2fcff8988aee4f444ed30b3248a60b7ed357bd6c (patch) | |
tree | 2549015abe70820f71758170954350a90193266b /mysys/my_pread.c | |
parent | e4e8418ced94fff9c8b4bd7b8fcf5e2123717f2b (diff) | |
download | mariadb-git-2fcff8988aee4f444ed30b3248a60b7ed357bd6c.tar.gz |
Fix for BUG#34114 "maria_chk reports false error when several tables on
command-line" and BUG#34062 "Maria table corruption on master".
Use 5 bytes (instead of 4) to store page's number in the checkpoint
record, to allow bigger table (1PB with maria-block-size=1kB).
Help pushbuild not run out of memory by moving the portion of
maria-recovery.test which generates lots of data into a -big.test.
mysql-test/r/maria-recovery.result:
result moved
mysql-test/t/maria-recovery.test:
piece which generates much data moved to maria-recovery-big.test
mysys/my_pread.c:
To fix BUG#34062, where a 1.1TB file was generated due to a wrong
pwrite offset, it was useful to not lose precision on 'offset' in
DBUG_PRINT, so that the crazy value is visible.
mysys/my_read.c:
To fix BUG#34062, where a 1.1TB file was generated due to a wrong
pwrite offset, it was useful to not lose precision on 'offset' in
DBUG_PRINT, so that the crazy value is visible.
mysys/my_write.c:
To fix BUG#34062, where a 1.1TB file was generated due to a wrong
pwrite offset, it was useful to not lose precision on 'offset' in
DBUG_PRINT, so that the crazy value is visible.
storage/maria/ha_maria.cc:
When starting a bulk insert, we throw away dirty index pages from the
cache. Unique (non disabled) key insertions thus read out-of-date
pages from the disk leading to BUG#34062 "Maria table corruption on
master": a DELETE in procedure viewer_sp() had deleted all rows of
viewer_tbl2 one by one, putting index page 1 into key_del; that page
was thrown away at start of INSERT SELECT, then the INSERT SELECT
needed a page to insert keys, looked at key_del, found 1, read page 1
from disk, and its out-of-date content was used to set the new value of
key_del (crazy value of 1TB), then a later insertion needed another
index page, tried to read page at this crazy offset and failed, leading
to corruption mark.
The fix is to destroy out-of-date pages and make the state consistent
with that, i.e. call maria_delete_all_rows().
storage/maria/ma_blockrec.c:
Special hook for UNDO_BULK_INSERT
storage/maria/ma_blockrec.h:
special hook for UNDO_BULK_INSERT
storage/maria/ma_check.c:
Fix for BUG#34114 "maria_chk reports false error when several tables on
command-line": if the Nth (on the command line) table was BLOCK_RECORD
it would start checks by using the param->record_checksum computed by
checks of table N-1.
storage/maria/ma_delete_all.c:
comment
storage/maria/ma_loghandler.c:
special hook for UNDO_BULK_INSERT
storage/maria/ma_page.c:
comment
storage/maria/ma_pagecache.c:
page number is 5 bytes in checkpoint record now (allows bigger tables)
storage/maria/ma_recovery.c:
page number is 5 bytes in checkpoint record now
storage/maria/ma_recovery_util.c:
page number is 5 bytes now
storage/maria/ma_write.c:
typo
mysql-test/r/maria-recovery-big.result:
result is correct
mysql-test/t/maria-recovery-big-master.opt:
usual options for recovery tests
mysql-test/t/maria-recovery-big.test:
Moving out the big blob test to a -big test (it exhausts memory when
using /dev/shm on certain machines)
Diffstat (limited to 'mysys/my_pread.c')
-rw-r--r-- | mysys/my_pread.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/mysys/my_pread.c b/mysys/my_pread.c index e0218cd1f1f..cfccc40a782 100644 --- a/mysys/my_pread.c +++ b/mysys/my_pread.c @@ -16,6 +16,7 @@ #include "mysys_priv.h" #include "mysys_err.h" #include "my_base.h" +#include <m_string.h> #include <errno.h> #ifdef HAVE_PREAD #include <unistd.h> @@ -47,10 +48,13 @@ size_t my_pread(File Filedes, uchar *Buffer, size_t Count, my_off_t offset, { size_t readbytes; int error= 0; +#ifndef DBUG_OFF + char llbuf1[22], llbuf2[22]; DBUG_ENTER("my_pread"); - DBUG_PRINT("my",("fd: %d Seek: %lu Buffer: 0x%lx Count: %u MyFlags: %d", - Filedes, (ulong) offset, (long) Buffer, (uint) Count, - MyFlags)); + DBUG_PRINT("my",("fd: %d Seek: %s Buffer: 0x%lx Count: %s MyFlags: %d", + Filedes, ullstr(offset, llbuf1), + (long) Buffer, ullstr(Count, llbuf2), MyFlags)); +#endif for (;;) { #ifndef __WIN__ @@ -127,10 +131,13 @@ size_t my_pwrite(int Filedes, const uchar *Buffer, size_t Count, { size_t writenbytes, written; uint errors; +#ifndef DBUG_OFF + char llbuf1[22], llbuf2[22]; DBUG_ENTER("my_pwrite"); - DBUG_PRINT("my",("fd: %d Seek: %lu Buffer: 0x%lx Count: %u MyFlags: %d", - Filedes, (ulong) offset, (long) Buffer, (uint) Count, - MyFlags)); + DBUG_PRINT("my",("fd: %d Seek: %s Buffer: 0x%lx Count: %s MyFlags: %d", + Filedes, ullstr(offset, llbuf1), + (long) Buffer, ullstr(Count, llbuf2), MyFlags)); +#endif errors= 0; written= 0; |