mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
InnoDB: Detect the availability of the Mac OS X fsync() work-around
at run-time, so that an executable compiled on Mac OS X 10.2 can be run on Mac OS X 10.2 (without the work-around) and Mac OS X 10.3 and later with the work-aroud enabled. innobase/include/srv0start.h: Mac OS X: Add srv_have_fullfsync innobase/os/os0file.c: os_file_flush(): Use F_FULLFSYNC on Mac OS X 10.3, but not on 10.2 innobase/srv/srv0start.c: innobase_start_or_create_for_mysql(): When compiled on OS X 10.2, detect if the binary is running on OS X 10.3 or later, and set srv_have_fullfsync accordingly.
This commit is contained in:
@@ -75,6 +75,10 @@ extern dulint srv_start_lsn;
|
|||||||
void set_panic_flag_for_netware(void);
|
void set_panic_flag_for_netware(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_DARWIN_THREADS
|
||||||
|
extern ibool srv_have_fullfsync;
|
||||||
|
#endif
|
||||||
|
|
||||||
extern ulint srv_sizeof_trx_t_in_ha_innodb_cc;
|
extern ulint srv_sizeof_trx_t_in_ha_innodb_cc;
|
||||||
|
|
||||||
extern ibool srv_is_being_started;
|
extern ibool srv_is_being_started;
|
||||||
|
@@ -1763,19 +1763,31 @@ os_file_flush(
|
|||||||
#else
|
#else
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
#if defined(HAVE_DARWIN_THREADS) && defined(F_FULLFSYNC)
|
#if defined(HAVE_DARWIN_THREADS)
|
||||||
|
# ifndef F_FULLFSYNC
|
||||||
|
/* The following definition is from the Mac OS X 10.3 <sys/fcntl.h> */
|
||||||
|
# define F_FULLFSYNC 51 /* fsync + ask the drive to flush to the media */
|
||||||
|
# elif F_FULLFSYNC != 51
|
||||||
|
# error "F_FULLFSYNC != 51: ABI incompatibility with Mac OS X 10.3"
|
||||||
|
# endif
|
||||||
/* Apple has disabled fsync() for internal disk drives in OS X. That
|
/* Apple has disabled fsync() for internal disk drives in OS X. That
|
||||||
caused corruption for a user when he tested a power outage. Let us in
|
caused corruption for a user when he tested a power outage. Let us in
|
||||||
OS X use a nonstandard flush method recommended by an Apple
|
OS X use a nonstandard flush method recommended by an Apple
|
||||||
engineer. */
|
engineer. */
|
||||||
|
|
||||||
ret = fcntl(file, F_FULLFSYNC, NULL);
|
if (!srv_have_fullfsync) {
|
||||||
|
/* If we are not on an operating system that supports this,
|
||||||
if (ret) {
|
then fall back to a plain fsync. */
|
||||||
/* If we are not on a file system that supports this, then
|
|
||||||
fall back to a plain fsync. */
|
|
||||||
|
|
||||||
ret = fsync(file);
|
ret = fsync(file);
|
||||||
|
} else {
|
||||||
|
ret = fcntl(file, F_FULLFSYNC, NULL);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
/* If we are not on a file system that supports this,
|
||||||
|
then fall back to a plain fsync. */
|
||||||
|
ret = fsync(file);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#elif HAVE_FDATASYNC
|
#elif HAVE_FDATASYNC
|
||||||
ret = fdatasync(file);
|
ret = fdatasync(file);
|
||||||
|
@@ -61,6 +61,11 @@ dulint srv_start_lsn;
|
|||||||
/* Log sequence number at shutdown */
|
/* Log sequence number at shutdown */
|
||||||
dulint srv_shutdown_lsn;
|
dulint srv_shutdown_lsn;
|
||||||
|
|
||||||
|
#ifdef HAVE_DARWIN_THREADS
|
||||||
|
# include <sys/utsname.h>
|
||||||
|
ibool srv_have_fullfsync = FALSE;
|
||||||
|
#endif
|
||||||
|
|
||||||
ibool srv_start_raw_disk_in_use = FALSE;
|
ibool srv_start_raw_disk_in_use = FALSE;
|
||||||
|
|
||||||
static ibool srv_start_has_been_called = FALSE;
|
static ibool srv_start_has_been_called = FALSE;
|
||||||
@@ -935,6 +940,28 @@ innobase_start_or_create_for_mysql(void)
|
|||||||
ulint i;
|
ulint i;
|
||||||
ibool srv_file_per_table_original_value = srv_file_per_table;
|
ibool srv_file_per_table_original_value = srv_file_per_table;
|
||||||
mtr_t mtr;
|
mtr_t mtr;
|
||||||
|
#ifdef HAVE_DARWIN_THREADS
|
||||||
|
# ifdef F_FULLFSYNC
|
||||||
|
/* This executable has been compiled on Mac OS X 10.3 or later.
|
||||||
|
Assume that F_FULLFSYNC is available at run-time. */
|
||||||
|
srv_have_fullfsync = TRUE;
|
||||||
|
# else /* F_FULLFSYNC */
|
||||||
|
/* This executable has been compiled on Mac OS X 10.2
|
||||||
|
or earlier. Determine if the executable is running
|
||||||
|
on Mac OS X 10.3 or later. */
|
||||||
|
struct utsname utsname;
|
||||||
|
if (uname(&utsname)) {
|
||||||
|
fputs("InnoDB: cannot determine Mac OS X version!\n", stderr);
|
||||||
|
} else {
|
||||||
|
srv_have_fullfsync = strcmp(utsname.release, "7.") >= 0;
|
||||||
|
}
|
||||||
|
if (!srv_have_fullfsync) {
|
||||||
|
fputs(
|
||||||
|
"InnoDB: On Mac OS X, fsync() may be broken on internal drives,\n"
|
||||||
|
"InnoDB: making transactions unsafe!\n", stderr);
|
||||||
|
}
|
||||||
|
# endif /* F_FULLFSYNC */
|
||||||
|
#endif /* HAVE_DARWIN_THREADS */
|
||||||
|
|
||||||
if (sizeof(ulint) != sizeof(void*)) {
|
if (sizeof(ulint) != sizeof(void*)) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
|
Reference in New Issue
Block a user