diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2018-01-24 10:46:04 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2018-01-24 11:10:33 +0200 |
commit | c269f1d6feb2e5ac1aeef96fbd3a64d0085c2f7c (patch) | |
tree | 2ca927e6498473d79e36abbf5f4438d3adc1f751 | |
parent | ac3e7f788eced87ea4780584d65f815020f9b31f (diff) | |
download | mariadb-git-c269f1d6feb2e5ac1aeef96fbd3a64d0085c2f7c.tar.gz |
Allocate page_cleaner and page_cleaner.slot[] statically
-rw-r--r-- | storage/innobase/buf/buf0flu.cc | 249 |
1 files changed, 118 insertions, 131 deletions
diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 9807a9696e9..e938c27cfec 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -174,7 +174,7 @@ struct page_cleaner_t { requests for all slots */ ulint flush_pass; /*!< count to finish to flush requests for all slots */ - page_cleaner_slot_t* slots; /*!< pointer to the slots */ + page_cleaner_slot_t slots[MAX_BUFFER_POOLS]; bool is_running; /*!< false if attempt to shutdown */ @@ -185,7 +185,7 @@ struct page_cleaner_t { #endif /* UNIV_DEBUG */ }; -static page_cleaner_t* page_cleaner = NULL; +static page_cleaner_t page_cleaner; #ifdef UNIV_DEBUG my_bool innodb_page_cleaner_disabled_debug; @@ -2514,23 +2514,23 @@ page_cleaner_flush_pages_recommendation( lsn_avg_rate = (lsn_avg_rate + lsn_rate) / 2; /* aggregate stats of all slots */ - mutex_enter(&page_cleaner->mutex); + mutex_enter(&page_cleaner.mutex); - ulint flush_tm = page_cleaner->flush_time; - ulint flush_pass = page_cleaner->flush_pass; + ulint flush_tm = page_cleaner.flush_time; + ulint flush_pass = page_cleaner.flush_pass; - page_cleaner->flush_time = 0; - page_cleaner->flush_pass = 0; + page_cleaner.flush_time = 0; + page_cleaner.flush_pass = 0; ulint lru_tm = 0; ulint list_tm = 0; ulint lru_pass = 0; ulint list_pass = 0; - for (ulint i = 0; i < page_cleaner->n_slots; i++) { + for (ulint i = 0; i < page_cleaner.n_slots; i++) { page_cleaner_slot_t* slot; - slot = &page_cleaner->slots[i]; + slot = &page_cleaner.slots[i]; lru_tm += slot->flush_lru_time; lru_pass += slot->flush_lru_pass; @@ -2543,7 +2543,7 @@ page_cleaner_flush_pages_recommendation( slot->flush_list_pass = 0; } - mutex_exit(&page_cleaner->mutex); + mutex_exit(&page_cleaner.mutex); /* minimum values are 1, to avoid dividing by zero. */ if (lru_tm < 1) { @@ -2584,9 +2584,9 @@ page_cleaner_flush_pages_recommendation( MONITOR_SET(MONITOR_FLUSH_AVG_TIME, flush_tm / flush_pass); MONITOR_SET(MONITOR_FLUSH_ADAPTIVE_AVG_PASS, - list_pass / page_cleaner->n_slots); + list_pass / page_cleaner.n_slots); MONITOR_SET(MONITOR_LRU_BATCH_FLUSH_AVG_PASS, - lru_pass / page_cleaner->n_slots); + lru_pass / page_cleaner.n_slots); MONITOR_SET(MONITOR_FLUSH_AVG_PASS, flush_pass); prev_lsn = cur_lsn; @@ -2630,12 +2630,12 @@ page_cleaner_flush_pages_recommendation( sum_pages_for_lsn += pages_for_lsn; - mutex_enter(&page_cleaner->mutex); - ut_ad(page_cleaner->slots[i].state + mutex_enter(&page_cleaner.mutex); + ut_ad(page_cleaner.slots[i].state == PAGE_CLEANER_STATE_NONE); - page_cleaner->slots[i].n_pages_requested + page_cleaner.slots[i].n_pages_requested = pages_for_lsn / buf_flush_lsn_scan_factor + 1; - mutex_exit(&page_cleaner->mutex); + mutex_exit(&page_cleaner.mutex); } sum_pages_for_lsn /= buf_flush_lsn_scan_factor; @@ -2655,20 +2655,20 @@ page_cleaner_flush_pages_recommendation( } /* Normalize request for each instance */ - mutex_enter(&page_cleaner->mutex); - ut_ad(page_cleaner->n_slots_requested == 0); - ut_ad(page_cleaner->n_slots_flushing == 0); - ut_ad(page_cleaner->n_slots_finished == 0); + mutex_enter(&page_cleaner.mutex); + ut_ad(page_cleaner.n_slots_requested == 0); + ut_ad(page_cleaner.n_slots_flushing == 0); + ut_ad(page_cleaner.n_slots_finished == 0); for (ulint i = 0; i < srv_buf_pool_instances; i++) { /* if REDO has enough of free space, don't care about age distribution of pages */ - page_cleaner->slots[i].n_pages_requested = pct_for_lsn > 30 ? - page_cleaner->slots[i].n_pages_requested + page_cleaner.slots[i].n_pages_requested = pct_for_lsn > 30 ? + page_cleaner.slots[i].n_pages_requested * n_pages / sum_pages_for_lsn + 1 : n_pages / srv_buf_pool_instances; } - mutex_exit(&page_cleaner->mutex); + mutex_exit(&page_cleaner.mutex); MONITOR_SET(MONITOR_FLUSH_N_TO_FLUSH_REQUESTED, n_pages); @@ -2727,25 +2727,18 @@ void buf_flush_page_cleaner_init(void) /*=============================*/ { - ut_ad(page_cleaner == NULL); + ut_ad(!page_cleaner.is_running); - page_cleaner = static_cast<page_cleaner_t*>( - ut_zalloc_nokey(sizeof(*page_cleaner))); + mutex_create(LATCH_ID_PAGE_CLEANER, &page_cleaner.mutex); - mutex_create(LATCH_ID_PAGE_CLEANER, &page_cleaner->mutex); + page_cleaner.is_requested = os_event_create("pc_is_requested"); + page_cleaner.is_finished = os_event_create("pc_is_finished"); - page_cleaner->is_requested = os_event_create("pc_is_requested"); - page_cleaner->is_finished = os_event_create("pc_is_finished"); + page_cleaner.n_slots = static_cast<ulint>(srv_buf_pool_instances); - page_cleaner->n_slots = static_cast<ulint>(srv_buf_pool_instances); + ut_d(page_cleaner.n_disabled_debug = 0); - page_cleaner->slots = static_cast<page_cleaner_slot_t*>( - ut_zalloc_nokey(page_cleaner->n_slots - * sizeof(*page_cleaner->slots))); - - ut_d(page_cleaner->n_disabled_debug = 0); - - page_cleaner->is_running = true; + page_cleaner.is_running = true; } /** @@ -2754,21 +2747,17 @@ static void buf_flush_page_cleaner_close(void) { + ut_ad(!page_cleaner.is_running); + /* waiting for all worker threads exit */ - while (page_cleaner->n_workers > 0) { + while (page_cleaner.n_workers) { os_thread_sleep(10000); } - mutex_destroy(&page_cleaner->mutex); - - ut_free(page_cleaner->slots); + mutex_destroy(&page_cleaner.mutex); - os_event_destroy(page_cleaner->is_finished); - os_event_destroy(page_cleaner->is_requested); - - ut_free(page_cleaner); - - page_cleaner = NULL; + os_event_destroy(page_cleaner.is_finished); + os_event_destroy(page_cleaner.is_requested); } /** @@ -2794,17 +2783,17 @@ pc_request( / srv_buf_pool_instances; } - mutex_enter(&page_cleaner->mutex); + mutex_enter(&page_cleaner.mutex); - ut_ad(page_cleaner->n_slots_requested == 0); - ut_ad(page_cleaner->n_slots_flushing == 0); - ut_ad(page_cleaner->n_slots_finished == 0); + ut_ad(page_cleaner.n_slots_requested == 0); + ut_ad(page_cleaner.n_slots_flushing == 0); + ut_ad(page_cleaner.n_slots_finished == 0); - page_cleaner->requested = (min_n > 0); - page_cleaner->lsn_limit = lsn_limit; + page_cleaner.requested = (min_n > 0); + page_cleaner.lsn_limit = lsn_limit; - for (ulint i = 0; i < page_cleaner->n_slots; i++) { - page_cleaner_slot_t* slot = &page_cleaner->slots[i]; + for (ulint i = 0; i < page_cleaner.n_slots; i++) { + page_cleaner_slot_t* slot = &page_cleaner.slots[i]; ut_ad(slot->state == PAGE_CLEANER_STATE_NONE); @@ -2820,13 +2809,13 @@ pc_request( slot->state = PAGE_CLEANER_STATE_REQUESTED; } - page_cleaner->n_slots_requested = page_cleaner->n_slots; - page_cleaner->n_slots_flushing = 0; - page_cleaner->n_slots_finished = 0; + page_cleaner.n_slots_requested = page_cleaner.n_slots; + page_cleaner.n_slots_flushing = 0; + page_cleaner.n_slots_finished = 0; - os_event_set(page_cleaner->is_requested); + os_event_set(page_cleaner.is_requested); - mutex_exit(&page_cleaner->mutex); + mutex_exit(&page_cleaner.mutex); } /** @@ -2841,16 +2830,16 @@ pc_flush_slot(void) int lru_pass = 0; int list_pass = 0; - mutex_enter(&page_cleaner->mutex); + mutex_enter(&page_cleaner.mutex); - if (!page_cleaner->n_slots_requested) { - os_event_reset(page_cleaner->is_requested); + if (!page_cleaner.n_slots_requested) { + os_event_reset(page_cleaner.is_requested); } else { page_cleaner_slot_t* slot = NULL; ulint i; - for (i = 0; i < page_cleaner->n_slots; i++) { - slot = &page_cleaner->slots[i]; + for (i = 0; i < page_cleaner.n_slots; i++) { + slot = &page_cleaner.slots[i]; if (slot->state == PAGE_CLEANER_STATE_REQUESTED) { break; @@ -2858,26 +2847,26 @@ pc_flush_slot(void) } /* slot should be found because - page_cleaner->n_slots_requested > 0 */ - ut_a(i < page_cleaner->n_slots); + page_cleaner.n_slots_requested > 0 */ + ut_a(i < page_cleaner.n_slots); buf_pool_t* buf_pool = buf_pool_from_array(i); - page_cleaner->n_slots_requested--; - page_cleaner->n_slots_flushing++; + page_cleaner.n_slots_requested--; + page_cleaner.n_slots_flushing++; slot->state = PAGE_CLEANER_STATE_FLUSHING; - if (UNIV_UNLIKELY(!page_cleaner->is_running)) { + if (UNIV_UNLIKELY(!page_cleaner.is_running)) { slot->n_flushed_lru = 0; slot->n_flushed_list = 0; goto finish_mutex; } - if (page_cleaner->n_slots_requested == 0) { - os_event_reset(page_cleaner->is_requested); + if (page_cleaner.n_slots_requested == 0) { + os_event_reset(page_cleaner.is_requested); } - mutex_exit(&page_cleaner->mutex); + mutex_exit(&page_cleaner.mutex); lru_tm = ut_time_ms(); @@ -2887,13 +2876,13 @@ pc_flush_slot(void) lru_tm = ut_time_ms() - lru_tm; lru_pass++; - if (UNIV_UNLIKELY(!page_cleaner->is_running)) { + if (UNIV_UNLIKELY(!page_cleaner.is_running)) { slot->n_flushed_list = 0; goto finish; } /* Flush pages from flush_list if required */ - if (page_cleaner->requested) { + if (page_cleaner.requested) { flush_counters_t n; memset(&n, 0, sizeof(flush_counters_t)); list_tm = ut_time_ms(); @@ -2901,7 +2890,7 @@ pc_flush_slot(void) slot->succeeded_list = buf_flush_do_batch( buf_pool, BUF_FLUSH_LIST, slot->n_pages_requested, - page_cleaner->lsn_limit, + page_cleaner.lsn_limit, &n); slot->n_flushed_list = n.flushed; @@ -2913,10 +2902,10 @@ pc_flush_slot(void) slot->succeeded_list = true; } finish: - mutex_enter(&page_cleaner->mutex); + mutex_enter(&page_cleaner.mutex); finish_mutex: - page_cleaner->n_slots_flushing--; - page_cleaner->n_slots_finished++; + page_cleaner.n_slots_flushing--; + page_cleaner.n_slots_finished++; slot->state = PAGE_CLEANER_STATE_FINISHED; slot->flush_lru_time += lru_tm; @@ -2924,15 +2913,15 @@ finish_mutex: slot->flush_lru_pass += lru_pass; slot->flush_list_pass += list_pass; - if (page_cleaner->n_slots_requested == 0 - && page_cleaner->n_slots_flushing == 0) { - os_event_set(page_cleaner->is_finished); + if (page_cleaner.n_slots_requested == 0 + && page_cleaner.n_slots_flushing == 0) { + os_event_set(page_cleaner.is_finished); } } - ulint ret = page_cleaner->n_slots_requested; + ulint ret = page_cleaner.n_slots_requested; - mutex_exit(&page_cleaner->mutex); + mutex_exit(&page_cleaner.mutex); return(ret); } @@ -2954,16 +2943,16 @@ pc_wait_finished( *n_flushed_lru = 0; *n_flushed_list = 0; - os_event_wait(page_cleaner->is_finished); + os_event_wait(page_cleaner.is_finished); - mutex_enter(&page_cleaner->mutex); + mutex_enter(&page_cleaner.mutex); - ut_ad(page_cleaner->n_slots_requested == 0); - ut_ad(page_cleaner->n_slots_flushing == 0); - ut_ad(page_cleaner->n_slots_finished == page_cleaner->n_slots); + ut_ad(page_cleaner.n_slots_requested == 0); + ut_ad(page_cleaner.n_slots_flushing == 0); + ut_ad(page_cleaner.n_slots_finished == page_cleaner.n_slots); - for (ulint i = 0; i < page_cleaner->n_slots; i++) { - page_cleaner_slot_t* slot = &page_cleaner->slots[i]; + for (ulint i = 0; i < page_cleaner.n_slots; i++) { + page_cleaner_slot_t* slot = &page_cleaner.slots[i]; ut_ad(slot->state == PAGE_CLEANER_STATE_FINISHED); @@ -2976,11 +2965,11 @@ pc_wait_finished( slot->n_pages_requested = 0; } - page_cleaner->n_slots_finished = 0; + page_cleaner.n_slots_finished = 0; - os_event_reset(page_cleaner->is_finished); + os_event_reset(page_cleaner.is_finished); - mutex_exit(&page_cleaner->mutex); + mutex_exit(&page_cleaner.mutex); return(all_succeeded); } @@ -3008,20 +2997,18 @@ static void buf_flush_page_cleaner_disabled_loop(void) { - ut_ad(page_cleaner != NULL); - if (!innodb_page_cleaner_disabled_debug) { /* We return to avoid entering and exiting mutex. */ return; } - mutex_enter(&page_cleaner->mutex); - page_cleaner->n_disabled_debug++; - mutex_exit(&page_cleaner->mutex); + mutex_enter(&page_cleaner.mutex); + page_cleaner.n_disabled_debug++; + mutex_exit(&page_cleaner.mutex); while (innodb_page_cleaner_disabled_debug && srv_shutdown_state == SRV_SHUTDOWN_NONE - && page_cleaner->is_running) { + && page_cleaner.is_running) { os_thread_sleep(100000); /* [A] */ } @@ -3039,9 +3026,9 @@ buf_flush_page_cleaner_disabled_loop(void) Therefore we are waiting in step 2 for this thread exiting here. */ - mutex_enter(&page_cleaner->mutex); - page_cleaner->n_disabled_debug--; - mutex_exit(&page_cleaner->mutex); + mutex_enter(&page_cleaner.mutex); + page_cleaner.n_disabled_debug--; + mutex_exit(&page_cleaner.mutex); } /** Disables page cleaner threads (coordinator and workers). @@ -3057,7 +3044,7 @@ buf_flush_page_cleaner_disabled_debug_update( void* var_ptr, const void* save) { - if (page_cleaner == NULL) { + if (!page_cleaner.is_running) { return; } @@ -3070,9 +3057,9 @@ buf_flush_page_cleaner_disabled_debug_update( /* Enable page cleaner threads. */ while (srv_shutdown_state == SRV_SHUTDOWN_NONE) { - mutex_enter(&page_cleaner->mutex); - const ulint n = page_cleaner->n_disabled_debug; - mutex_exit(&page_cleaner->mutex); + mutex_enter(&page_cleaner.mutex); + const ulint n = page_cleaner.n_disabled_debug; + mutex_exit(&page_cleaner.mutex); /* Check if all threads have been enabled, to avoid problem when we decide to re-disable them soon. */ if (n == 0) { @@ -3097,21 +3084,21 @@ buf_flush_page_cleaner_disabled_debug_update( That's why we have sleep-loop instead of simply waiting on some disabled_debug_event. */ - os_event_set(page_cleaner->is_requested); + os_event_set(page_cleaner.is_requested); - mutex_enter(&page_cleaner->mutex); + mutex_enter(&page_cleaner.mutex); - ut_ad(page_cleaner->n_disabled_debug + ut_ad(page_cleaner.n_disabled_debug <= srv_n_page_cleaners); - if (page_cleaner->n_disabled_debug + if (page_cleaner.n_disabled_debug == srv_n_page_cleaners) { - mutex_exit(&page_cleaner->mutex); + mutex_exit(&page_cleaner.mutex); break; } - mutex_exit(&page_cleaner->mutex); + mutex_exit(&page_cleaner.mutex); os_thread_sleep(100000); } @@ -3265,10 +3252,10 @@ DECLARE_THREAD(buf_flush_page_cleaner_coordinator)(void*) && srv_flush_sync && buf_flush_sync_lsn > 0) { /* woke up for flush_sync */ - mutex_enter(&page_cleaner->mutex); + mutex_enter(&page_cleaner.mutex); lsn_t lsn_limit = buf_flush_sync_lsn; buf_flush_sync_lsn = 0; - mutex_exit(&page_cleaner->mutex); + mutex_exit(&page_cleaner.mutex); /* Request flushing for threads */ pc_request(ULINT_MAX, lsn_limit); @@ -3280,8 +3267,8 @@ DECLARE_THREAD(buf_flush_page_cleaner_coordinator)(void*) /* only coordinator is using these counters, so no need to protect by lock. */ - page_cleaner->flush_time += ut_time_ms() - tm; - page_cleaner->flush_pass++; + page_cleaner.flush_time += ut_time_ms() - tm; + page_cleaner.flush_pass++; /* Wait for all slots to be finished */ ulint n_flushed_lru = 0; @@ -3326,8 +3313,8 @@ DECLARE_THREAD(buf_flush_page_cleaner_coordinator)(void*) /* only coordinator is using these counters, so no need to protect by lock. */ - page_cleaner->flush_time += ut_time_ms() - tm; - page_cleaner->flush_pass++ ; + page_cleaner.flush_time += ut_time_ms() - tm; + page_cleaner.flush_pass++ ; /* Wait for all slots to be finished */ ulint n_flushed_lru = 0; @@ -3473,8 +3460,8 @@ thread_exit: /* All worker threads are waiting for the event here, and no more access to page_cleaner structure by them. Wakes worker threads up just to make them exit. */ - page_cleaner->is_running = false; - os_event_set(page_cleaner->is_requested); + page_cleaner.is_running = false; + os_event_set(page_cleaner.is_requested); buf_flush_page_cleaner_close(); @@ -3501,9 +3488,9 @@ DECLARE_THREAD(buf_flush_page_cleaner_worker)( { my_thread_init(); - mutex_enter(&page_cleaner->mutex); - page_cleaner->n_workers++; - mutex_exit(&page_cleaner->mutex); + mutex_enter(&page_cleaner.mutex); + page_cleaner.n_workers++; + mutex_exit(&page_cleaner.mutex); #ifdef UNIV_LINUX /* linux might be able to set different setting for each thread @@ -3517,20 +3504,20 @@ DECLARE_THREAD(buf_flush_page_cleaner_worker)( #endif /* UNIV_LINUX */ while (true) { - os_event_wait(page_cleaner->is_requested); + os_event_wait(page_cleaner.is_requested); ut_d(buf_flush_page_cleaner_disabled_loop()); - if (!page_cleaner->is_running) { + if (!page_cleaner.is_running) { break; } pc_flush_slot(); } - mutex_enter(&page_cleaner->mutex); - page_cleaner->n_workers--; - mutex_exit(&page_cleaner->mutex); + mutex_enter(&page_cleaner.mutex); + page_cleaner.n_workers--; + mutex_exit(&page_cleaner.mutex); my_thread_end(); @@ -3565,11 +3552,11 @@ buf_flush_request_force( /* adjust based on lsn_avg_rate not to get old */ lsn_t lsn_target = lsn_limit + lsn_avg_rate * 3; - mutex_enter(&page_cleaner->mutex); + mutex_enter(&page_cleaner.mutex); if (lsn_target > buf_flush_sync_lsn) { buf_flush_sync_lsn = lsn_target; } - mutex_exit(&page_cleaner->mutex); + mutex_exit(&page_cleaner.mutex); os_event_set(buf_flush_event); } |