Bug #56433 | Auto-extension of InnoDB files | ||
---|---|---|---|
Submitted: | 1 Sep 2010 1:49 | Modified: | 15 Oct 2012 13:48 |
Reporter: | Mark Callaghan | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: InnoDB Plugin storage engine | Severity: | S4 (Feature request) |
Version: | 5.1.50 | OS: | Any |
Assigned to: | Inaam Rana | CPU Architecture: | Any |
Tags: | extend, file, innodb, performance |
[1 Sep 2010 1:49]
Mark Callaghan
[1 Sep 2010 3:51]
Domas Mituzas
and a background thread for non-blocking extending please!!!!! :)
[3 Feb 2011 16:35]
Mark Callaghan
page reads call this and must lock fil_system->mutex, when a file is being extended, those reads block /*******************************************************************//** Returns the version number of a tablespace, -1 if not found. @return version number, -1 if the tablespace does not exist in the memory cache */ UNIV_INTERN ib_int64_t fil_space_get_version( /*==================*/ ulint id) /*!< in: space id */ { fil_space_t* space; ib_int64_t version = -1; ut_ad(fil_system); mutex_enter(&fil_system->mutex); space = fil_space_get_by_id(id); if (space) { version = space->tablespace_version; } mutex_exit(&fil_system->mutex); return(version); } In one example, this is the stack for the thread that holds fil_system->mutex pwrite64,os_file_write,os_aio,fil_extend_space_to_desired_size,fsp_header_write_space_id,fsp_reserve_free_extents,btr_cur_pessimistic_update,row_upd_in_place_in_select,row_upd_step,row_update_for_mysql,ha_innobase::update_row,write_record,mysql_insert,mysql_execute_command,mysql_parse,dispatch_command,handle_one_connection,start_thread,clone many threads attempting reads then block on it pthread_cond_wait@@GLIBC_2.3.2,os_event_wait_low,sync_array_wait_event,mutex_spin_wait,fil_space_get_version,buf_read_page,buf_page_get_gen,btr_cur_search_to_nth_level,row_search_for_mysql,ha_innobase::index_read,create_tmp_field,create_tmp_field,st_select_lex::print,JOIN::optimize,mysql_select,handle_select,mysql_execute_command,mysql_parse,dispatch_command,handle_one_connection,start_thread,clone pthread_cond_wait@@GLIBC_2.3.2,os_event_wait_low,sync_array_wait_event,mutex_spin_wait,trx_undo_assign_undo,trx_undo_report_row_operation,btr_cur_update_in_place,btr_cur_optimistic_update,row_upd_in_place_in_select,row_upd_step,row_update_for_mysql,ha_innobase::update_row,mysql_update,mysql_execute_command,mysql_parse,dispatch_command,handle_one_connection,start_thread,clone pthread_cond_wait@@GLIBC_2.3.2,os_event_wait_low,sync_array_wait_event,mutex_spin_wait,fil_space_get_version,buf_read_page,buf_page_get_gen,btr_cur_search_to_nth_level,btr_estimate_n_rows_in_range,ha_innobase::records_in_range,TRP_ROR_INTERSECT::make_quick,TRP_ROR_INTERSECT::make_quick,TRP_ROR_INTERSECT::make_quick,TRP_ROR_INTERSECT::make_quick,TRP_ROR_INTERSECT::make_quick,SQL_SELECT::test_quick_select,st_select_lex::print,JOIN::optimize,mysql_select,handle_select,mysql_execute_command,mysql_parse,dispatch_command,handle_one_connection,start_thread,clone pthread_cond_wait@@GLIBC_2.3.2,os_event_wait_low,sync_array_wait_event,mutex_spin_wait,fil_space_get_version,buf_read_page,buf_page_get_gen,btr_cur_search_to_nth_level,btr_estimate_n_rows_in_range,ha_innobase::records_in_range,TRP_ROR_INTERSECT::make_quick,TRP_ROR_INTERSECT::make_quick,TRP_ROR_INTERSECT::make_quick,SQL_SELECT::test_quick_select,st_select_lex::print,JOIN::optimize,st_select_lex_unit::exec,mysql_union,handle_select,mysql_execute_command,mysql_parse,dispatch_command,handle_one_connection,start_thread,clone pthread_cond_wait@@GLIBC_2.3.2,os_event_wait_low,sync_array_wait_event,mutex_spin_wait,fil_space_get_version,buf_read_page,buf_page_get_gen,btr_cur_search_to_nth_level,fetch_step,row_search_for_mysql,ha_innobase::index_read,cp_buffer_from_ref,sub_select,sub_select_cache,JOIN::exec,mysql_select,handle_select,mysql_execute_command,mysql_parse,dispatch_command,handle_one_connection,start_thread,clone Those threads don't give up their thread concurrency tickets and other threads get stuck waiting to enter innodb
[5 Feb 2011 2:02]
James Day
Not giving up the tickets looks like a bug. Background extending so a new space chunk is allocated when the final empty one starts being used or something similar looks like a feature request.
[9 Feb 2011 21:49]
Mark Callaghan
I think this patch fixes the stall
Attachment: 0001-s.patch (application/octet-stream, text), 3.59 KiB.
[13 Feb 2011 17:48]
Mark Callaghan
That patch is bad. A new one is in progress.
[22 Feb 2011 1:47]
Yasufumi Kinoshita
simplest fix, I think
Attachment: fix_suggestion_56433.patch (text/x-patch), 2.89 KiB.
[25 Feb 2011 8:35]
Yasufumi Kinoshita
Sorry, my previous patch need to patch also following for UNIV_SYNC_DEBUG --- a/storage/innodb_plugin/sync/sync0sync.c 2011-02-25 14:09:57.710270419 +0900 +++ b/storage/innodb_plugin/sync/sync0sync.c 2011-02-25 14:12:20.138232965 +0900 @@ -1161,6 +1161,7 @@ case SYNC_LOG: case SYNC_THR_LOCAL: case SYNC_ANY_LATCH: + case SYNC_OUTER_ANY_LATCH: case SYNC_TRX_SYS_HEADER: case SYNC_FILE_FORMAT_TAG: case SYNC_DOUBLEWRITE:
[25 Jul 2011 22:32]
James Day
http://blogs.innodb.com/wp/2011/07/reduced-contention-during-datafile-extension/ describes an improvement to this that is in the Summer 2011 labs release. This is not a production release, just a technology demonstration.
[15 Oct 2012 13:48]
Erlend Dahl
Fixed in 5.6.3