📄 tsbtr97.c
字号:
/************************************************************************Test for the B-tree(c) 1996-1997 Innobase OyCreated 2/16/1996 Heikki Tuuri*************************************************************************/#include "os0proc.h"#include "sync0sync.h"#include "ut0mem.h"#include "mem0mem.h"#include "mem0pool.h"#include "data0data.h"#include "data0type.h"#include "dict0dict.h"#include "buf0buf.h"#include "buf0flu.h"#include "os0file.h"#include "os0thread.h"#include "fil0fil.h"#include "fsp0fsp.h"#include "rem0rec.h"#include "rem0cmp.h"#include "mtr0mtr.h"#include "log0log.h"#include "log0recv.h"#include "page0page.h"#include "page0cur.h"#include "trx0trx.h"#include "dict0boot.h"#include "trx0sys.h"#include "dict0crea.h"#include "btr0btr.h"#include "btr0pcur.h"#include "btr0cur.h"#include "btr0sea.h"#include "rem0rec.h"#include "srv0srv.h"#include "que0que.h"#include "com0com.h"#include "usr0sess.h"#include "lock0lock.h"#include "trx0roll.h"#include "trx0purge.h"#include "row0ins.h"#include "row0upd.h"#include "row0row.h"#include "row0del.h"#include "lock0lock.h"#include "ibuf0ibuf.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 2#define N_FILES 1#define FILE_SIZE 512 /* must be > 512 */#define POOL_SIZE 500#define COUNTER_OFFSET 1500#define N_LOG_GROUPS 2 #define N_LOG_FILES 3#define LOG_FILE_SIZE 500#define LOOP_SIZE 150#define N_THREADS 5#define COUNT 1ulint zero = 0;buf_block_t* bl_arr[POOL_SIZE];ulint dummy = 0;byte rnd_buf[256 * 256];/************************************************************************Io-handler thread function. */ulinthandler_thread(/*===========*/ void* arg){ ulint segment; ulint i; segment = *((ulint*)arg); printf("Io handler thread %lu starts\n", segment); for (i = 0;; i++) { fil_aio_wait(segment); mutex_enter(&ios_mutex); ios++; mutex_exit(&ios_mutex); } return(0);}/*************************************************************************Creates or opens the log files. */voidcreate_log_files(void)/*==================*/{ bool ret; ulint i, k; char name[20]; printf("--------------------------------------------------------\n"); printf("Create or open log files\n"); strcpy(name, "logfile00"); for (k = 0; k < N_LOG_GROUPS; k++) { for (i = 0; i < N_LOG_FILES; i++) { name[6] = (char)((ulint)'0' + k); name[7] = (char)((ulint)'0' + i); files[i] = os_file_create(name, OS_FILE_CREATE, OS_FILE_AIO, &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_AIO, &ret); ut_a(ret); } else { ut_a(os_file_set_size(files[i], 8192 * LOG_FILE_SIZE, 0)); } ret = os_file_close(files[i]); ut_a(ret); if (i == 0) { fil_space_create(name, k + 100, FIL_LOG); } ut_a(fil_validate()); fil_node_create(name, LOG_FILE_SIZE, k + 100); } fil_space_create(name, k + 200, FIL_LOG); log_group_init(k, N_LOG_FILES, LOG_FILE_SIZE * UNIV_PAGE_SIZE, k + 100, k + 200); }}/*************************************************************************Creates the files for the file system test and inserts them to the filesystem. */voidcreate_files(void)/*==============*/{ bool ret; ulint i, k, j, c; char name[20]; os_thread_t thr[10]; os_thread_id_t id[10]; printf("--------------------------------------------------------\n"); printf("Create or open database files\n"); strcpy(name, "tsfile00"); for (k = 0; k < 2 * N_SPACES; k += 2) { for (i = 0; i < N_FILES; i++) { name[6] = (char)((ulint)'0' + k); name[7] = (char)((ulint)'0' + i); files[i] = os_file_create(name, OS_FILE_CREATE, OS_FILE_NORMAL, &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_NORMAL, &ret); ut_a(ret); } else { ut_a(os_file_set_size(files[i], UNIV_PAGE_SIZE * FILE_SIZE, 0)); /* Initialize the file contents to a random value */ for (j = 0; j < FILE_SIZE; j++) { for (c = 0; c < UNIV_PAGE_SIZE; c++) { rnd_buf[c] = 0xFF; /*(byte) (ut_rnd_gen_ulint() % 256); */ } os_file_write(files[i], rnd_buf, UNIV_PAGE_SIZE * j, 0, UNIV_PAGE_SIZE); } } ret = os_file_close(files[i]); ut_a(ret); if (i == 0) { fil_space_create(name, k, FIL_TABLESPACE); } ut_a(fil_validate()); fil_node_create(name, FILE_SIZE, k); } } ios = 0; mutex_create(&ios_mutex); mutex_set_level(&ios_mutex, SYNC_NO_ORDER_CHECK); for (i = 0; i < 9; i++) { n[i] = i; thr[i] = os_thread_create(handler_thread, n + i, id + i); }}/************************************************************************Inits space headers of spaces 0 and 2. */voidinit_spaces(void)/*=============*/{ mtr_t mtr; mtr_start(&mtr); fsp_header_init(0, FILE_SIZE * N_FILES, &mtr); fsp_header_init(2, FILE_SIZE * N_FILES, &mtr); mtr_commit(&mtr);}/*********************************************************************Test for table creation. */ulinttest1(/*==*/ void* arg){ sess_t* sess; com_endpoint_t* com_endpoint; mem_heap_t* heap; dict_index_t* index; dict_table_t* table; que_fork_t* fork; que_thr_t* thr; trx_t* trx; UT_NOT_USED(arg); printf("-------------------------------------------------\n"); printf("TEST 1. CREATE TABLE WITH 3 COLUMNS AND WITH 3 INDEXES\n"); heap = mem_heap_create(512); com_endpoint = (com_endpoint_t*)heap; /* This is a dummy non-NULL value */ mutex_enter(&kernel_mutex); sess = sess_open(ut_dulint_zero, com_endpoint, (byte*)"user1", 6); trx = sess->trx; mutex_exit(&kernel_mutex); ut_a(trx_start(trx, ULINT_UNDEFINED)); table = dict_mem_table_create("TS_TABLE1", 0, 3); 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_mem_table_add_col(table, "COL3", DATA_VARCHAR, DATA_ENGLISH, 100, 0); /*------------------------------------*/ /* CREATE TABLE */ fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); fork->trx = trx; thr = que_thr_create(fork, fork, heap); thr->child = tab_create_graph_create(fork, thr, table, heap); mutex_enter(&kernel_mutex); que_graph_publish(fork, trx->sess); trx->graph = fork; ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); mutex_exit(&kernel_mutex); que_run_threads(thr); dict_table_print_by_name("SYS_TABLES"); dict_table_print_by_name("SYS_COLUMNS"); /*-------------------------------------*/ /* CREATE CLUSTERED INDEX */ index = dict_mem_index_create("TS_TABLE1", "IND1", 0, /*DICT_UNIQUE |*/ DICT_CLUSTERED, 1); dict_mem_index_add_field(index, "COL1", 0); ut_a(mem_heap_validate(index->heap)); fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); fork->trx = trx; thr = que_thr_create(fork, fork, heap); thr->child = ind_create_graph_create(fork, thr, index, heap); mutex_enter(&kernel_mutex); que_graph_publish(fork, trx->sess); trx->graph = fork; ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); mutex_exit(&kernel_mutex); que_run_threads(thr);/* dict_table_print_by_name("SYS_INDEXES"); dict_table_print_by_name("SYS_FIELDS"); */ /*-------------------------------------*/ /* CREATE SECONDARY INDEX */ index = dict_mem_index_create("TS_TABLE1", "IND2", 0, 0, 1); dict_mem_index_add_field(index, "COL2", 0); ut_a(mem_heap_validate(index->heap)); fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); fork->trx = trx; thr = que_thr_create(fork, fork, heap); thr->child = ind_create_graph_create(fork, thr, index, heap); mutex_enter(&kernel_mutex); que_graph_publish(fork, trx->sess); trx->graph = fork; ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); mutex_exit(&kernel_mutex); que_run_threads(thr);/* dict_table_print_by_name("SYS_INDEXES"); dict_table_print_by_name("SYS_FIELDS"); */ /*-------------------------------------*/ /* CREATE ANOTHER SECONDARY INDEX */ index = dict_mem_index_create("TS_TABLE1", "IND3", 0, 0, 1); dict_mem_index_add_field(index, "COL2", 0); ut_a(mem_heap_validate(index->heap)); fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); fork->trx = trx; thr = que_thr_create(fork, fork, heap); thr->child = ind_create_graph_create(fork, thr, index, heap); mutex_enter(&kernel_mutex); que_graph_publish(fork, trx->sess); trx->graph = fork; ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); mutex_exit(&kernel_mutex); que_run_threads(thr);#ifdef notdefined /*-------------------------------------*/ /* CREATE YET ANOTHER SECONDARY INDEX */ index = dict_mem_index_create("TS_TABLE1", "IND4", 0, 0, 1); dict_mem_index_add_field(index, "COL2", 0); ut_a(mem_heap_validate(index->heap)); fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); fork->trx = trx; thr = que_thr_create(fork, fork, heap); thr->child = ind_create_graph_create(fork, thr, index, heap); mutex_enter(&kernel_mutex); que_graph_publish(fork, trx->sess); trx->graph = fork; ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); mutex_exit(&kernel_mutex); que_run_threads(thr);#endif/* dict_table_print_by_name("SYS_INDEXES"); dict_table_print_by_name("SYS_FIELDS"); */ /* COMMIT */ fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); fork->trx = trx; thr = que_thr_create(fork, fork, heap); thr->child = commit_node_create(fork, thr, heap); mutex_enter(&kernel_mutex); que_graph_publish(fork, trx->sess); trx->graph = fork; ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); mutex_exit(&kernel_mutex); que_run_threads(thr); return(0);}/*********************************************************************Another test for table creation. */ulinttest1_5(/*====*/ void* arg){ sess_t* sess; com_endpoint_t* com_endpoint; mem_heap_t* heap; dict_index_t* index; dict_table_t* table; que_fork_t* fork; que_thr_t* thr; trx_t* trx; UT_NOT_USED(arg); printf("-------------------------------------------------\n"); printf("TEST 1.5. CREATE TABLE WITH 3 COLUMNS AND WITH 1 INDEX\n"); heap = mem_heap_create(512); com_endpoint = (com_endpoint_t*)heap; /* This is a dummy non-NULL value */ mutex_enter(&kernel_mutex); sess = sess_open(ut_dulint_zero, com_endpoint, (byte*)"user1", 6); trx = sess->trx; mutex_exit(&kernel_mutex); ut_a(trx_start(trx, ULINT_UNDEFINED)); table = dict_mem_table_create("TS_TABLE2", 0, 3); 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_mem_table_add_col(table, "COL3", DATA_VARCHAR, DATA_ENGLISH, 100, 0); /*------------------------------------*/ /* CREATE TABLE */ fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); fork->trx = trx; thr = que_thr_create(fork, fork, heap); thr->child = tab_create_graph_create(fork, thr, table, heap); mutex_enter(&kernel_mutex); que_graph_publish(fork, trx->sess); trx->graph = fork; ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); mutex_exit(&kernel_mutex); que_run_threads(thr);/* dict_table_print_by_name("SYS_TABLES"); dict_table_print_by_name("SYS_COLUMNS"); */ /*-------------------------------------*/ /* CREATE CLUSTERED INDEX */ index = dict_mem_index_create("TS_TABLE2", "IND1", 0, DICT_CLUSTERED | DICT_UNIQUE, 1); dict_mem_index_add_field(index, "COL1", 0); ut_a(mem_heap_validate(index->heap)); fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); fork->trx = trx; thr = que_thr_create(fork, fork, heap); thr->child = ind_create_graph_create(fork, thr, index, heap); mutex_enter(&kernel_mutex); que_graph_publish(fork, trx->sess); trx->graph = fork; ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); mutex_exit(&kernel_mutex); que_run_threads(thr);/* dict_table_print_by_name("SYS_INDEXES"); dict_table_print_by_name("SYS_FIELDS"); */ return(0);}/*********************************************************************Another test for table creation. */ulinttest1_6(/*====*/ void* arg){ sess_t* sess; com_endpoint_t* com_endpoint; mem_heap_t* heap; dict_index_t* index; dict_table_t* table; que_fork_t* fork; que_thr_t* thr; trx_t* trx; UT_NOT_USED(arg); printf("-------------------------------------------------\n"); printf("TEST 1.6. CREATE TABLE WITH 3 COLUMNS AND WITH 1 INDEX\n"); heap = mem_heap_create(512); com_endpoint = (com_endpoint_t*)heap; /* This is a dummy non-NULL value */ mutex_enter(&kernel_mutex); sess = sess_open(ut_dulint_zero, com_endpoint, (byte*)"user1", 6); trx = sess->trx; mutex_exit(&kernel_mutex); ut_a(trx_start(trx, ULINT_UNDEFINED)); table = dict_mem_table_create("TS_TABLE3", 0, 3); 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_mem_table_add_col(table, "COL3", DATA_VARCHAR, DATA_ENGLISH, 100, 0); /*------------------------------------*/ /* CREATE TABLE */ fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); fork->trx = trx; thr = que_thr_create(fork, fork, heap);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -