/********************************************************************** Validates the flush list. */ static ibool buf_flush_validate_low(void) /*========================*/ /* out: TRUE if ok */ { buf_block_t* block; dulint om; UT_LIST_VALIDATE(flush_list, buf_block_t, buf_pool->flush_list); block = UT_LIST_GET_FIRST(buf_pool->flush_list); while (block != NULL) { om = block->oldest_modification; ut_a(block->state == BUF_BLOCK_FILE_PAGE); ut_a(ut_dulint_cmp(om, ut_dulint_zero) > 0); block = UT_LIST_GET_NEXT(flush_list, block); if (block) { ut_a(ut_dulint_cmp(om, block->oldest_modification) >= 0); } } return(TRUE); }
/********************************************************************//** Validates a memory pool. @return TRUE if ok */ UNIV_INTERN ibool mem_pool_validate( /*==============*/ mem_pool_t* pool) /*!< in: memory pool */ { mem_area_t* area; mem_area_t* buddy; ulint free; ulint i; mem_pool_mutex_enter(pool); free = 0; for (i = 0; i < 64; i++) { UT_LIST_VALIDATE(free_list, mem_area_t, pool->free_list[i], (void) 0); area = UT_LIST_GET_FIRST(pool->free_list[i]); while (area != NULL) { ut_a(mem_area_get_free(area)); ut_a(mem_area_get_size(area) == ut_2_exp(i)); buddy = mem_area_get_buddy(area, ut_2_exp(i), pool); ut_a(!buddy || !mem_area_get_free(buddy) || (ut_2_exp(i) != mem_area_get_size(buddy))); area = UT_LIST_GET_NEXT(free_list, area); free += ut_2_exp(i); } } ut_a(free + pool->reserved == pool->size); mem_pool_mutex_exit(pool); return(TRUE); }
void buf_flush_write_complete( /*=====================*/ buf_block_t* block) /* in: pointer to the block in question */ { ut_ad(block); #ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); #endif /* UNIV_SYNC_DEBUG */ ut_a(block->state == BUF_BLOCK_FILE_PAGE); block->oldest_modification = ut_dulint_zero; UT_LIST_REMOVE(flush_list, buf_pool->flush_list, block); ut_d(UT_LIST_VALIDATE(flush_list, buf_block_t, buf_pool->flush_list)); (buf_pool->n_flush[block->flush_type])--; if (block->flush_type == BUF_FLUSH_LRU) { /* Put the block to the end of the LRU list to wait to be moved to the free list */ buf_LRU_make_block_old(block); buf_pool->LRU_flush_ended++; } /* fprintf(stderr, "n pending flush %lu\n", buf_pool->n_flush[block->flush_type]); */ if ((buf_pool->n_flush[block->flush_type] == 0) && (buf_pool->init_flush[block->flush_type] == FALSE)) { /* The running flush batch has ended */ os_event_set(buf_pool->no_flush[block->flush_type]); } }
ibool buf_LRU_validate(void) /*==================*/ { buf_block_t* block; ulint old_len; ulint new_len; ulint LRU_pos; ut_ad(buf_pool); mutex_enter(&(buf_pool->mutex)); if (UT_LIST_GET_LEN(buf_pool->LRU) >= BUF_LRU_OLD_MIN_LEN) { ut_a(buf_pool->LRU_old); old_len = buf_pool->LRU_old_len; new_len = 3 * (UT_LIST_GET_LEN(buf_pool->LRU) / 8); ut_a(old_len >= new_len - BUF_LRU_OLD_TOLERANCE); ut_a(old_len <= new_len + BUF_LRU_OLD_TOLERANCE); } UT_LIST_VALIDATE(LRU, buf_block_t, buf_pool->LRU); block = UT_LIST_GET_FIRST(buf_pool->LRU); old_len = 0; while (block != NULL) { ut_a(block->state == BUF_BLOCK_FILE_PAGE); if (block->old) { old_len++; } if (buf_pool->LRU_old && (old_len == 1)) { ut_a(buf_pool->LRU_old == block); } LRU_pos = block->LRU_position; block = UT_LIST_GET_NEXT(LRU, block); if (block) { /* If the following assert fails, it may not be an error: just the buf_pool clock has wrapped around */ ut_a(LRU_pos >= block->LRU_position); } } if (buf_pool->LRU_old) { ut_a(buf_pool->LRU_old_len == old_len); } UT_LIST_VALIDATE(free, buf_block_t, buf_pool->free); block = UT_LIST_GET_FIRST(buf_pool->free); while (block != NULL) { ut_a(block->state == BUF_BLOCK_NOT_USED); block = UT_LIST_GET_NEXT(free, block); } mutex_exit(&(buf_pool->mutex)); return(TRUE); }