del.c
来自「Mysql for Windows最新源码」· C语言 代码 · 共 892 行
C
892 行
/************************************************************************The test module for the file system and buffer manager(c) 1995 Innobase OyCreated 11/16/1995 Heikki Tuuri*************************************************************************/#include "string.h"#include "os0thread.h"#include "os0file.h"#include "ut0ut.h"#include "ut0byte.h"#include "sync0sync.h"#include "mem0mem.h"#include "fil0fil.h"#include "..\buf0buf.h"#include "..\buf0buf.h1"#include "..\buf0buf.h2"#include "..\buf0flu.h"#include "..\buf0lru.h"#include "mtr0buf.h"#include "mtr0log.h"#include "fsp0fsp.h"#include "log0log.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; mtr_t mtr; oldtm = ut_clock(); for (i = 0; i < 1; i++) { for (j = 0; j < 4096; j++) { mtr_start(&mtr); if (j == 0) { fsp_header_init(i, 4096, &mtr); block = mtr_page_get(i, j, NULL, &mtr); } else { block = mtr_page_create(i, j, &mtr); } frame = buf_block_get_frame(block); mtr_page_x_lock(block, &mtr); mlog_write_ulint(frame + FIL_PAGE_PREV, j - 1, MLOG_4BYTES, &mtr); mlog_write_ulint(frame + FIL_PAGE_NEXT, j + 1, MLOG_4BYTES, &mtr); mlog_write_ulint(frame + FIL_PAGE_OFFSET, j, MLOG_4BYTES, &mtr); mtr_commit(&mtr); } } tm = ut_clock(); printf("Wall clock time for test %lu milliseconds\n", tm - oldtm); /* Flush the pool of dirty pages by reading low-offset pages */ for (i = 0; i < 1000; i++) { mtr_start(&mtr); block = mtr_page_get(0, i, NULL, &mtr); frame = buf_block_get_frame(block); mtr_page_s_lock(block, &mtr); ut_a(mtr_read_ulint(frame + FIL_PAGE_OFFSET, MLOG_4BYTES, &mtr) == i); mtr_commit(&mtr); } 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[20]; os_thread_t thr[5]; os_thread_id_t id[5]; strcpy(name, "j:\\tsfile1"); for (k = 0; k < 1; k++) { for (i = 0; i < 4; i++) { name[9] = (char)((ulint)'0' + i); files[i] = os_file_create(name, 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( name, 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(name, 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); buf_page_s_lock(block); ut_a(*((ulint*)(frame + 16)) == j); buf_page_s_unlock(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); buf_page_s_lock(block); ut_a(*((ulint*)(frame + 16)) == j); buf_page_s_unlock(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); buf_page_s_lock(block); ut_a(*((ulint*)(frame + 16)) == i); buf_page_s_unlock(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); buf_page_s_lock(block); ut_a(*((ulint*)(frame + 16)) == j); buf_page_s_unlock(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); buf_page_s_lock(block); ut_a(*((ulint*)(frame + 16)) == i); buf_page_s_unlock(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); buf_page_s_lock(block); ut_a(*((ulint*)(frame + 16)) == j); buf_page_s_unlock(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);/* buf_page_s_lock(block); buf_page_s_unlock(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_page_get(0, i, NULL);/* buf_page_s_lock(block); buf_page_s_unlock(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); }}/************************************************************************Test for file space management. */voidtest5(void)/*=======*/{ mtr_t mtr; ulint seg_page; ulint new_page; ulint seg_page2; ulint new_page2; buf_block_t* block; bool finished; ulint i; ulint reserved; ulint used; ulint tm, oldtm; os_thread_sleep(1000000); buf_validate(); buf_print(); mtr_start(&mtr); seg_page = fseg_create(0, 0, 1000, 555, &mtr); mtr_commit(&mtr); os_thread_sleep(1000000); buf_validate(); printf("Segment created: header page %lu\n", seg_page); mtr_start(&mtr); block = mtr_page_get(0, seg_page, NULL, &mtr); new_page = fseg_alloc_free_page(buf_block_get_frame(block) + 1000, 2, FSP_UP, &mtr); mtr_commit(&mtr); buf_validate(); buf_print(); printf("Segment page allocated %lu\n", new_page); finished = FALSE; while (!finished) { mtr_start(&mtr); block = mtr_page_get(0, seg_page, NULL, &mtr); finished = fseg_free_step( buf_block_get_frame(block) + 1000, &mtr); mtr_commit(&mtr); } /***********************************************/ os_thread_sleep(1000000); buf_validate(); buf_print(); mtr_start(&mtr); seg_page = fseg_create(0, 0, 1000, 557, &mtr); mtr_commit(&mtr); ut_a(seg_page == 1); printf("Segment created: header page %lu\n", seg_page); new_page = seg_page; for (i = 0; i < 1023; i++) { mtr_start(&mtr); block = mtr_page_get(0, seg_page, NULL, &mtr); new_page = fseg_alloc_free_page( buf_block_get_frame(block) + 1000, new_page + 1, FSP_UP, &mtr); if (i < FSP_EXTENT_SIZE - 1) { ut_a(new_page == 2 + i); } else { ut_a(new_page == i + FSP_EXTENT_SIZE + 1); } printf("%lu %lu; ", i, new_page); if (i % 10 == 0) { printf("\n"); } mtr_commit(&mtr); } buf_print(); buf_validate(); mtr_start(&mtr); block = mtr_page_get(0, seg_page, NULL, &mtr); mtr_page_s_lock(block, &mtr); reserved = fseg_n_reserved_pages(buf_block_get_frame(block) + 1000, &used, &mtr); ut_a(used == 1024); ut_a(reserved >= 1024); printf("Pages used in segment %lu reserved by segment %lu \n", used, reserved); mtr_commit(&mtr); finished = FALSE; while (!finished) { mtr_start(&mtr); block = mtr_page_get(0, seg_page, NULL, &mtr); finished = fseg_free_step( buf_block_get_frame(block) + 1000, &mtr); mtr_commit(&mtr); } buf_print(); buf_validate(); /***********************************************/ mtr_start(&mtr); seg_page = fseg_create(0, 0, 1000, 557, &mtr); mtr_commit(&mtr); ut_a(seg_page == 1); mtr_start(&mtr); seg_page2 = fseg_create(0, 0, 1000, 558, &mtr); mtr_commit(&mtr); ut_a(seg_page2 == 2); new_page = seg_page; new_page2 = seg_page2; for (;;) { mtr_start(&mtr); block = mtr_page_get(0, seg_page, NULL, &mtr); new_page = fseg_alloc_free_page( buf_block_get_frame(block) + 1000, new_page + 1, FSP_UP, &mtr); printf("1:%lu %lu; ", i, new_page); if (i % 10 == 0) { printf("\n"); } new_page = fseg_alloc_free_page( buf_block_get_frame(block) + 1000, new_page + 1, FSP_UP, &mtr); printf("1:%lu %lu; ", i, new_page); if (i % 10 == 0) { printf("\n"); } mtr_commit(&mtr); mtr_start(&mtr); block = mtr_page_get(0, seg_page2, NULL, &mtr); new_page2 = fseg_alloc_free_page( buf_block_get_frame(block) + 1000, new_page2 + 1, FSP_UP, &mtr); printf("2:%lu %lu; ", i, new_page2); if (i % 10 == 0) { printf("\n"); } mtr_commit(&mtr); if (new_page2 == FIL_NULL) { break; } } mtr_start(&mtr); block = mtr_page_get(0, seg_page, NULL, &mtr); mtr_page_s_lock(block, &mtr); reserved = fseg_n_reserved_pages(buf_block_get_frame(block) + 1000, &used, &mtr); printf("Pages used in segment 1 %lu, reserved by segment %lu \n", used, reserved); mtr_commit(&mtr); mtr_start(&mtr); block = mtr_page_get(0, seg_page2, NULL, &mtr); mtr_page_s_lock(block, &mtr); reserved = fseg_n_reserved_pages(buf_block_get_frame(block) + 1000, &used, &mtr); printf("Pages used in segment 2 %lu, reserved by segment %lu \n", used, reserved); mtr_commit(&mtr); for (;;) { mtr_start(&mtr); block = mtr_page_get(0, seg_page, NULL, &mtr); fseg_free_step( buf_block_get_frame(block) + 1000, &mtr); block = mtr_page_get(0, seg_page2, NULL, &mtr); finished = fseg_free_step( buf_block_get_frame(block) + 1000, &mtr); mtr_commit(&mtr); if (finished) { break; } } mtr_start(&mtr); seg_page2 = fseg_create(0, 0, 1000, 558, &mtr); mtr_commit(&mtr); i = 0; for (;;) { mtr_start(&mtr); block = mtr_page_get(0, seg_page2, NULL, &mtr); new_page2 = fseg_alloc_free_page( buf_block_get_frame(block) + 1000, 557, FSP_DOWN, &mtr); printf("%lu %lu; ", i, new_page2); mtr_commit(&mtr); if (new_page2 == FIL_NULL) { break; } i++; } for (;;) { mtr_start(&mtr); block = mtr_page_get(0, seg_page, NULL, &mtr); finished = fseg_free_step( buf_block_get_frame(block) + 1000, &mtr); mtr_commit(&mtr); if (finished) { break; } } for (;;) { mtr_start(&mtr); block = mtr_page_get(0, seg_page2, NULL, &mtr); finished = fseg_free_step( buf_block_get_frame(block) + 1000, &mtr); mtr_commit(&mtr); if (finished) { break; } } /***************************************/ oldtm = ut_clock(); for (i = 0; i < 1000; i++) { mtr_start(&mtr); seg_page = fseg_create(0, 0, 1000, 555, &mtr); mtr_commit(&mtr); mtr_start(&mtr); block = mtr_page_get(0, seg_page, NULL, &mtr); new_page = fseg_alloc_free_page(buf_block_get_frame(block) + 1000, 2, FSP_UP, &mtr); mtr_commit(&mtr); finished = FALSE; while (!finished) { mtr_start(&mtr); block = mtr_page_get(0, seg_page, NULL, &mtr); finished = fseg_free_step( buf_block_get_frame(block) + 1000, &mtr); mtr_commit(&mtr); } } tm = ut_clock(); printf("Wall clock time for %lu seg crea+free %lu millisecs\n", i, tm - oldtm); buf_validate(); buf_flush_batch(BUF_FLUSH_LIST, 500); os_thread_sleep(1000000); buf_all_freed();} /************************************************************************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); log_init(); buf_validate(); ut_a(fil_validate()); create_files(); create_db(); buf_validate(); test5();/* 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 + =
减小字号Ctrl + -
显示快捷键?