📄 tsbuf.c
字号:
/************************************************************************The test module for the file system and buffer manager(c) 1995 Innobase OyCreated 11/16/1995 Heikki Tuuri*************************************************************************/#include "os0thread.h"#include "os0file.h"#include "ut0ut.h"#include "sync0sync.h"#include "mem0mem.h"#include "fil0fil.h"#include "..\buf0buf.h"#include "..\buf0flu.h"#include "..\buf0lru.h"os_file_t files[1000];mutex_t ios_mutex;ulint ios;ulint n[5];/************************************************************************Io-handler thread function. */ulinthandler_thread(/*===========*/ void* arg){ ulint segment; void* mess; ulint i; bool ret; segment = *((ulint*)arg); printf("Thread %lu starts\n", segment); for (i = 0;; i++) { ret = fil_aio_wait(segment, &mess); ut_a(ret); buf_page_io_complete((buf_block_t*)mess); mutex_enter(&ios_mutex); ios++; mutex_exit(&ios_mutex); } return(0);}/************************************************************************Creates the test database files. */void create_db(void)/*===========*/{ ulint i; buf_block_t* block; byte* frame; ulint j; ulint tm, oldtm; oldtm = ut_clock(); for (i = 0; i < 1; i++) { for (j = 0; j < 4096; j++) { block = buf_page_create(i, j); frame = buf_block_get_frame(block); rw_lock_x_lock(buf_page_get_lock(block)); if (j > 0) { fil_page_set_prev(frame, j - 1); } else { fil_page_set_prev(frame, 0); } if (j < 4095) { fil_page_set_next(frame, j + 1); } else { fil_page_set_next(frame, 0); } *((ulint*)(frame + 16)) = j; buf_page_note_modification(block); rw_lock_x_unlock(buf_page_get_lock(block)); buf_page_release(block); } } tm = ut_clock(); printf("Wall clock time for test %lu milliseconds\n", tm - oldtm);/* buf_LRU_print(); */ /* Flush the pool of dirty pages by reading low-offset pages */ for (i = 0; i < 1000; i++) { block = buf_page_get(0, i, NULL); frame = buf_block_get_frame(block); rw_lock_s_lock(buf_page_get_lock(block)); ut_a(*((ulint*)(frame + 16)) == i); rw_lock_s_unlock(buf_page_get_lock(block)); buf_page_release(block); }/* buf_LRU_print(); */ os_thread_sleep(1000000); ut_a(buf_all_freed());} /*************************************************************************Creates the files for the file system test and inserts them tothe file system. */voidcreate_files(void)/*==============*/{ bool ret; ulint i, k; char name[10]; os_thread_t thr[5]; os_thread_id_t id[5]; name[0] = 't'; name[1] = 's'; name[2] = 'f'; name[3] = 'i'; name[4] = 'l'; name[5] = 'e'; name[8] = '\0'; for (k = 0; k < 1; k++) { for (i = 0; i < 1; i++) { name[6] = (char)(k + (ulint)'a'); name[7] = (char)(i + (ulint)'a'); files[i] = os_file_create("j:\\tsfile4", OS_FILE_CREATE, OS_FILE_TABLESPACE, &ret); if (ret == FALSE) { ut_a(os_file_get_last_error() == OS_FILE_ALREADY_EXISTS); files[i] = os_file_create( "j:\\tsfile4", OS_FILE_OPEN, OS_FILE_TABLESPACE, &ret); ut_a(ret); } ret = os_file_set_size(files[i], 4096 * 8192, 0); ut_a(ret); ret = os_file_close(files[i]); ut_a(ret); if (i == 0) { fil_space_create("noname", k, OS_FILE_TABLESPACE); } ut_a(fil_validate()); fil_node_create("j:\\tsfile4", 4096, k); } } ios = 0; mutex_create(&ios_mutex); for (i = 0; i < 5; i++) { n[i] = i; thr[i] = os_thread_create(handler_thread, n + i, id + i); }}/************************************************************************Reads the test database files. */void test1(void)/*=======*/{ ulint i, j, k; buf_block_t* block; byte* frame; ulint tm, oldtm; buf_flush_batch(BUF_FLUSH_LIST, 1000); os_thread_sleep(1000000); buf_all_freed(); oldtm = ut_clock(); for (k = 0; k < 1; k++) { for (i = 0; i < 1; i++) { for (j = 0; j < 409; j++) { block = buf_page_get(i, j, NULL); frame = buf_block_get_frame(block); rw_lock_s_lock(buf_page_get_lock(block)); ut_a(*((ulint*)(frame + 16)) == j); rw_lock_s_unlock(buf_page_get_lock(block)); buf_page_release(block); } } } tm = ut_clock(); printf("Wall clock time for test %lu milliseconds\n", tm - oldtm);}/************************************************************************Reads the test database files. */void test2(void)/*=======*/{ ulint i, j, k, rnd; buf_block_t* block; byte* frame; ulint tm, oldtm; oldtm = ut_clock(); rnd = 123; for (k = 0; k < 100; k++) { rnd += 23651; rnd = rnd % 4096; i = rnd / 4096; j = rnd % 2048; block = buf_page_get(i, j, NULL); frame = buf_block_get_frame(block); rw_lock_s_lock(buf_page_get_lock(block)); ut_a(*((ulint*)(frame + 16)) == j); rw_lock_s_unlock(buf_page_get_lock(block)); buf_page_release(block); } tm = ut_clock(); printf("Wall clock time for random read %lu milliseconds\n", tm - oldtm);}/************************************************************************Reads the test database files. */void test4(void)/*=======*/{ ulint i, j, k, rnd; buf_block_t* block; byte* frame; ulint tm, oldtm; /* Flush the pool of high-offset pages */ for (i = 0; i < 1000; i++) { block = buf_page_get(0, i, NULL); frame = buf_block_get_frame(block); rw_lock_s_lock(buf_page_get_lock(block)); ut_a(*((ulint*)(frame + 16)) == i); rw_lock_s_unlock(buf_page_get_lock(block)); buf_page_release(block); } printf("Test starts\n"); oldtm = ut_clock(); rnd = 123; for (k = 0; k < 400; k++) { rnd += 4357; i = 0; j = 1001 + rnd % 3000; block = buf_page_get(i, j, NULL); frame = buf_block_get_frame(block); rw_lock_s_lock(buf_page_get_lock(block)); ut_a(*((ulint*)(frame + 16)) == j); rw_lock_s_unlock(buf_page_get_lock(block)); buf_page_release(block); } tm = ut_clock(); printf( "Wall clock time for %lu random no read-ahead %lu milliseconds\n", k, tm - oldtm); /* Flush the pool of high-offset pages */ for (i = 0; i < 1000; i++) { block = buf_page_get(0, i, NULL); frame = buf_block_get_frame(block); rw_lock_s_lock(buf_page_get_lock(block)); ut_a(*((ulint*)(frame + 16)) == i); rw_lock_s_unlock(buf_page_get_lock(block)); buf_page_release(block); } printf("Test starts\n"); oldtm = ut_clock(); rnd = 123; for (k = 0; k < 400; k++) { rnd += 4357; i = 0; j = 1001 + rnd % 400; block = buf_page_get(i, j, NULL); frame = buf_block_get_frame(block); rw_lock_s_lock(buf_page_get_lock(block)); ut_a(*((ulint*)(frame + 16)) == j); rw_lock_s_unlock(buf_page_get_lock(block)); buf_page_release(block); } tm = ut_clock(); printf( "Wall clock time for %lu random read-ahead %lu milliseconds\n", k, tm - oldtm);}/************************************************************************Tests speed of CPU algorithms. */void test3(void)/*=======*/{ ulint i, j; buf_block_t* block; ulint tm, oldtm; for (i = 0; i < 400; i++) { block = buf_page_get(0, i, NULL); buf_page_release(block); } os_thread_sleep(2000000); oldtm = ut_clock(); for (j = 0; j < 500; j++) { for (i = 0; i < 200; i++) { block = buf_page_get(0, i, NULL);/* rw_lock_s_lock(buf_page_get_lock(block)); rw_lock_s_unlock(buf_page_get_lock(block));*/ buf_page_release(block); } } tm = ut_clock(); printf("Wall clock time for %lu page get-release %lu milliseconds\n", i * j, tm - oldtm); oldtm = ut_clock(); for (j = 0; j < 500; j++) { for (i = 0; i < 200; i++) { buf_block_get(block);/* rw_lock_s_lock(buf_page_get_lock(block)); rw_lock_s_unlock(buf_page_get_lock(block));*/ buf_page_release(block); } } tm = ut_clock(); printf("Wall clock time for %lu block get-release %lu milliseconds\n", i * j, tm - oldtm); oldtm = ut_clock(); for (i = 0; i < 100000; i++) { block = buf_block_alloc(); buf_block_free(block); } tm = ut_clock(); printf("Wall clock time for %lu block alloc-free %lu milliseconds\n", i, tm - oldtm); ha_print_info(buf_pool->page_hash);}/************************************************************************Frees the spaces in the file system. */voidfree_system(void)/*=============*/{ ulint i; for (i = 0; i < 1; i++) { fil_space_free(i); }}/************************************************************************Main test function. */void main(void) /*======*/{ ulint tm, oldtm; ulint n; oldtm = ut_clock(); os_aio_init(160, 5); sync_init(); mem_init(); fil_init(26); /* Allow 25 open files at a time */ buf_pool_init(1000, 1000); buf_validate(); ut_a(fil_validate()); create_files(); create_db(); buf_validate(); test1(); test3(); test4(); test2(); buf_validate(); n = buf_flush_batch(BUF_FLUSH_LIST, 500); os_thread_sleep(1000000); buf_all_freed(); free_system(); tm = ut_clock(); printf("Wall clock time for test %lu milliseconds\n", tm - oldtm); printf("TESTS COMPLETED SUCCESSFULLY!\n");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -