mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +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 *
155 lines
4.1 KiB
C
155 lines
4.1 KiB
C
/* Copyright (C) 2003 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 <errno.h>
|
|
|
|
/*
|
|
Sync data in file to disk
|
|
|
|
SYNOPSIS
|
|
my_sync()
|
|
fd File descritor to sync
|
|
my_flags Flags (now only MY_WME is supported)
|
|
|
|
NOTE
|
|
If file system supports its, only file data is synced, not inode data.
|
|
|
|
MY_IGNORE_BADFD is useful when fd is "volatile" - not protected by a
|
|
mutex. In this case by the time of fsync(), fd may be already closed by
|
|
another thread, or even reassigned to a different file. With this flag -
|
|
MY_IGNORE_BADFD - such a situation will not be considered an error.
|
|
(which is correct behaviour, if we know that the other thread synced the
|
|
file before closing)
|
|
|
|
RETURN
|
|
0 ok
|
|
-1 error
|
|
*/
|
|
|
|
int my_sync(File fd, myf my_flags)
|
|
{
|
|
int res;
|
|
DBUG_ENTER("my_sync");
|
|
DBUG_PRINT("my",("fd: %d my_flags: %d", fd, my_flags));
|
|
|
|
do
|
|
{
|
|
#if defined(F_FULLFSYNC)
|
|
/*
|
|
In Mac OS X >= 10.3 this call is safer than fsync() (it forces the
|
|
disk's cache and guarantees ordered writes).
|
|
*/
|
|
if (!(res= fcntl(fd, F_FULLFSYNC, 0)))
|
|
break; /* ok */
|
|
/* Some file systems don't support F_FULLFSYNC and fail above: */
|
|
DBUG_PRINT("info",("fcntl(F_FULLFSYNC) failed, falling back"));
|
|
#endif
|
|
#if defined(HAVE_FDATASYNC)
|
|
res= fdatasync(fd);
|
|
#elif defined(HAVE_FSYNC)
|
|
res= fsync(fd);
|
|
#elif defined(__WIN__)
|
|
res= _commit(fd);
|
|
#else
|
|
#error Cannot find a way to sync a file, durability in danger
|
|
res= 0; /* No sync (strange OS) */
|
|
#endif
|
|
} while (res == -1 && errno == EINTR);
|
|
|
|
if (res)
|
|
{
|
|
int er= errno;
|
|
if (!(my_errno= er))
|
|
my_errno= -1; /* Unknown error */
|
|
if ((my_flags & MY_IGNORE_BADFD) &&
|
|
(er == EBADF || er == EINVAL || er == EROFS))
|
|
{
|
|
DBUG_PRINT("info", ("ignoring errno %d", er));
|
|
res= 0;
|
|
}
|
|
else if (my_flags & MY_WME)
|
|
my_error(EE_SYNC, MYF(ME_BELL+ME_WAITTANG), my_filename(fd), my_errno);
|
|
}
|
|
DBUG_RETURN(res);
|
|
} /* my_sync */
|
|
|
|
|
|
static const char cur_dir_name[]= {FN_CURLIB, 0};
|
|
/*
|
|
Force directory information to disk.
|
|
|
|
SYNOPSIS
|
|
my_sync_dir()
|
|
dir_name the name of the directory
|
|
my_flags flags (MY_WME etc)
|
|
|
|
RETURN
|
|
0 if ok, !=0 if error
|
|
*/
|
|
int my_sync_dir(const char *dir_name, myf my_flags)
|
|
{
|
|
#ifdef NEED_EXPLICIT_SYNC_DIR
|
|
DBUG_ENTER("my_sync_dir");
|
|
DBUG_PRINT("my",("Dir: '%s' my_flags: %d", dir_name, my_flags));
|
|
File dir_fd;
|
|
int res= 0;
|
|
const char *correct_dir_name;
|
|
/* Sometimes the path does not contain an explicit directory */
|
|
correct_dir_name= (dir_name[0] == 0) ? cur_dir_name : dir_name;
|
|
/*
|
|
Syncing a dir may give EINVAL on tmpfs on Linux, which is ok.
|
|
EIO on the other hand is very important. Hence MY_IGNORE_BADFD.
|
|
*/
|
|
if ((dir_fd= my_open(correct_dir_name, O_RDONLY, MYF(my_flags))) >= 0)
|
|
{
|
|
if (my_sync(dir_fd, MYF(my_flags | MY_IGNORE_BADFD)))
|
|
res= 2;
|
|
if (my_close(dir_fd, MYF(my_flags)))
|
|
res= 3;
|
|
}
|
|
else
|
|
res= 1;
|
|
DBUG_RETURN(res);
|
|
#else
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
|
|
/*
|
|
Force directory information to disk.
|
|
|
|
SYNOPSIS
|
|
my_sync_dir_by_file()
|
|
file_name the name of a file in the directory
|
|
my_flags flags (MY_WME etc)
|
|
|
|
RETURN
|
|
0 if ok, !=0 if error
|
|
*/
|
|
int my_sync_dir_by_file(const char *file_name, myf my_flags)
|
|
{
|
|
#ifdef NEED_EXPLICIT_SYNC_DIR
|
|
char dir_name[FN_REFLEN];
|
|
size_t dir_name_length;
|
|
dirname_part(dir_name, file_name, &dir_name_length);
|
|
return my_sync_dir(dir_name, my_flags);
|
|
#else
|
|
return 0;
|
|
#endif
|
|
}
|
|
|