Commit f24e11a2 authored by unknown's avatar unknown

InnoDB: Add diagnostics when tmpfile() fails at start (Bug #3919)


innobase/dict/dict0dict.c:
  Replace tmpfile() with os_file_create_tmpfile()
innobase/include/os0file.h:
  Add os_file_create_tmpfile()
innobase/lock/lock0lock.c:
  Replace tmpfile() with os_file_create_tmpfile()
innobase/os/os0file.c:
  Add os_file_create_tmpfile()
  os_file_handle_error(): remove unused first parameter
parent 25e83bb5
...@@ -642,7 +642,7 @@ dict_init(void) ...@@ -642,7 +642,7 @@ dict_init(void)
rw_lock_create(&dict_operation_lock); rw_lock_create(&dict_operation_lock);
rw_lock_set_level(&dict_operation_lock, SYNC_DICT_OPERATION); rw_lock_set_level(&dict_operation_lock, SYNC_DICT_OPERATION);
dict_foreign_err_file = tmpfile(); dict_foreign_err_file = os_file_create_tmpfile();
mutex_create(&dict_foreign_err_mutex); mutex_create(&dict_foreign_err_mutex);
mutex_set_level(&dict_foreign_err_mutex, SYNC_ANY_LATCH); mutex_set_level(&dict_foreign_err_mutex, SYNC_ANY_LATCH);
} }
......
...@@ -133,6 +133,13 @@ Creates the seek mutexes used in positioned reads and writes. */ ...@@ -133,6 +133,13 @@ Creates the seek mutexes used in positioned reads and writes. */
void void
os_io_init_simple(void); os_io_init_simple(void);
/*===================*/ /*===================*/
/***************************************************************************
Creates a temporary file. In case of error, causes abnormal termination. */
FILE*
os_file_create_tmpfile(void);
/*========================*/
/* out: temporary file handle (never NULL) */
/******************************************************************** /********************************************************************
A simple function to open or create a file. */ A simple function to open or create a file. */
......
...@@ -510,7 +510,7 @@ lock_sys_create( ...@@ -510,7 +510,7 @@ lock_sys_create(
/* hash_create_mutexes(lock_sys->rec_hash, 2, SYNC_REC_LOCK); */ /* hash_create_mutexes(lock_sys->rec_hash, 2, SYNC_REC_LOCK); */
lock_latest_err_file = tmpfile(); lock_latest_err_file = os_file_create_tmpfile();
} }
/************************************************************************* /*************************************************************************
......
...@@ -301,14 +301,11 @@ os_file_handle_error( ...@@ -301,14 +301,11 @@ os_file_handle_error(
/*=================*/ /*=================*/
/* out: TRUE if we should retry the /* out: TRUE if we should retry the
operation */ operation */
os_file_t file, /* in: file pointer */
const char* name, /* in: name of a file or NULL */ const char* name, /* in: name of a file or NULL */
const char* operation)/* in: operation */ const char* operation)/* in: operation */
{ {
ulint err; ulint err;
UT_NOT_USED(file);
err = os_file_get_last_error(); err = os_file_get_last_error();
if (err == OS_FILE_DISK_FULL) { if (err == OS_FILE_DISK_FULL) {
...@@ -374,6 +371,25 @@ os_io_init_simple(void) ...@@ -374,6 +371,25 @@ os_io_init_simple(void)
} }
} }
/***************************************************************************
Creates a temporary file. In case of error, causes abnormal termination. */
FILE*
os_file_create_tmpfile(void)
/*========================*/
/* out: temporary file handle (never NULL) */
{
FILE* file = tmpfile();
if (file == NULL) {
ut_print_timestamp(stderr);
fputs(" InnoDB: Error: unable to create temporary file\n",
stderr);
os_file_handle_error(NULL, "tmpfile");
ut_error;
}
return(file);
}
/******************************************************************** /********************************************************************
A simple function to open or create a file. */ A simple function to open or create a file. */
...@@ -430,7 +446,7 @@ os_file_create_simple( ...@@ -430,7 +446,7 @@ os_file_create_simple(
if (file == INVALID_HANDLE_VALUE) { if (file == INVALID_HANDLE_VALUE) {
*success = FALSE; *success = FALSE;
retry = os_file_handle_error(file, name, retry = os_file_handle_error(name,
create_mode == OS_FILE_OPEN ? create_mode == OS_FILE_OPEN ?
"open" : "create"); "open" : "create");
if (retry) { if (retry) {
...@@ -472,7 +488,7 @@ os_file_create_simple( ...@@ -472,7 +488,7 @@ os_file_create_simple(
if (file == -1) { if (file == -1) {
*success = FALSE; *success = FALSE;
retry = os_file_handle_error(file, name, retry = os_file_handle_error(name,
create_mode == OS_FILE_OPEN ? create_mode == OS_FILE_OPEN ?
"open" : "create"); "open" : "create");
if (retry) { if (retry) {
...@@ -678,7 +694,7 @@ os_file_create( ...@@ -678,7 +694,7 @@ os_file_create(
if (file == INVALID_HANDLE_VALUE) { if (file == INVALID_HANDLE_VALUE) {
*success = FALSE; *success = FALSE;
retry = os_file_handle_error(file, name, retry = os_file_handle_error(name,
create_mode == OS_FILE_OPEN ? create_mode == OS_FILE_OPEN ?
"open" : "create"); "open" : "create");
if (retry) { if (retry) {
...@@ -766,7 +782,7 @@ os_file_create( ...@@ -766,7 +782,7 @@ os_file_create(
if (file == -1) { if (file == -1) {
*success = FALSE; *success = FALSE;
retry = os_file_handle_error(file, name, retry = os_file_handle_error(name,
create_mode == OS_FILE_OPEN ? create_mode == OS_FILE_OPEN ?
"open" : "create"); "open" : "create");
if (retry) { if (retry) {
...@@ -801,7 +817,7 @@ os_file_close( ...@@ -801,7 +817,7 @@ os_file_close(
return(TRUE); return(TRUE);
} }
os_file_handle_error(file, NULL, "close"); os_file_handle_error(NULL, "close");
return(FALSE); return(FALSE);
#else #else
int ret; int ret;
...@@ -809,7 +825,7 @@ os_file_close( ...@@ -809,7 +825,7 @@ os_file_close(
ret = close(file); ret = close(file);
if (ret == -1) { if (ret == -1) {
os_file_handle_error(file, NULL, "close"); os_file_handle_error(NULL, "close");
return(FALSE); return(FALSE);
} }
...@@ -1029,7 +1045,7 @@ os_file_flush( ...@@ -1029,7 +1045,7 @@ os_file_flush(
return(TRUE); return(TRUE);
} }
os_file_handle_error(file, NULL, "flush"); os_file_handle_error(NULL, "flush");
/* It is a fatal error if a file flush does not succeed, because then /* It is a fatal error if a file flush does not succeed, because then
the database can get corrupt on disk */ the database can get corrupt on disk */
...@@ -1063,7 +1079,7 @@ os_file_flush( ...@@ -1063,7 +1079,7 @@ os_file_flush(
fprintf(stderr, fprintf(stderr,
" InnoDB: Error: the OS said file flush did not succeed\n"); " InnoDB: Error: the OS said file flush did not succeed\n");
os_file_handle_error(file, NULL, "flush"); os_file_handle_error(NULL, "flush");
/* It is a fatal error if a file flush does not succeed, because then /* It is a fatal error if a file flush does not succeed, because then
the database can get corrupt on disk */ the database can get corrupt on disk */
...@@ -1323,7 +1339,7 @@ os_file_read( ...@@ -1323,7 +1339,7 @@ os_file_read(
#ifdef __WIN__ #ifdef __WIN__
error_handling: error_handling:
#endif #endif
retry = os_file_handle_error(file, NULL, "read"); retry = os_file_handle_error(NULL, "read");
if (retry) { if (retry) {
goto try_again; goto try_again;
...@@ -2278,7 +2294,7 @@ os_aio( ...@@ -2278,7 +2294,7 @@ os_aio(
os_aio_array_free_slot(array, slot); os_aio_array_free_slot(array, slot);
retry = os_file_handle_error(file, name, retry = os_file_handle_error(name,
type == OS_FILE_READ ? "aio read" : "aio write"); type == OS_FILE_READ ? "aio read" : "aio write");
if (retry) { if (retry) {
...@@ -2378,7 +2394,7 @@ os_aio_windows_handle( ...@@ -2378,7 +2394,7 @@ os_aio_windows_handle(
ut_a(TRUE == os_file_flush(slot->file)); ut_a(TRUE == os_file_flush(slot->file));
} }
} else { } else {
os_file_handle_error(slot->file, slot->name, "Windows aio"); os_file_handle_error(slot->name, "Windows aio");
ret_val = FALSE; ret_val = FALSE;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment