Public feed
#893542
#ifndef __WIN__void*#elseulint#endifsrv_buffer_pool_proactive_thread(/*=====================*/ /* out: a dummy parameter */ void* arg __attribute__((unused))) /* in: a dummy parameter required by os_thread_create */{ ibool freed; ulint flushed; ulint free_blocks, threshold, blocks_to_free; ulint target_blocks, chunk_blocks; /*os_thread_exit(NULL);*/#ifdef UNIV_DEBUG_THREAD_CREATION fprintf(stderr, "Buffer pool proactive free thread starts, id %lu\n", os_thread_pf(os_thread_get_curr_id())); fflush(stderr);#endif os_thread_sleep(5000000);loop: fprintf(stderr, "Sleeping for %li ms\n", srv_buffer_pool_proactive_free_interval); fflush(stderr); os_thread_sleep(1000 * srv_buffer_pool_proactive_free_interval); if(!srv_buffer_pool_proactive_free_size) goto loop; target_blocks = srv_buffer_pool_proactive_free_size / UNIV_PAGE_SIZE; chunk_blocks = srv_buffer_pool_proactive_free_chunk / UNIV_PAGE_SIZE; free_blocks = UT_LIST_GET_LEN(buf_pool->free); blocks_to_free = target_blocks - free_blocks; if(chunk_blocks && (blocks_to_free > chunk_blocks)) { blocks_to_free= chunk_blocks; } if(free_blocks < target_blocks) { fprintf(stderr, "\n\nTrying to free %li pages...\n", blocks_to_free); fprintf(stderr, "Before free: free = %6li, target = %6i, total = %6li\n", free_blocks, target_blocks, buf_pool->max_size); fflush(stderr); flushed = buf_flush_batch(BUF_FLUSH_LRU, blocks_to_free, ut_dulint_zero); freed = buf_LRU_search_and_free_block(1, blocks_to_free); fprintf(stderr, "After free : free = %6li, target = %6i, max = %6li, flushed = %6li\n", UT_LIST_GET_LEN(buf_pool->free), target_blocks, buf_pool->max_size, flushed); fflush(stderr); } else { fprintf(stderr, "No free: free = %6li, target = %6i, total = %6li\n", free_blocks, target_blocks, buf_pool->max_size); fflush(stderr); } if (srv_shutdown_state < SRV_SHUTDOWN_CLEANUP) { goto loop; } os_thread_exit(NULL);#ifndef __WIN__ return(NULL);#else return(0);#endif}