diff --git a/mysql-test/suite/sys_vars/r/innodb_buf_dump_status_frequency_basic.result b/mysql-test/suite/sys_vars/r/innodb_buf_dump_status_frequency_basic.result new file mode 100644 index 00000000000..168509f466c --- /dev/null +++ b/mysql-test/suite/sys_vars/r/innodb_buf_dump_status_frequency_basic.result @@ -0,0 +1,42 @@ +SET @start_innodb_buf_dump_status_frequency = @@global.innodb_buf_dump_status_frequency; +SELECT @start_innodb_buf_dump_status_frequency; +@start_innodb_buf_dump_status_frequency +0 +SELECT COUNT(@@global.innodb_buf_dump_status_frequency); +COUNT(@@global.innodb_buf_dump_status_frequency) +1 +SET @@global.innodb_buf_dump_status_frequency = 20; +SELECT @@global.innodb_buf_dump_status_frequency; +@@global.innodb_buf_dump_status_frequency +20 +SET @@global.innodb_buf_dump_status_frequency = 0; +SELECT @@global.innodb_buf_dump_status_frequency; +@@global.innodb_buf_dump_status_frequency +0 +SET @@global.innodb_buf_dump_status_frequency = 100; +SELECT @@global.innodb_buf_dump_status_frequency; +@@global.innodb_buf_dump_status_frequency +100 +SET @@global.innodb_buf_dump_status_frequency = -1; +Warnings: +Warning 1292 Truncated incorrect innodb_buf_dump_status_frequency value: '-1' +SELECT @@global.innodb_buf_dump_status_frequency; +@@global.innodb_buf_dump_status_frequency +0 +SET @@global.innodb_buf_dump_status_frequency = 101; +Warnings: +Warning 1292 Truncated incorrect innodb_buf_dump_status_frequency value: '101' +SELECT @@global.innodb_buf_dump_status_frequency; +@@global.innodb_buf_dump_status_frequency +100 +SET @@global.innodb_buf_dump_status_frequency = 10.5; +ERROR 42000: Incorrect argument type to variable 'innodb_buf_dump_status_frequency' +SELECT @@global.innodb_buf_dump_status_frequency; +@@global.innodb_buf_dump_status_frequency +100 +SET @@global.innodb_buf_dump_status_frequency = "abc"; +ERROR 42000: Incorrect argument type to variable 'innodb_buf_dump_status_frequency' +SELECT @@global.innodb_buf_dump_status_frequency; +@@global.innodb_buf_dump_status_frequency +100 +SET @@global.innodb_buf_dump_status_frequency = @start_innodb_buf_dump_status_frequency; diff --git a/mysql-test/suite/sys_vars/t/innodb_buf_dump_status_frequency_basic.test b/mysql-test/suite/sys_vars/t/innodb_buf_dump_status_frequency_basic.test new file mode 100644 index 00000000000..c505fbbd3b1 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/innodb_buf_dump_status_frequency_basic.test @@ -0,0 +1,39 @@ +--source include/have_innodb.inc +--source include/load_sysvars.inc + +SET @start_innodb_buf_dump_status_frequency = @@global.innodb_buf_dump_status_frequency; +SELECT @start_innodb_buf_dump_status_frequency; + +SELECT COUNT(@@global.innodb_buf_dump_status_frequency); + +# test valid value +SET @@global.innodb_buf_dump_status_frequency = 20; +SELECT @@global.innodb_buf_dump_status_frequency; + +# test valid min +SET @@global.innodb_buf_dump_status_frequency = 0; +SELECT @@global.innodb_buf_dump_status_frequency; + +# test valid max +SET @@global.innodb_buf_dump_status_frequency = 100; +SELECT @@global.innodb_buf_dump_status_frequency; + +# test invalid value < min +SET @@global.innodb_buf_dump_status_frequency = -1; +SELECT @@global.innodb_buf_dump_status_frequency; + +# test invalid value > max +SET @@global.innodb_buf_dump_status_frequency = 101; +SELECT @@global.innodb_buf_dump_status_frequency; + +# test wrong type +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.innodb_buf_dump_status_frequency = 10.5; +SELECT @@global.innodb_buf_dump_status_frequency; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.innodb_buf_dump_status_frequency = "abc"; +SELECT @@global.innodb_buf_dump_status_frequency; + +SET @@global.innodb_buf_dump_status_frequency = @start_innodb_buf_dump_status_frequency; + diff --git a/storage/innobase/buf/buf0dump.cc b/storage/innobase/buf/buf0dump.cc index 4311e81a0fe..3e3f96280f8 100644 --- a/storage/innobase/buf/buf0dump.cc +++ b/storage/innobase/buf/buf0dump.cc @@ -211,6 +211,8 @@ buf_dump( buf_dump_t* dump; ulint n_pages; ulint j; + ulint limit; + ulint counter; buf_pool = buf_pool_from_array(i); @@ -254,6 +256,9 @@ buf_dump( buf_pool_mutex_exit(buf_pool); + limit = (ulint)((double)n_pages * ((double)srv_buf_dump_status_frequency / (double)100)); + counter = 0; + for (j = 0; j < n_pages && !SHOULD_QUIT(); j++) { ret = fprintf(f, ULINTPF "," ULINTPF "\n", BUF_DUMP_SPACE(dump[j]), @@ -268,7 +273,14 @@ buf_dump( return; } - if (j % 128 == 0) { + counter++; + + /* Print buffer pool dump status only if + srv_buf_dump_status_frequency is > 0 and + we have processed that amount of pages. */ + if (srv_buf_dump_status_frequency && + counter == limit) { + counter = 0; buf_dump_status( STATUS_INFO, "Dumping buffer pool " diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 4c02676be87..fe59d076358 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -18985,6 +18985,14 @@ static MYSQL_SYSVAR_BOOL(disable_background_merge, NULL, NULL, FALSE); #endif /* UNIV_DEBUG || UNIV_IBUF_DEBUG */ +static MYSQL_SYSVAR_ULONG(buf_dump_status_frequency, srv_buf_dump_status_frequency, + PLUGIN_VAR_RQCMDARG, + "A number between [0, 100] that tells how oftern buffer pool dump status " + "in percentages should be printed. E.g. 10 means that buffer pool dump " + "status is printed when every 10% of number of buffer pool pages are " + "dumped. Default is 0 (only start and end status is printed).", + NULL, NULL, 0, 0, 100, 0); + #ifdef WITH_INNODB_DISALLOW_WRITES /******************************************************* * innobase_disallow_writes variable definition * @@ -19485,6 +19493,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= { MYSQL_SYSVAR(debug_force_scrubbing), #endif MYSQL_SYSVAR(instrument_semaphores), + MYSQL_SYSVAR(buf_dump_status_frequency), NULL }; diff --git a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h index 34f8432d19f..2ae5f1ea13e 100644 --- a/storage/innobase/include/srv0srv.h +++ b/storage/innobase/include/srv0srv.h @@ -563,6 +563,9 @@ extern ulong srv_fatal_semaphore_wait_threshold; /** Enable semaphore request instrumentation */ extern my_bool srv_instrument_semaphores; +/** Buffer pool dump status frequence in percentages */ +extern ulong srv_buf_dump_status_frequency; + # ifdef UNIV_PFS_THREAD /* Keys to register InnoDB threads with performance schema */ extern mysql_pfs_key_t buf_page_cleaner_thread_key; diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index 17470855fc4..df7cb656d8c 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -544,6 +544,9 @@ current_time % 5 != 0. */ /** Simulate compression failures. */ UNIV_INTERN uint srv_simulate_comp_failures = 0; +/** Buffer pool dump status frequence in percentages */ +UNIV_INTERN ulong srv_buf_dump_status_frequency = 0; + /** Acquire the system_mutex. */ #define srv_sys_mutex_enter() do { \ mutex_enter(&srv_sys->mutex); \ diff --git a/storage/xtradb/buf/buf0dump.cc b/storage/xtradb/buf/buf0dump.cc index ee772124175..37f0096e40d 100644 --- a/storage/xtradb/buf/buf0dump.cc +++ b/storage/xtradb/buf/buf0dump.cc @@ -211,6 +211,8 @@ buf_dump( buf_dump_t* dump; ulint n_pages; ulint j; + ulint limit; + ulint counter; buf_pool = buf_pool_from_array(i); @@ -254,6 +256,9 @@ buf_dump( mutex_exit(&buf_pool->LRU_list_mutex); + limit = (ulint)((double)n_pages * ((double)srv_buf_dump_status_frequency / (double)100)); + counter = 0; + for (j = 0; j < n_pages && !SHOULD_QUIT(); j++) { ret = fprintf(f, ULINTPF "," ULINTPF "\n", BUF_DUMP_SPACE(dump[j]), @@ -268,7 +273,14 @@ buf_dump( return; } - if (j % 128 == 0) { + counter++; + + /* Print buffer pool dump status only if + srv_buf_dump_status_frequency is > 0 and + we have processed that amount of pages. */ + if (srv_buf_dump_status_frequency && + counter == limit) { + counter = 0; buf_dump_status( STATUS_INFO, "Dumping buffer pool " diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index 91f1ac3ab8f..6f053afc1ca 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -20151,6 +20151,14 @@ static MYSQL_SYSVAR_BOOL(disable_background_merge, NULL, NULL, FALSE); #endif /* UNIV_DEBUG || UNIV_IBUF_DEBUG */ +static MYSQL_SYSVAR_ULONG(buf_dump_status_frequency, srv_buf_dump_status_frequency, + PLUGIN_VAR_RQCMDARG, + "A number between [0, 100] that tells how oftern buffer pool dump status " + "in percentages should be printed. E.g. 10 means that buffer pool dump " + "status is printed when every 10% of number of buffer pool pages are " + "dumped. Default is 0 (only start and end status is printed).", + NULL, NULL, 0, 0, 100, 0); + #ifdef WITH_INNODB_DISALLOW_WRITES /******************************************************* * innobase_disallow_writes variable definition * @@ -20728,6 +20736,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= { MYSQL_SYSVAR(debug_force_scrubbing), #endif MYSQL_SYSVAR(instrument_semaphores), + MYSQL_SYSVAR(buf_dump_status_frequency), NULL }; diff --git a/storage/xtradb/include/srv0srv.h b/storage/xtradb/include/srv0srv.h index b8a57098f40..78a402d488c 100644 --- a/storage/xtradb/include/srv0srv.h +++ b/storage/xtradb/include/srv0srv.h @@ -706,6 +706,9 @@ extern ulong srv_fatal_semaphore_wait_threshold; /** Enable semaphore request instrumentation */ extern my_bool srv_instrument_semaphores; +/** Buffer pool dump status frequence in percentages */ +extern ulong srv_buf_dump_status_frequency; + # ifdef UNIV_PFS_THREAD /* Keys to register InnoDB threads with performance schema */ extern mysql_pfs_key_t buf_page_cleaner_thread_key; diff --git a/storage/xtradb/srv/srv0srv.cc b/storage/xtradb/srv/srv0srv.cc index 7f0150f9f77..5dfb3a35bb9 100644 --- a/storage/xtradb/srv/srv0srv.cc +++ b/storage/xtradb/srv/srv0srv.cc @@ -688,6 +688,9 @@ current_time % 5 != 0. */ #endif /* MEM_PERIODIC_CHECK */ # define SRV_MASTER_DICT_LRU_INTERVAL (47) +/** Buffer pool dump status frequence in percentages */ +UNIV_INTERN ulong srv_buf_dump_status_frequency = 0; + /** Acquire the system_mutex. */ #define srv_sys_mutex_enter() do { \ mutex_enter(&srv_sys->mutex); \