From 3729ba77065b0d69ca6d4c901d14d517913565ca Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Tue, 26 Oct 2004 20:29:11 +0300 Subject: [PATCH 1/2] row0mysql.c: Print more warnings to the .err log if ALTER TABLE ... IMPORT TABLESPACE fails for some reason os0file.c: Do not call exit(1) if os_file_delete() fails; remove unused parameter from handle_error_no_exit() fil0fil.c: Allow DROP TABLE even if the .ibd file for the table does not exist --- innobase/fil/fil0fil.c | 4 ++++ innobase/os/os0file.c | 25 +++++++++++-------------- innobase/row/row0mysql.c | 25 +++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/innobase/fil/fil0fil.c b/innobase/fil/fil0fil.c index c4fc055dcde..98dea14f47b 100644 --- a/innobase/fil/fil0fil.c +++ b/innobase/fil/fil0fil.c @@ -1868,6 +1868,10 @@ try_again: if (success) { success = os_file_delete(path); + + if (!success) { + success = os_file_delete_if_exists(path); + } } if (success) { diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c index f70e8c9b587..5c140e4b798 100644 --- a/innobase/os/os0file.c +++ b/innobase/os/os0file.c @@ -410,14 +410,11 @@ os_file_handle_error_no_exit( /*=========================*/ /* out: TRUE if we should retry the operation */ - os_file_t file, /* in: file pointer */ const char* name, /* in: name of a file or NULL */ const char* operation)/* in: operation */ { ulint err; - UT_NOT_USED(file); - err = os_file_get_last_error(FALSE); if (err == OS_FILE_DISK_FULL) { @@ -624,7 +621,7 @@ os_file_closedir( ret = FindClose(dir); if (!ret) { - os_file_handle_error_no_exit(NULL, NULL, "closedir"); + os_file_handle_error_no_exit(NULL, "closedir"); return(-1); } @@ -636,7 +633,7 @@ os_file_closedir( ret = closedir(dir); if (ret) { - os_file_handle_error_no_exit(0, NULL, "closedir"); + os_file_handle_error_no_exit(NULL, "closedir"); } return(ret); @@ -705,7 +702,7 @@ http://www.mysql.com/doc/en/Windows_symbolic_links.html */ return(1); } else { - os_file_handle_error_no_exit(NULL, dirname, + os_file_handle_error_no_exit(dirname, "readdir_next_file"); return(-1); } @@ -737,7 +734,7 @@ next_file: ret = stat(full_path, &statinfo); if (ret) { - os_file_handle_error_no_exit(0, full_path, "stat"); + os_file_handle_error_no_exit(full_path, "stat"); ut_free(full_path); @@ -1326,7 +1323,7 @@ loop: ret = unlink((const char*)name); if (ret != 0 && errno != ENOENT) { - os_file_handle_error(name, "delete"); + os_file_handle_error_no_exit(name, "delete"); return(FALSE); } @@ -1388,7 +1385,7 @@ loop: ret = unlink((const char*)name); if (ret != 0) { - os_file_handle_error(name, "delete"); + os_file_handle_error_no_exit(name, "delete"); return(FALSE); } @@ -2117,7 +2114,7 @@ try_again: #ifdef __WIN__ error_handling: #endif - retry = os_file_handle_error_no_exit(file, NULL, "read"); + retry = os_file_handle_error_no_exit(NULL, "read"); if (retry) { goto try_again; @@ -2310,7 +2307,7 @@ os_file_status( } else if (ret) { /* file exists, but stat call failed */ - os_file_handle_error_no_exit(0, path, "stat"); + os_file_handle_error_no_exit(path, "stat"); return(FALSE); } @@ -2338,7 +2335,7 @@ os_file_status( } else if (ret) { /* file exists, but stat call failed */ - os_file_handle_error_no_exit(0, path, "stat"); + os_file_handle_error_no_exit(path, "stat"); return(FALSE); } @@ -2381,7 +2378,7 @@ os_file_get_status( } else if (ret) { /* file exists, but stat call failed */ - os_file_handle_error_no_exit(0, path, "stat"); + os_file_handle_error_no_exit(path, "stat"); return(FALSE); } @@ -2412,7 +2409,7 @@ os_file_get_status( } else if (ret) { /* file exists, but stat call failed */ - os_file_handle_error_no_exit(0, path, "stat"); + os_file_handle_error_no_exit(path, "stat"); return(FALSE); } diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index bf4b0f26cbc..241ddc310e8 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -2153,6 +2153,12 @@ row_import_tablespace_for_mysql( success = fil_reset_too_high_lsns(name, current_lsn); if (!success) { + ut_print_timestamp(stderr); + fputs(" InnoDB: Error: cannot reset lsn's in table ", stderr); + ut_print_name(stderr, trx, name); + fputs("\n" + "InnoDB: in ALTER TABLE ... IMPORT TABLESPACE\n", stderr); + err = DB_ERROR; row_mysql_lock_data_dictionary(trx); @@ -2168,6 +2174,14 @@ row_import_tablespace_for_mysql( table = dict_table_get_low(name); if (!table) { + ut_print_timestamp(stderr); + fputs(" InnoDB: table ", stderr); + ut_print_name(stderr, trx, name); + fputs("\n" +"InnoDB: does not exist in the InnoDB data dictionary\n" +"InnoDB: in ALTER TABLE ... IMPORT TABLESPACE\n", + stderr); + err = DB_TABLE_NOT_FOUND; goto funct_exit; @@ -2209,6 +2223,17 @@ row_import_tablespace_for_mysql( table->ibd_file_missing = FALSE; table->tablespace_discarded = FALSE; } else { + if (table->ibd_file_missing) { + ut_print_timestamp(stderr); + fputs( +" InnoDB: cannot find of open in the database directory the .ibd file of\n" +"InnoDB: table ", stderr); + ut_print_name(stderr, trx, name); + fputs("\n" +"InnoDB: in ALTER TABLE ... IMPORT TABLESPACE\n", + stderr); + } + err = DB_ERROR; } From a761a901b4efa238d80a5a64c280e81212696c9e Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Tue, 26 Oct 2004 20:47:23 +0300 Subject: [PATCH 2/2] fil0fil.c: Print to the .err log a more detailed error message if in IMPORT TABLESPACE the .ibd file does not exist --- innobase/fil/fil0fil.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/innobase/fil/fil0fil.c b/innobase/fil/fil0fil.c index 98dea14f47b..7d57468f632 100644 --- a/innobase/fil/fil0fil.c +++ b/innobase/fil/fil0fil.c @@ -2370,6 +2370,16 @@ fil_reset_too_high_lsns( file = os_file_create_simple_no_error_handling(filepath, OS_FILE_OPEN, OS_FILE_READ_WRITE, &success); if (!success) { + /* The following call prints an error message */ + os_file_get_last_error(TRUE); + + ut_print_timestamp(stderr); + + fputs( +" InnoDB: Error: trying to open a table, but could not\n" +"InnoDB: open the tablespace file ", stderr); + ut_print_filename(stderr, filepath); + fputs("!\n", stderr); mem_free(filepath); return(FALSE);