Commit 7d696c9d authored by Inaam Rana's avatar Inaam Rana

Bug#13636122 THE ORIGINAL TABLE MISSING WHILE EXECUTE THE DDL 'ALTER TABLE ADD COLUMN

rb://914
approved by: Marko Makela

Poll in fil_rename_tablespace() after setting ::stop_ios flag can
result in a hang because the other thread actually dispatching the IO
won't wake IO helper threads or flush the tablespace before starting
wait in fil_mutex_enter_and_prepare_for_io().
parent 4b6e5cf7
...@@ -772,11 +772,6 @@ retry: ...@@ -772,11 +772,6 @@ retry:
return; return;
} }
if (system->n_open < system->max_n_open) {
return;
}
HASH_SEARCH(hash, system->spaces, space_id, space, HASH_SEARCH(hash, system->spaces, space_id, space,
space->id == space_id); space->id == space_id);
if (space != NULL && space->stop_ios) { if (space != NULL && space->stop_ios) {
...@@ -793,6 +788,18 @@ retry: ...@@ -793,6 +788,18 @@ retry:
mutex_exit(&(system->mutex)); mutex_exit(&(system->mutex));
#ifndef UNIV_HOTBACKUP
/* Wake the i/o-handler threads to make sure pending
i/o's are performed */
os_aio_simulated_wake_handler_threads();
os_thread_sleep(20000);
#endif /* UNIV_HOTBACKUP */
/* Flush tablespaces so that we can close modified
files in the LRU list */
fil_flush_file_spaces(FIL_TABLESPACE);
os_thread_sleep(20000); os_thread_sleep(20000);
count2++; count2++;
...@@ -800,6 +807,11 @@ retry: ...@@ -800,6 +807,11 @@ retry:
goto retry; goto retry;
} }
if (system->n_open < system->max_n_open) {
return;
}
/* If the file is already open, no need to do anything; if the space /* If the file is already open, no need to do anything; if the space
does not exist, we handle the situation in the function which called does not exist, we handle the situation in the function which called
this function */ this function */
...@@ -2290,7 +2302,7 @@ fil_rename_tablespace( ...@@ -2290,7 +2302,7 @@ fil_rename_tablespace(
retry: retry:
count++; count++;
if (count > 1000) { if (!(count % 1000)) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Warning: problems renaming ", stderr); fputs(" InnoDB: Warning: problems renaming ", stderr);
ut_print_filename(stderr, old_name); ut_print_filename(stderr, old_name);
......
2012-01-30 The InnoDB Team
* fil/fil0fil.c:
Fix Bug#13636122 THE ORIGINAL TABLE MISSING WHILE EXECUTE THE
DDL 'ALTER TABLE ADD COLUMN'
2012-01-16 The InnoDB Team 2012-01-16 The InnoDB Team
* ibuf/ibuf0ibuf.c: * ibuf/ibuf0ibuf.c:
......
...@@ -918,11 +918,6 @@ retry: ...@@ -918,11 +918,6 @@ retry:
return; return;
} }
if (fil_system->n_open < fil_system->max_n_open) {
return;
}
space = fil_space_get_by_id(space_id); space = fil_space_get_by_id(space_id);
if (space != NULL && space->stop_ios) { if (space != NULL && space->stop_ios) {
...@@ -939,6 +934,25 @@ retry: ...@@ -939,6 +934,25 @@ retry:
mutex_exit(&fil_system->mutex); mutex_exit(&fil_system->mutex);
#ifndef UNIV_HOTBACKUP
/* Wake the i/o-handler threads to make sure pending
i/o's are performed */
os_aio_simulated_wake_handler_threads();
/* The sleep here is just to give IO helper threads a
bit of time to do some work. It is not required that
all IO related to the tablespace being renamed must
be flushed here as we do fil_flush() in
fil_rename_tablespace() as well. */
os_thread_sleep(20000);
#endif /* UNIV_HOTBACKUP */
/* Flush tablespaces so that we can close modified
files in the LRU list */
fil_flush_file_spaces(FIL_TABLESPACE);
os_thread_sleep(20000); os_thread_sleep(20000);
count2++; count2++;
...@@ -946,6 +960,11 @@ retry: ...@@ -946,6 +960,11 @@ retry:
goto retry; goto retry;
} }
if (fil_system->n_open < fil_system->max_n_open) {
return;
}
/* If the file is already open, no need to do anything; if the space /* If the file is already open, no need to do anything; if the space
does not exist, we handle the situation in the function which called does not exist, we handle the situation in the function which called
this function */ this function */
...@@ -2496,7 +2515,7 @@ fil_rename_tablespace( ...@@ -2496,7 +2515,7 @@ fil_rename_tablespace(
retry: retry:
count++; count++;
if (count > 1000) { if (!(count % 1000)) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Warning: problems renaming ", stderr); fputs(" InnoDB: Warning: problems renaming ", stderr);
ut_print_filename(stderr, old_name); ut_print_filename(stderr, old_name);
......
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