📄 tsbuf.c
字号:
j = POOL_SIZE + 10 + rnd % 3000; mtr_start(&mtr); frame = buf_page_get(i, j, RW_S_LATCH, &mtr); ut_a(mtr_read_ulint(frame + FIL_PAGE_OFFSET, MLOG_4BYTES, &mtr) == j); ut_a(mtr_read_ulint(frame + FIL_PAGE_SPACE, MLOG_4BYTES, &mtr) == i); mtr_commit(&mtr); } tm = ut_clock(); printf( "Wall clock time for %lu random no read-ahead %lu milliseconds\n", k, tm - oldtm); buf_validate(); printf("Flush the pool of high-offset pages\n"); /* Flush the pool of high-offset pages */ for (i = 0; i < POOL_SIZE; i++) { mtr_start(&mtr); frame = buf_page_get(0, i, RW_S_LATCH, &mtr); mtr_commit(&mtr); } buf_validate(); printf("--------------------------------------------------------\n"); printf("TEST 3 B. Read randomly database pages, random read-ahead\n"); oldtm = ut_clock(); rnd = 123; for (k = 0; k < 400; k++) { rnd += 23477; i = 0; j = POOL_SIZE + 10 + rnd % 400; mtr_start(&mtr); frame = buf_page_get(i, j, RW_S_LATCH, &mtr); ut_a(mtr_read_ulint(frame + FIL_PAGE_OFFSET, MLOG_4BYTES, &mtr) == j); ut_a(mtr_read_ulint(frame + FIL_PAGE_SPACE, MLOG_4BYTES, &mtr) == i); mtr_commit(&mtr); } tm = ut_clock(); printf( "Wall clock time for %lu random read-ahead %lu milliseconds\n", k, tm - oldtm);}/************************************************************************Tests speed of CPU algorithms. */void test4(void)/*=======*/{ ulint i, j; ulint tm, oldtm; mtr_t mtr; buf_frame_t* frame; os_thread_sleep(2000000); printf("--------------------------------------------------------\n"); printf("TEST 4. Speed of CPU algorithms\n"); oldtm = ut_clock(); for (j = 0; j < 1000; j++) { mtr_start(&mtr); for (i = 0; i < 20; i++) { frame = buf_page_get(0, i, RW_S_LATCH, &mtr); } mtr_commit(&mtr); } tm = ut_clock(); printf("Wall clock time for %lu page get-release %lu milliseconds\n", i * j, tm - oldtm); buf_validate(); oldtm = ut_clock(); for (i = 0; i < 10000; i++) { frame = buf_frame_alloc(); buf_frame_free(frame); } 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); buf_print();}/************************************************************************Tests various points of code. */void test5(void)/*=======*/{ buf_frame_t* frame; fil_addr_t addr; ulint space; mtr_t mtr; printf("--------------------------------------------------------\n"); printf("TEST 5. Various tests \n"); mtr_start(&mtr); frame = buf_page_get(0, 313, RW_S_LATCH, &mtr); ut_a(buf_frame_get_space_id(frame) == 0); ut_a(buf_frame_get_page_no(frame) == 313); ut_a(buf_frame_align(frame + UNIV_PAGE_SIZE - 1) == frame); ut_a(buf_frame_align(frame) == frame); ut_a(buf_block_align(frame + UNIV_PAGE_SIZE - 1) == buf_block_align(frame)); buf_ptr_get_fsp_addr(frame + UNIV_PAGE_SIZE - 1, &space, &addr); ut_a(addr.page == 313) ut_a(addr.boffset == UNIV_PAGE_SIZE - 1); ut_a(space == 0); mtr_commit(&mtr);}/************************************************************************Random test thread function. */ulintrandom_thread(/*===========*/ void* arg){ ulint n; ulint i, j, r, t, p, sp, count; ulint s; buf_frame_t* arr[POOL_SIZE / N_THREADS]; buf_frame_t* frame; mtr_t mtr; mtr_t mtr2; n = *((ulint*)arg); printf("Random test thread %lu starts\n", os_thread_get_curr_id()); for (i = 0; i < 30; i++) { t = ut_rnd_gen_ulint() % 10; r = ut_rnd_gen_ulint() % 100; s = ut_rnd_gen_ulint() % (POOL_SIZE / N_THREADS); p = ut_rnd_gen_ulint(); sp = ut_rnd_gen_ulint() % N_SPACES; if (i % 100 == 0) { printf("Thr %lu tst %lu starts\n", os_thread_get_curr_id(), t); } ut_a(buf_validate()); mtr_start(&mtr); if (t == 6) { /* Allocate free blocks */ for (j = 0; j < s; j++) { arr[j] = buf_frame_alloc(); ut_a(arr[j]); } for (j = 0; j < s; j++) { buf_frame_free(arr[j]); } } else if (t == 9) {/* buf_flush_batch(BUF_FLUSH_LIST, 30); */ } else if (t == 7) { /* x-lock many blocks */ for (j = 0; j < s; j++) { arr[j] = buf_page_get(sp, (p + j) % (N_FILES * FILE_SIZE), RW_X_LATCH, &mtr); ut_a(arr[j]); if (j > 0) { ut_a(arr[j] != arr[j - 1]); } } ut_a(buf_validate()); } else if (t == 8) { /* s-lock many blocks */ for (j = 0; j < s; j++) { arr[j] = buf_page_get(sp, (p + j) % (N_FILES * FILE_SIZE), RW_S_LATCH, &mtr); ut_a(arr[j]); if (j > 0) { ut_a(arr[j] != arr[j - 1]); } } } else if (t <= 2) { for (j = 0; j < r; j++) { /* Read pages */ mtr_start(&mtr2); frame = buf_page_get(sp, p % (N_FILES * FILE_SIZE), RW_S_LATCH, &mtr2); ut_a(mtr_read_ulint(frame + FIL_PAGE_OFFSET, MLOG_4BYTES, &mtr2) == p % (N_FILES * FILE_SIZE)); ut_a(mtr_read_ulint(frame + FIL_PAGE_SPACE, MLOG_4BYTES, &mtr2) == sp); mtr_commit(&mtr2); if (t == 0) { p++; /* upward */ } else if (t == 1) { p--; /* downward */ } else if (t == 2) { p = ut_rnd_gen_ulint(); /* randomly */ } } } else if (t <= 5) { for (j = 0; j < r; j++) { /* Write pages */ mtr_start(&mtr2); frame = buf_page_get(sp, p % (N_FILES * FILE_SIZE), RW_X_LATCH, &mtr2); count = 1 + mtr_read_ulint(frame + COUNTER_OFFSET, MLOG_4BYTES, &mtr2); mutex_enter(&incs_mutex); incs++; mutex_exit(&incs_mutex); mlog_write_ulint(frame + COUNTER_OFFSET, count, MLOG_4BYTES, &mtr2); mtr_commit(&mtr2); if (t == 3) { p++; /* upward */ } else if (t == 4) { p--; /* downward */ } else if (t == 5) { p = ut_rnd_gen_ulint(); /* randomly */ } } } /* if t = */ mtr_commit(&mtr);/* printf("Thr %lu tst %lu ends ", os_thread_get_curr_id(), t); */ ut_a(buf_validate()); } /* for i */ printf("\nRandom test thread %lu exits\n", os_thread_get_curr_id()); return(0);}/************************************************************************Random test thread function which reports the rw-lock list. */ulintrw_list_thread(/*===========*/ void* arg){ ulint n; ulint i; n = *((ulint*)arg); printf("\nRw list test thread %lu starts\n", os_thread_get_curr_id()); for (i = 0; i < 10; i++) { os_thread_sleep(3000000); rw_lock_list_print_info(); buf_validate(); } return(0);}/*************************************************************************Performs random operations on the buffer with several threads. */voidtest6(void)/*=======*/{ ulint i, j; os_thread_t thr[N_THREADS + 1]; os_thread_id_t id[N_THREADS + 1]; ulint n[N_THREADS + 1]; ulint count = 0; buf_frame_t* frame; mtr_t mtr; printf("--------------------------------------------------------\n"); printf("TEST 6. Random multi-thread test on the buffer \n"); incs = 0; mutex_create(&incs_mutex); for (i = 0; i < N_THREADS; i++) { n[i] = i; thr[i] = os_thread_create(random_thread, n + i, id + i); }/* n[N_THREADS] = N_THREADS; thr[N_THREADS] = os_thread_create(rw_list_thread, n + N_THREADS, id + N_THREADS);*/ for (i = 0; i < N_THREADS; i++) { os_thread_wait(thr[i]); }/* os_thread_wait(thr[N_THREADS]); */ for (i = 0; i < N_SPACES; i++) { for (j = 0; j < N_FILES * FILE_SIZE; j++) { mtr_start(&mtr); frame = buf_page_get(i, j, RW_S_LATCH, &mtr); ut_a(mtr_read_ulint(frame + FIL_PAGE_OFFSET, MLOG_4BYTES, &mtr) == j); ut_a(mtr_read_ulint(frame + FIL_PAGE_SPACE, MLOG_4BYTES, &mtr) == i); count += mtr_read_ulint(frame + COUNTER_OFFSET, MLOG_4BYTES, &mtr); mtr_commit(&mtr); } } printf("Count %lu incs %lu\n", count, incs); ut_a(count == incs);}/************************************************************************Frees the spaces in the file system. */voidfree_system(void)/*=============*/{ ulint i; for (i = 0; i < N_SPACES; i++) { fil_space_free(i); }}/************************************************************************Main test function. */void main(void) /*======*/{ ulint tm, oldtm;/* buf_debug_prints = TRUE; */ oldtm = ut_clock(); os_aio_init(160, 5); sync_init(); mem_init(1500000); fil_init(26); /* Allow 25 open files at a time */ buf_pool_init(POOL_SIZE, POOL_SIZE); log_init(); buf_validate(); ut_a(fil_validate()); create_files(); create_db(); buf_validate(); test1(); buf_validate(); test2(); buf_validate(); test3(); buf_validate(); test4(); test5(); buf_validate(); test6(); buf_validate(); buf_print(); buf_flush_batch(BUF_FLUSH_LIST, POOL_SIZE + 1); buf_print(); buf_validate(); os_thread_sleep(1000000); buf_print(); 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 + -