1
/************************************************************************
4
(c) 1994-1997 Innobase Oy
6
Created 2/16/1996 Heikki Tuuri
7
*************************************************************************/
10
#include "sync0sync.h"
14
#include "data0data.h"
15
#include "data0type.h"
16
#include "dict0dict.h"
19
#include "os0thread.h"
26
#include "page0page.h"
29
#include "dict0boot.h"
31
#include "dict0crea.h"
41
#include "lock0lock.h"
43
#include "trx0purge.h"
48
#include "lock0lock.h"
49
#include "ibuf0ibuf.h"
51
os_file_t files[1000];
60
#define N_SPACES 2 /* must be >= 2 */
62
#define FILE_SIZE 8096 /* must be > 512 */
63
#define POOL_SIZE 1024
65
#define COUNTER_OFFSET 1500
74
buf_block_t* bl_arr[POOL_SIZE];
80
/************************************************************************
81
Io-handler thread function. */
93
segment = *((ulint*)arg);
95
printf("Io handler thread %lu starts\n", segment);
98
ret = fil_aio_wait(segment, &mess);
101
buf_page_io_complete((buf_block_t*)mess);
103
mutex_enter(&ios_mutex);
105
mutex_exit(&ios_mutex);
112
/*************************************************************************
113
Creates the files for the file system test and inserts them to the file
124
os_thread_id_t id[10];
126
printf("--------------------------------------------------------\n");
127
printf("Create or open database files\n");
129
strcpy(name, "tsfile00");
131
for (k = 0; k < N_SPACES; k++) {
132
for (i = 0; i < N_FILES; i++) {
134
name[6] = (char)((ulint)'0' + k);
135
name[7] = (char)((ulint)'0' + i);
137
files[i] = os_file_create(name, OS_FILE_CREATE,
138
OS_FILE_TABLESPACE, &ret);
140
ut_a(os_file_get_last_error() ==
141
OS_FILE_ALREADY_EXISTS);
143
files[i] = os_file_create(
145
OS_FILE_TABLESPACE, &ret);
149
ut_a(os_file_set_size(files[i],
150
8192 * IBUF_SIZE, 0));
152
ut_a(os_file_set_size(files[i],
153
8192 * FILE_SIZE, 0));
157
ret = os_file_close(files[i]);
161
fil_space_create(name, k, OS_FILE_TABLESPACE);
164
ut_a(fil_validate());
166
fil_node_create(name, FILE_SIZE, k);
172
mutex_create(&ios_mutex);
173
mutex_set_level(&ios_mutex, SYNC_NO_ORDER_CHECK);
175
for (i = 0; i < 9; i++) {
178
thr[i] = os_thread_create(handler_thread, n + i, id + i);
182
/************************************************************************
183
Inits space headers of spaces 0 and 1. */
193
fsp_header_init(0, FILE_SIZE * N_FILES, &mtr);
194
fsp_header_init(1, IBUF_SIZE, &mtr);
199
/*********************************************************************
200
Test for table creation. */
208
com_endpoint_t* com_endpoint;
218
printf("-------------------------------------------------\n");
219
printf("TEST 1. CREATE TABLE WITH 3 COLUMNS AND WITH 3 INDEXES\n");
221
heap = mem_heap_create(512);
223
com_endpoint = (com_endpoint_t*)heap; /* This is a dummy non-NULL
225
mutex_enter(&kernel_mutex);
227
sess = sess_open(ut_dulint_zero, com_endpoint, (byte*)"user1", 6);
231
mutex_exit(&kernel_mutex);
233
ut_a(trx_start(trx, ULINT_UNDEFINED));
235
table = dict_mem_table_create("TS_TABLE1", 0, 3);
237
dict_mem_table_add_col(table, "COL1", DATA_VARCHAR,
238
DATA_ENGLISH, 10, 0);
239
dict_mem_table_add_col(table, "COL2", DATA_VARCHAR,
240
DATA_ENGLISH, 10, 0);
241
dict_mem_table_add_col(table, "COL3", DATA_VARCHAR,
242
DATA_ENGLISH, 100, 0);
243
/*------------------------------------*/
246
fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap);
249
thr = que_thr_create(fork, fork, heap);
251
thr->child = tab_create_graph_create(fork, thr, table, heap);
253
mutex_enter(&kernel_mutex);
255
que_graph_publish(fork, trx->sess);
259
ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0));
261
mutex_exit(&kernel_mutex);
263
que_run_threads(thr);
265
/* dict_table_print_by_name("SYS_TABLES");
266
dict_table_print_by_name("SYS_COLUMNS"); */
267
/*-------------------------------------*/
268
/* CREATE CLUSTERED INDEX */
270
index = dict_mem_index_create("TS_TABLE1", "IND1", 0,
271
DICT_UNIQUE | DICT_CLUSTERED, 1);
272
dict_mem_index_add_field(index, "COL1", 0);
274
ut_a(mem_heap_validate(index->heap));
276
fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap);
279
thr = que_thr_create(fork, fork, heap);
281
thr->child = ind_create_graph_create(fork, thr, index, heap);
283
mutex_enter(&kernel_mutex);
285
que_graph_publish(fork, trx->sess);
289
ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0));
291
mutex_exit(&kernel_mutex);
293
que_run_threads(thr);
295
/* dict_table_print_by_name("SYS_INDEXES");
296
dict_table_print_by_name("SYS_FIELDS"); */
298
/*-------------------------------------*/
299
/* CREATE SECONDARY INDEX */
301
index = dict_mem_index_create("TS_TABLE1", "IND2", 0, 0, 1);
303
dict_mem_index_add_field(index, "COL2", 0);
305
ut_a(mem_heap_validate(index->heap));
307
fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap);
310
thr = que_thr_create(fork, fork, heap);
312
thr->child = ind_create_graph_create(fork, thr, index, heap);
314
mutex_enter(&kernel_mutex);
316
que_graph_publish(fork, trx->sess);
320
ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0));
322
mutex_exit(&kernel_mutex);
324
que_run_threads(thr);
326
/* dict_table_print_by_name("SYS_INDEXES");
327
dict_table_print_by_name("SYS_FIELDS"); */
329
/*-------------------------------------*/
330
/* CREATE ANOTHER SECONDARY INDEX */
332
index = dict_mem_index_create("TS_TABLE1", "IND3", 0, 0, 1);
334
dict_mem_index_add_field(index, "COL2", 0);
336
ut_a(mem_heap_validate(index->heap));
338
fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap);
341
thr = que_thr_create(fork, fork, heap);
343
thr->child = ind_create_graph_create(fork, thr, index, heap);
345
mutex_enter(&kernel_mutex);
347
que_graph_publish(fork, trx->sess);
351
ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0));
353
mutex_exit(&kernel_mutex);
355
que_run_threads(thr);
358
/*-------------------------------------*/
359
/* CREATE YET ANOTHER SECONDARY INDEX */
361
index = dict_mem_index_create("TS_TABLE1", "IND4", 0, 0, 1);
363
dict_mem_index_add_field(index, "COL2", 0);
365
ut_a(mem_heap_validate(index->heap));
367
fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap);
370
thr = que_thr_create(fork, fork, heap);
372
thr->child = ind_create_graph_create(fork, thr, index, heap);
374
mutex_enter(&kernel_mutex);
376
que_graph_publish(fork, trx->sess);
380
ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0));
382
mutex_exit(&kernel_mutex);
384
que_run_threads(thr);
386
/* dict_table_print_by_name("SYS_INDEXES");
387
dict_table_print_by_name("SYS_FIELDS"); */
392
/*********************************************************************
393
Another test for inserts. */
402
com_endpoint_t* com_endpoint;
415
/* dict_tree_t* tree;
420
printf("-------------------------------------------------\n");
421
printf("TEST 2.1. MASSIVE ASCENDING INSERT\n");
423
heap = mem_heap_create(512);
425
com_endpoint = (com_endpoint_t*)heap; /* This is a dummy non-NULL
427
mutex_enter(&kernel_mutex);
429
sess = sess_open(ut_dulint_zero, com_endpoint, (byte*)"user1", 6);
433
mutex_exit(&kernel_mutex);
435
ut_a(trx_start(trx, ULINT_UNDEFINED));
437
/*-------------------------------------*/
439
fork = que_fork_create(NULL, NULL, QUE_FORK_INSERT, heap);
442
thr = que_thr_create(fork, fork, heap);
444
table = dict_table_get("TS_TABLE1", trx);
446
row = dtuple_create(heap, 3 + DATA_N_SYS_COLS);
448
dict_table_copy_types(row, table);
450
node = ins_node_create(fork, thr, row, table, heap);
454
row_ins_init_sys_fields_at_sql_compile(node->row, node->table, heap);
455
row_ins_init_sys_fields_at_sql_prepare(node->row, node->table, trx);
457
node->init_all_sys_fields = FALSE;
459
mutex_enter(&kernel_mutex);
461
que_graph_publish(fork, trx->sess);
465
mutex_exit(&kernel_mutex);
473
for (i = 0; i < *((ulint*)arg); i++) {
475
dtuple_gen_test_tuple3(row, rnd, DTUPLE_TEST_FIXED30, buf);
477
mutex_enter(&kernel_mutex);
480
thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0));
482
mutex_exit(&kernel_mutex);
484
que_run_threads(thr);
490
/* buf_print_io(); */
493
printf("Wall time for %lu inserts %lu milliseconds\n",
501
printf("Wall time for %lu inserts %lu milliseconds\n", i, tm - oldtm);
505
/* dict_table_print_by_name("TS_TABLE1"); */
511
index = dict_table_get_first_index(table);
514
btr_search_index_print_info(index);
517
btr_validate_tree(dict_index_get_tree(index));
520
index = dict_table_get_next_index(index);
523
btr_search_index_print_info(index);
526
btr_validate_tree(dict_index_get_tree(index));
528
index = dict_table_get_next_index(index);
530
/* btr_search_index_print_info(index); */
532
btr_validate_tree(dict_index_get_tree(index));
534
/* dict_table_print_by_name("TS_TABLE1"); */
536
/* Check inserted entries */
538
btr_search_print_info();
540
entry = dtuple_create(heap, 1);
541
dtuple_gen_search_tuple3(entry, 0, buf);
545
index = dict_table_get_first_index(table);
546
tree = dict_index_get_tree(index);
548
btr_pcur_open(index, entry, PAGE_CUR_L, BTR_SEARCH_LEAF, &pcur, &mtr);
549
ut_a(btr_pcur_is_before_first_in_tree(&pcur, &mtr));
551
for (i = 0; i < *((ulint*)arg); i++) {
552
ut_a(btr_pcur_move_to_next(&pcur, &mtr));
554
dtuple_gen_search_tuple3(entry, i, buf);
556
ut_a(0 == cmp_dtuple_rec(entry, btr_pcur_get_rec(&pcur)));
559
ut_a(!btr_pcur_move_to_next(&pcur, &mtr));
560
ut_a(btr_pcur_is_after_last_in_tree(&pcur, &mtr));
562
btr_pcur_close(&pcur);
565
printf("Validating tree\n");
566
btr_validate_tree(tree);
567
printf("Validated\n");
569
/*-------------------------------------*/
573
/* btr_validate_tree(tree); */
575
fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap);
578
thr = que_thr_create(fork, fork, heap);
580
thr->child = roll_node_create(fork, thr, heap);
582
mutex_enter(&kernel_mutex);
584
que_graph_publish(fork, trx->sess);
588
ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0));
590
mutex_exit(&kernel_mutex);
594
que_run_threads(thr);
597
printf("Wall time for rollback of %lu inserts %lu milliseconds\n",
600
os_thread_sleep(1000000);
602
/* dict_table_print_by_name("TS_TABLE1"); */
604
dtuple_gen_search_tuple3(entry, 0, buf);
608
btr_pcur_open(index, entry, PAGE_CUR_L, BTR_SEARCH_LEAF, &pcur, &mtr);
609
ut_a(btr_pcur_is_before_first_in_tree(&pcur, &mtr));
611
ut_a(!btr_pcur_move_to_next(&pcur, &mtr));
613
ut_a(btr_pcur_is_after_last_in_tree(&pcur, &mtr));
615
btr_pcur_close(&pcur);
618
btr_search_print_info();
620
/*-------------------------------------*/
622
fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap);
625
thr = que_thr_create(fork, fork, heap);
627
thr->child = commit_node_create(fork, thr, heap);
629
mutex_enter(&kernel_mutex);
631
que_graph_publish(fork, trx->sess);
635
ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0));
637
mutex_exit(&kernel_mutex);
641
que_run_threads(thr);
644
printf("Wall time for commit %lu milliseconds\n", tm - oldtm);
645
/*-------------------------------------*/
648
/* btr_validate_tree(tree); */
659
/********************************************************************
660
Main test function. */
667
os_thread_id_t id[10];
673
/* buf_debug_prints = TRUE; */
676
srv_boot("initfile");
677
os_aio_init(576, 9, 100);
679
buf_pool_init(POOL_SIZE, POOL_SIZE);
682
lock_sys_create(1024);
688
sess_sys_init_at_db_start();
694
/* os_thread_sleep(500000); */
702
/* for (i = 0; i < 2; i++) {
707
os_thread_create(test10mt, n1000 + i, id + i);
715
/* os_thread_create(test10_4, n1000 + i, id + i); */
726
printf("%lu pages purged\n", purge_sys->n_pages_handled);
728
dict_table_print_by_name("TS_TABLE1"); */
730
/* os_thread_create(test_measure_cont, &n3, id + 0); */
732
/* mem_print_info(); */
734
/* dict_table_print_by_name("TS_TABLE1"); */
736
log_flush_up_to(ut_dulint_zero);
738
os_thread_sleep(500000);
753
/* mem_print_info(); */
755
for (i = 0; i < 2; i++) {
757
n1000[i] = 1000 + 10 * i;
760
/* os_thread_create(test2mt, n1000 + i, id + i);
761
os_thread_create(test2_1mt, n1000 + i, id + i);
762
os_thread_create(test2_2mt, n1000 + i, id + i); */
771
rw_lock_list_print_info();
772
mutex_list_print_info();
774
dict_table_print_by_name("TS_TABLE1"); */
776
/* mem_print_info(); */
783
for (i = 0; i < 2; i++) {
786
os_thread_create(test4mt, n1000 + i, id + i);
793
lock_print_info(); */
797
/* os_thread_sleep(25000000); */
800
printf("Wall time for test %lu milliseconds\n", tm - oldtm);
801
printf("TESTS COMPLETED SUCCESSFULLY!\n");