/************************************************************************ The test for the index tree (c) 1994-1996 Innobase Oy Created 2/16/1996 Heikki Tuuri *************************************************************************/ #include "sync0sync.h" #include "ut0mem.h" #include "mem0mem.h" #include "data0data.h" #include "data0type.h" #include "dict0dict.h" #include "buf0buf.h" #include "os0file.h" #include "fil0fil.h" #include "fsp0fsp.h" #include "rem0rec.h" #include "rem0cmp.h" #include "mtr0mtr.h" #include "log0log.h" #include "page0page.h" #include "page0cur.h" #include "..\btr0btr.h" #include "..\btr0cur.h" #include "..\btr0pcur.h" os_file_t files[1000]; mutex_t ios_mutex; ulint ios; ulint n[10]; mutex_t incs_mutex; ulint incs; byte bigbuf[1000000]; #define N_SPACES 1 #define N_FILES 2 #define FILE_SIZE 1000 /* must be > 512 */ #define POOL_SIZE 1000 #define COUNTER_OFFSET 1500 #define LOOP_SIZE 150 #define N_THREADS 5 ulint zero = 0; buf_block_t* bl_arr[POOL_SIZE]; /************************************************************************ Io-handler thread function. */ ulint handler_thread( /*===========*/ void* arg) { ulint segment; void* mess; ulint i; bool ret; segment = *((ulint*)arg); printf("Io handler 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 files for the file system test and inserts them to the file system. */ void create_files(void) /*==============*/ { bool ret; ulint i, k; char name[20]; os_thread_t thr[5]; os_thread_id_t id[5]; printf("--------------------------------------------------------\n"); printf("Create or open database files\n"); strcpy(name, "j:\\tsfile00"); for (k = 0; k < N_SPACES; k++) { for (i = 0; i < N_FILES; i++) { name[9] = (char)((ulint)'0' + k); name[10] = (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_close(files[i]); ut_a(ret); if (i == 0) { fil_space_create(name, k, OS_FILE_TABLESPACE); } ut_a(fil_validate()); fil_node_create(name, FILE_SIZE, 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); } } /************************************************************************ Inits space header of space 0. */ void init_space(void) /*============*/ { mtr_t mtr; printf("Init space header\n"); mtr_start(&mtr); fsp_header_init(0, FILE_SIZE * N_FILES, &mtr); mtr_commit(&mtr); } /********************************************************************* Test for index page. */ void test1(void) /*=======*/ { dtuple_t* tuple; mem_heap_t* heap; ulint rnd = 0; dict_index_t* index; dict_table_t* table; dict_tree_t* tree; mtr_t mtr; byte buf[8]; ulint i; ulint tm, oldtm; btr_pcur_t cursor; printf("-------------------------------------------------\n"); printf("TEST 1. Basic test\n"); heap = mem_heap_create(0); table = dict_mem_table_create("TS_TABLE1", 2); dict_mem_table_add_col(table, "COL1", DATA_VARCHAR, DATA_ENGLISH, 10, 0); dict_mem_table_add_col(table, "COL2", DATA_VARCHAR, DATA_ENGLISH, 10, 0); dict_table_add_to_cache(table); index = dict_mem_index_create("TS_TABLE1", "IND1", 0, 2, 0); dict_mem_index_add_field(index, "COL1", 0); dict_mem_index_add_field(index, "COL2", 0); dict_index_add_to_cache(index); index = dict_index_get("TS_TABLE1", "IND1"); ut_a(index); tree = dict_index_get_tree(index); tuple = dtuple_create(heap, 3); mtr_start(&mtr); btr_root_create(tree, 0, &mtr); mtr_commit(&mtr); mtr_start(&mtr); dtuple_gen_test_tuple3(tuple, 0, buf); btr_insert(tree, tuple, &mtr); mtr_commit(&mtr); rnd = 90000; oldtm = ut_clock(); for (i = 0; i < 1000 * UNIV_DBC * UNIV_DBC; i++) { mtr_start(&mtr); if (i == 77000) { rnd = rnd % 200000; } rnd = (rnd + 15675751) % 200000; dtuple_gen_test_tuple3(tuple, rnd, buf); btr_insert(tree, tuple, &mtr); mtr_commit(&mtr); } tm = ut_clock(); printf("Wall time for test %lu milliseconds\n", tm - oldtm); rnd = 90000; oldtm = ut_clock(); for (i = 0; i < 1000 * UNIV_DBC * UNIV_DBC; i++) { mtr_start(&mtr); if (i == 50000) { rnd = rnd % 200000; } rnd = (rnd + 595659561) % 200000; dtuple_gen_test_tuple3(tuple, rnd, buf); btr_pcur_open(tree, tuple, PAGE_CUR_GE, BTR_SEARCH_LEAF, &cursor, &mtr); mtr_commit(&mtr); } tm = ut_clock(); printf("Wall time for test %lu milliseconds\n", tm - oldtm); rnd = 0; oldtm = ut_clock(); for (i = 0; i < 1000 * UNIV_DBC * UNIV_DBC; i++) { mtr_start(&mtr); rnd = (rnd + 35608971) % 200000 + 1; dtuple_gen_test_tuple3(tuple, rnd, buf); mtr_commit(&mtr); } tm = ut_clock(); printf("Wall time for test %lu milliseconds\n", tm - oldtm); /* btr_print_tree(tree, 3); */ mem_heap_free(heap); } #ifdef notdefined mtr_start(&mtr); block = buf_page_create(0, 5, &mtr); buf_page_x_lock(block, &mtr); frame = buf_block_get_frame(block); page = page_create(frame, &mtr); for (i = 0; i < 512; i++) { rnd = (rnd + 534671) % 512; if (i % 27 == 0) { ut_a(page_validate(page, index)); } dtuple_gen_test_tuple(tuple, rnd); /* dtuple_print(tuple);*/ page_cur_search(page, tuple, PAGE_CUR_G, &cursor); rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); ut_a(rec); rec_validate(rec); /* page_print_list(page, 151); */ } /* page_print_list(page, 151); */ ut_a(page_validate(page, index)); ut_a(page_get_n_recs(page) == 512); for (i = 0; i < 512; i++) { rnd = (rnd + 7771) % 512; if (i % 27 == 0) { ut_a(page_validate(page, index)); } dtuple_gen_test_tuple(tuple, rnd); /* dtuple_print(tuple);*/ page_cur_search(page, tuple, PAGE_CUR_G, &cursor); page_cur_delete_rec(&cursor, &mtr); ut_a(rec); rec_validate(rec); /* page_print_list(page, 151); */ } ut_a(page_get_n_recs(page) == 0); ut_a(page_validate(page, index)); page = page_create(frame, &mtr); rnd = 311; for (i = 0; i < 512; i++) { rnd = (rnd + 1) % 512; if (i % 27 == 0) { ut_a(page_validate(page, index)); } dtuple_gen_test_tuple(tuple, rnd); /* dtuple_print(tuple);*/ page_cur_search(page, tuple, PAGE_CUR_G, &cursor); rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); ut_a(rec); rec_validate(rec); /* page_print_list(page, 151); */ } ut_a(page_validate(page, index)); ut_a(page_get_n_recs(page) == 512); rnd = 217; for (i = 0; i < 512; i++) { rnd = (rnd + 1) % 512; if (i % 27 == 0) { ut_a(page_validate(page, index)); } dtuple_gen_test_tuple(tuple, rnd); /* dtuple_print(tuple);*/ page_cur_search(page, tuple, PAGE_CUR_G, &cursor); page_cur_delete_rec(&cursor, &mtr); ut_a(rec); rec_validate(rec); /* page_print_list(page, 151); */ } ut_a(page_validate(page, index)); ut_a(page_get_n_recs(page) == 0); page = page_create(frame, &mtr); rnd = 291; for (i = 0; i < 512; i++) { rnd = (rnd - 1) % 512; if (i % 27 == 0) { ut_a(page_validate(page, index)); } dtuple_gen_test_tuple(tuple, rnd); /* dtuple_print(tuple);*/ page_cur_search(page, tuple, PAGE_CUR_G, &cursor); rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); ut_a(rec); rec_validate(rec); /* page_print_list(page, 151); */ } ut_a(page_validate(page, index)); ut_a(page_get_n_recs(page) == 512); rnd = 277; for (i = 0; i < 512; i++) { rnd = (rnd - 1) % 512; if (i % 27 == 0) { ut_a(page_validate(page, index)); } dtuple_gen_test_tuple(tuple, rnd); /* dtuple_print(tuple);*/ page_cur_search(page, tuple, PAGE_CUR_G, &cursor); page_cur_delete_rec(&cursor, &mtr); ut_a(rec); rec_validate(rec); /* page_print_list(page, 151); */ } ut_a(page_validate(page, index)); ut_a(page_get_n_recs(page) == 0); mtr_commit(&mtr); mem_heap_free(heap); } /********************************************************************* Test for index page. */ void test2(void) /*=======*/ { page_t* page; dtuple_t* tuple; mem_heap_t* heap; ulint i, j; ulint rnd = 0; rec_t* rec; page_cur_t cursor; dict_index_t* index; dict_table_t* table; buf_block_t* block; buf_frame_t* frame; ulint tm, oldtm; byte buf[8]; mtr_t mtr; printf("-------------------------------------------------\n"); printf("TEST 2. Speed test\n"); oldtm = ut_clock(); for (i = 0; i < 1000 * UNIV_DBC * UNIV_DBC; i++) { ut_memcpy(bigbuf, bigbuf + 800, 800); } tm = ut_clock(); printf("Wall time for %lu mem copys of 800 bytes %lu millisecs\n", i, tm - oldtm); oldtm = ut_clock(); rnd = 0; for (i = 0; i < 1000 * UNIV_DBC * UNIV_DBC; i++) { ut_memcpy(bigbuf + rnd, bigbuf + rnd + 800, 800); rnd += 1600; if (rnd > 995000) { rnd = 0; } } tm = ut_clock(); printf("Wall time for %lu mem copys of 800 bytes %lu millisecs\n", i, tm - oldtm); heap = mem_heap_create(0); table = dict_table_create("TS_TABLE2", 2); dict_table_add_col(table, "COL1", DATA_VARCHAR, DATA_ENGLISH, 10, 0); dict_table_add_col(table, "COL2", DATA_VARCHAR, DATA_ENGLISH, 10, 0); ut_a(0 == dict_table_publish(table)); index = dict_index_create("TS_TABLE2", "IND2", 0, 2, 0); dict_index_add_field(index, "COL1", 0); dict_index_add_field(index, "COL2", 0); ut_a(0 == dict_index_publish(index)); index = dict_index_get("TS_TABLE2", "IND2"); ut_a(index); tuple = dtuple_create(heap, 2); oldtm = ut_clock(); rnd = 677; for (i = 0; i < 4 * UNIV_DBC * UNIV_DBC; i++) { mtr_start(&mtr); block = buf_page_create(0, 5, &mtr); buf_page_x_lock(block, &mtr); frame = buf_block_get_frame(block); page = page_create(frame, &mtr); for (j = 0; j < 250; j++) { rnd = (rnd + 54841) % 1000; dtuple_gen_test_tuple2(tuple, rnd, buf); page_cur_search(page, tuple, PAGE_CUR_G, &cursor); rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); ut_a(rec); } mtr_commit(&mtr); } tm = ut_clock(); printf("Wall time for insertion of %lu recs %lu milliseconds\n", i * j, tm - oldtm); mtr_start(&mtr); block = buf_page_get(0, 5, &mtr); buf_page_s_lock(block, &mtr); page = buf_block_get_frame(block); ut_a(page_validate(page, index)); mtr_commit(&mtr); oldtm = ut_clock(); rnd = 677; for (i = 0; i < 4 * UNIV_DBC * UNIV_DBC; i++) { mtr_start(&mtr); block = buf_page_create(0, 5, &mtr); buf_page_x_lock(block, &mtr); frame = buf_block_get_frame(block); page = page_create(frame, &mtr); for (j = 0; j < 250; j++) { rnd = (rnd + 54841) % 1000; dtuple_gen_test_tuple2(tuple, rnd, buf); } mtr_commit(&mtr); } tm = ut_clock(); printf( "Wall time for %lu empty loops with page create %lu milliseconds\n", i * j, tm - oldtm); oldtm = ut_clock(); for (i = 0; i < 4 * UNIV_DBC * UNIV_DBC; i++) { mtr_start(&mtr); block = buf_page_create(0, 5, &mtr); buf_page_x_lock(block, &mtr); frame = buf_block_get_frame(block); page = page_create(frame, &mtr); rnd = 100; for (j = 0; j < 250; j++) { rnd = (rnd + 1) % 1000; dtuple_gen_test_tuple2(tuple, rnd, buf); page_cur_search(page, tuple, PAGE_CUR_G, &cursor); rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); ut_a(rec); } mtr_commit(&mtr); } tm = ut_clock(); printf( "Wall time for sequential insertion of %lu recs %lu milliseconds\n", i * j, tm - oldtm); oldtm = ut_clock(); for (i = 0; i < 4 * UNIV_DBC * UNIV_DBC; i++) { mtr_start(&mtr); block = buf_page_create(0, 5, &mtr); buf_page_x_lock(block, &mtr); frame = buf_block_get_frame(block); page = page_create(frame, &mtr); rnd = 500; for (j = 0; j < 250; j++) { rnd = (rnd - 1) % 1000; dtuple_gen_test_tuple2(tuple, rnd, buf); page_cur_search(page, tuple, PAGE_CUR_G, &cursor); rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); ut_a(rec); } mtr_commit(&mtr); } tm = ut_clock(); printf( "Wall time for descend. seq. insertion of %lu recs %lu milliseconds\n", i * j, tm - oldtm); oldtm = ut_clock(); for (i = 0; i < 4 * UNIV_DBC * UNIV_DBC; i++) { mtr_start(&mtr); block = buf_page_create(0, 5, &mtr); buf_page_x_lock(block, &mtr); frame = buf_block_get_frame(block); page = page_create(frame, &mtr); rnd = 677; for (j = 0; j < 250; j++) { rnd = (rnd + 54841) % 1000; dtuple_gen_test_tuple2(tuple, rnd, buf); page_cur_search(page, tuple, PAGE_CUR_G, &cursor); rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); ut_a(rec); } rnd = 677; for (j = 0; j < 250; j++) { rnd = (rnd + 54841) % 1000; dtuple_gen_test_tuple2(tuple, rnd, buf); page_cur_search(page, tuple, PAGE_CUR_G, &cursor); page_cur_delete_rec(&cursor, &mtr); } ut_a(page_get_n_recs(page) == 0); mtr_commit(&mtr); } tm = ut_clock(); printf("Wall time for insert and delete of %lu recs %lu milliseconds\n", i * j, tm - oldtm); mtr_start(&mtr); block = buf_page_create(0, 5, &mtr); buf_page_x_lock(block, &mtr); frame = buf_block_get_frame(block); page = page_create(frame, &mtr); rnd = 677; for (j = 0; j < 250; j++) { rnd = (rnd + 54841) % 1000; dtuple_gen_test_tuple2(tuple, rnd, buf); page_cur_search(page, tuple, PAGE_CUR_G, &cursor); rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); ut_a(rec); } ut_a(page_validate(page, index)); mtr_print(&mtr); oldtm = ut_clock(); for (i = 0; i < 4 * UNIV_DBC * UNIV_DBC; i++) { rnd = 677; for (j = 0; j < 250; j++) { rnd = (rnd + 54841) % 1000; dtuple_gen_test_tuple2(tuple, rnd, buf); page_cur_search(page, tuple, PAGE_CUR_G, &cursor); } } tm = ut_clock(); printf("Wall time for search of %lu recs %lu milliseconds\n", i * j, tm - oldtm); oldtm = ut_clock(); for (i = 0; i < 4 * UNIV_DBC * UNIV_DBC; i++) { rnd = 677; for (j = 0; j < 250; j++) { rnd = (rnd + 54841) % 1000; dtuple_gen_test_tuple2(tuple, rnd, buf); } } tm = ut_clock(); printf("Wall time for %lu empty loops %lu milliseconds\n", i * j, tm - oldtm); mtr_commit(&mtr); } #endif /******************************************************************** Main test function. */ void main(void) /*======*/ { ulint tm, oldtm; sync_init(); mem_init(); os_aio_init(160, 5); fil_init(25); buf_pool_init(POOL_SIZE, POOL_SIZE); dict_init(); fsp_init(); log_init(); create_files(); init_space(); oldtm = ut_clock(); ut_rnd_set_seed(19); test1(); /* mem_print_info(); */ tm = ut_clock(); printf("Wall time for test %lu milliseconds\n", tm - oldtm); printf("TESTS COMPLETED SUCCESSFULLY!\n"); }