mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
30d3d8d3fc
- Ignore CRC errors in REDO for potential new pages - Ignore CRC errors when repairing tables - Don't do readcheck callback on read error - Set my_errno to HA_ERR_WRONG_CRC if we find page with wrong CRC - Check index page for length before calculating CRC to catch bad pages Fixed bugs where we used wrong file descriptor to read/write bitmaps Fixed wrong hash key in 'files_in_flush' Fixed wrong lock method when writing bitmap Fixed some wrong printf statements in check/repair that caused core dumps Fixed argument to translog_page_validator that cause reading of log files to fail Store number of bytes used for delete-linked key pages to be able to use standard index CRC for deleted key pages. Use fast 'dummy' pagecheck callbacks for temporary tables Don't die silently if flush finds pinned pages Give error (for now) if one tries to create a transactional table with fulltext or spatial keys Removed some not needed calls to pagecache_file_init() Added checking of pagecache checksums to ma_test1 and ma_test2 More DBUG Fixed some DBUG_PRINT to be in line with rest of the code include/my_base.h: Added HA_ERR_INTERNAL_ERROR (used for flush with pinned pages) and HA_ERR_WRONG_CRC mysql-test/r/binlog_unsafe.result: Added missing DROP VIEW statement mysql-test/r/maria.result: Added TRANSACTIONAL=0 when testing with fulltext keys Added test that verifies we can't yet create transactional test with fulltext or spatial keys mysql-test/r/ps_maria.result: Added TRANSACTIONAL=0 when testing with fulltext keys mysql-test/t/binlog_unsafe.test: Added missing DROP VIEW statement mysql-test/t/maria.test: Added TRANSACTIONAL=0 when testing with fulltext keys Added test that verifies we can't yet create transactional test with fulltext or spatial keys mysql-test/t/ps_maria.test: Added TRANSACTIONAL=0 when testing with fulltext keys mysys/my_fopen.c: Fd: -> fd: mysys/my_handler.c: Added new error messages mysys/my_lock.c: Fd: -> fd: mysys/my_pread.c: Fd: -> fd: mysys/my_read.c: Fd: -> fd: mysys/my_seek.c: Fd: -> fd: mysys/my_sync.c: Fd: -> fd: mysys/my_write.c: Fd: -> fd: sql/mysqld.cc: Fixed wrong argument to my_uuid_init() sql/sql_plugin.cc: Unified DBUG_PRINT (for convert-dbug-for-diff) storage/maria/ma_bitmap.c: Fixed wrong lock method when writing bitmap Fixed valgrind error Use fast 'dummy' pagecheck callbacks for temporary tables Faster bitmap handling for non transational tables storage/maria/ma_blockrec.c: Fixed that bitmap reading is done with the correct filehandle Handle reading of pages with wrong CRC when page contect doesn't matter Use the page buffer also when we get WRONG CRC or FILE_TOO_SHORT. (Faster and fixed a couple of bugs) storage/maria/ma_check.c: Split long strings for readablity Fixed some wrong printf statements that caused core dumps Use bitmap.file for bitmaps Ignore pages with wrong CRC storage/maria/ma_close.c: More DBUG_PRINT storage/maria/ma_create.c: Give error (for now) if one tries to create a crash safe table with fulltext or spatial keys storage/maria/ma_key_recover.c: Ignore HA_ERR_WRONG_CRC for new pages info->s -> share Store number of bytes used for delete-linked key pages to be able to use standard index CRC for deleted key pages. storage/maria/ma_loghandler.c: Fixed argument to translog_page_validator() storage/maria/ma_open.c: Removed old VMS specific code Added function to setup pagecache callbacks Moved code around to set 'share->temporary' early Removed some not needed calls to pagecache_file_init() storage/maria/ma_page.c: Store number of bytes used for delete-linked key pages to be able to use standard index CRC for deleted key pages. storage/maria/ma_pagecache.c: Don't do readcheck callback on read error Reset PCBLOCK_ERROR in pagecache_unlock_by_link() if we write page Set my_errno to HA_ER_INTERNAL_ERROR if flush() finds pinned pages Don't die silently if flush finds pinned pages. Use correct file descriptor when flushing pages Fixed wrong hash key in 'files_in_flush'; This must be the file descriptor, not the PAGECACHE_FILE as there may be several PAGECACHE_FILE for same file descriptor More DBUG_PRINT storage/maria/ma_pagecrc.c: Removed inline from not tiny static function Set my_errno to HA_ERR_WRONG_CRC if we find page with wrong CRC (Otherwise my_errno may be 0, and a lot of other code will be confused) CRCerror -> error (to keep code uniform) Print crc with %lu, as in my_checksum() uchar* -> uchar * Check index page for length before calculating CRC to catch bad pages Added 'dummy' crc_check and filler functions that are used for temporary tables storage/maria/ma_recovery.c: More DBUG More message to users to give information what phase failed Better error message if recovery failed storage/maria/ma_test1.c: Added checking of page checksums (combined with 'c' to not have to add more test runs) storage/maria/ma_test2.c: Added checking of page checksums (combined with 'c' to not have to add more test runs) storage/maria/maria_chk.c: Fixed wrong argument to _ma_check_print_error() storage/maria/maria_def.h: Added format information to _ma_check_print_xxxx functions uchar* -> uchar *
194 lines
6 KiB
C
194 lines
6 KiB
C
/* Copyright (C) 2000 MySQL AB
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
#include "mysys_priv.h"
|
|
#include "mysys_err.h"
|
|
#include "my_base.h"
|
|
#include <errno.h>
|
|
#ifdef HAVE_PREAD
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
/*
|
|
Read a chunk of bytes from a file from a given position
|
|
|
|
SYNOPSIOS
|
|
my_pread()
|
|
Filedes File decsriptor
|
|
Buffer Buffer to read data into
|
|
Count Number of bytes to read
|
|
offset Position to read from
|
|
MyFlags Flags
|
|
|
|
NOTES
|
|
This differs from the normal pread() call in that we don't care
|
|
to set the position in the file back to the original position
|
|
if the system doesn't support pread().
|
|
|
|
RETURN
|
|
(size_t) -1 Error
|
|
# Number of bytes read
|
|
*/
|
|
|
|
size_t my_pread(File Filedes, uchar *Buffer, size_t Count, my_off_t offset,
|
|
myf MyFlags)
|
|
{
|
|
size_t readbytes;
|
|
int error= 0;
|
|
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));
|
|
for (;;)
|
|
{
|
|
#ifndef __WIN__
|
|
errno=0; /* Linux doesn't reset this */
|
|
#endif
|
|
#ifndef HAVE_PREAD
|
|
pthread_mutex_lock(&my_file_info[Filedes].mutex);
|
|
readbytes= (uint) -1;
|
|
error= (lseek(Filedes, offset, MY_SEEK_SET) == (my_off_t) -1 ||
|
|
(readbytes= read(Filedes, Buffer, Count)) != Count);
|
|
pthread_mutex_unlock(&my_file_info[Filedes].mutex);
|
|
#else
|
|
if ((error= ((readbytes= pread(Filedes, Buffer, Count, offset)) != Count)))
|
|
{
|
|
my_errno= errno;
|
|
if (errno == 0 || (errno == -1 && (MyFlags & (MY_NABP | MY_FNABP))))
|
|
my_errno= HA_ERR_FILE_TOO_SHORT;
|
|
}
|
|
#endif
|
|
if (error || readbytes != Count)
|
|
{
|
|
DBUG_PRINT("warning",("Read only %d bytes off %u from %d, errno: %d",
|
|
(int) readbytes, (uint) Count,Filedes,my_errno));
|
|
#ifdef THREAD
|
|
if ((readbytes == 0 || readbytes == (size_t) -1) && errno == EINTR)
|
|
{
|
|
DBUG_PRINT("debug", ("my_pread() was interrupted and returned %d",
|
|
(int) readbytes));
|
|
continue; /* Interrupted */
|
|
}
|
|
#endif
|
|
if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
|
|
{
|
|
if (readbytes == (size_t) -1)
|
|
my_error(EE_READ, MYF(ME_BELL+ME_WAITTANG),
|
|
my_filename(Filedes),my_errno);
|
|
else if (MyFlags & (MY_NABP | MY_FNABP))
|
|
my_error(EE_EOFERR, MYF(ME_BELL+ME_WAITTANG),
|
|
my_filename(Filedes),my_errno);
|
|
}
|
|
if (readbytes == (size_t) -1 || (MyFlags & (MY_FNABP | MY_NABP)))
|
|
DBUG_RETURN(MY_FILE_ERROR); /* Return with error */
|
|
}
|
|
if (MyFlags & (MY_NABP | MY_FNABP))
|
|
DBUG_RETURN(0); /* Read went ok; Return 0 */
|
|
DBUG_RETURN(readbytes); /* purecov: inspected */
|
|
}
|
|
} /* my_pread */
|
|
|
|
|
|
/*
|
|
Write a chunk of bytes to a file at a given position
|
|
|
|
SYNOPSIOS
|
|
my_pwrite()
|
|
Filedes File decsriptor
|
|
Buffer Buffer to write data from
|
|
Count Number of bytes to write
|
|
offset Position to write to
|
|
MyFlags Flags
|
|
|
|
NOTES
|
|
This differs from the normal pwrite() call in that we don't care
|
|
to set the position in the file back to the original position
|
|
if the system doesn't support pwrite()
|
|
|
|
RETURN
|
|
(size_t) -1 Error
|
|
# Number of bytes read
|
|
*/
|
|
|
|
size_t my_pwrite(int Filedes, const uchar *Buffer, size_t Count,
|
|
my_off_t offset, myf MyFlags)
|
|
{
|
|
size_t writenbytes, written;
|
|
uint errors;
|
|
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));
|
|
errors= 0;
|
|
written= 0;
|
|
|
|
for (;;)
|
|
{
|
|
#ifndef HAVE_PREAD
|
|
int error;
|
|
writenbytes= (size_t) -1;
|
|
pthread_mutex_lock(&my_file_info[Filedes].mutex);
|
|
error= (lseek(Filedes, offset, MY_SEEK_SET) != (my_off_t) -1 &&
|
|
(writenbytes = write(Filedes, Buffer, Count)) == Count);
|
|
pthread_mutex_unlock(&my_file_info[Filedes].mutex);
|
|
if (error)
|
|
break;
|
|
#else
|
|
if ((writenbytes= pwrite(Filedes, Buffer, Count,offset)) == Count)
|
|
break;
|
|
my_errno= errno;
|
|
#endif
|
|
if (writenbytes != (size_t) -1)
|
|
{ /* Safegueard */
|
|
written+=writenbytes;
|
|
Buffer+=writenbytes;
|
|
Count-=writenbytes;
|
|
offset+=writenbytes;
|
|
}
|
|
DBUG_PRINT("error",("Write only %u bytes", (uint) writenbytes));
|
|
#ifndef NO_BACKGROUND
|
|
#ifdef THREAD
|
|
if (my_thread_var->abort)
|
|
MyFlags&= ~ MY_WAIT_IF_FULL; /* End if aborted by user */
|
|
#endif
|
|
if ((my_errno == ENOSPC || my_errno == EDQUOT) &&
|
|
(MyFlags & MY_WAIT_IF_FULL))
|
|
{
|
|
if (!(errors++ % MY_WAIT_GIVE_USER_A_MESSAGE))
|
|
my_error(EE_DISK_FULL,MYF(ME_BELL | ME_NOREFRESH),
|
|
my_filename(Filedes),my_errno,MY_WAIT_FOR_USER_TO_FIX_PANIC);
|
|
VOID(sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC));
|
|
continue;
|
|
}
|
|
if ((writenbytes && writenbytes != (size_t) -1) || my_errno == EINTR)
|
|
continue; /* Retry */
|
|
#endif
|
|
if (MyFlags & (MY_NABP | MY_FNABP))
|
|
{
|
|
if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
|
|
{
|
|
my_error(EE_WRITE, MYF(ME_BELL | ME_WAITTANG),
|
|
my_filename(Filedes),my_errno);
|
|
}
|
|
DBUG_RETURN(MY_FILE_ERROR); /* Error on read */
|
|
}
|
|
else
|
|
break; /* Return bytes written */
|
|
}
|
|
DBUG_EXECUTE_IF("check", my_seek(Filedes, -1, SEEK_SET, MYF(0)););
|
|
if (MyFlags & (MY_NABP | MY_FNABP))
|
|
DBUG_RETURN(0); /* Want only errors */
|
|
DBUG_RETURN(writenbytes+written); /* purecov: inspected */
|
|
} /* my_pwrite */
|