1
/************************************************************************
2
The test module for the file system and buffer manager
6
Created 11/16/1995 Heikki Tuuri
7
*************************************************************************/
11
#include "os0thread.h"
15
#include "sync0sync.h"
18
#include "..\buf0buf.h"
19
#include "..\buf0buf.h1"
20
#include "..\buf0buf.h2"
21
#include "..\buf0flu.h"
22
#include "..\buf0lru.h"
28
os_file_t files[1000];
35
/************************************************************************
36
Io-handler thread function. */
48
segment = *((ulint*)arg);
50
printf("Thread %lu starts\n", segment);
53
ret = fil_aio_wait(segment, &mess);
56
buf_page_io_complete((buf_block_t*)mess);
58
mutex_enter(&ios_mutex);
60
mutex_exit(&ios_mutex);
67
/************************************************************************
68
Creates the test database files. */
83
for (i = 0; i < 1; i++) {
84
for (j = 0; j < 4096; j++) {
87
fsp_header_init(i, 4096, &mtr);
89
block = mtr_page_get(i, j, NULL, &mtr);
91
block = mtr_page_create(i, j, &mtr);
94
frame = buf_block_get_frame(block);
96
mtr_page_x_lock(block, &mtr);
98
mlog_write_ulint(frame + FIL_PAGE_PREV,
99
j - 1, MLOG_4BYTES, &mtr);
101
mlog_write_ulint(frame + FIL_PAGE_NEXT,
102
j + 1, MLOG_4BYTES, &mtr);
104
mlog_write_ulint(frame + FIL_PAGE_OFFSET,
105
j, MLOG_4BYTES, &mtr);
112
printf("Wall clock time for test %lu milliseconds\n", tm - oldtm);
114
/* Flush the pool of dirty pages by reading low-offset pages */
115
for (i = 0; i < 1000; i++) {
118
block = mtr_page_get(0, i, NULL, &mtr);
120
frame = buf_block_get_frame(block);
122
mtr_page_s_lock(block, &mtr);
124
ut_a(mtr_read_ulint(frame + FIL_PAGE_OFFSET, MLOG_4BYTES,
130
os_thread_sleep(1000000);
132
ut_a(buf_all_freed());
135
/*************************************************************************
136
Creates the files for the file system test and inserts them to
147
os_thread_id_t id[5];
149
strcpy(name, "j:\\tsfile1");
151
for (k = 0; k < 1; k++) {
152
for (i = 0; i < 4; i++) {
154
name[9] = (char)((ulint)'0' + i);
156
files[i] = os_file_create(name, OS_FILE_CREATE,
157
OS_FILE_TABLESPACE, &ret);
160
ut_a(os_file_get_last_error() ==
161
OS_FILE_ALREADY_EXISTS);
163
files[i] = os_file_create(
165
OS_FILE_TABLESPACE, &ret);
170
ret = os_file_set_size(files[i], 4096 * 8192, 0);
173
ret = os_file_close(files[i]);
177
fil_space_create("noname", k, OS_FILE_TABLESPACE);
180
ut_a(fil_validate());
182
fil_node_create(name, 4096, k);
188
mutex_create(&ios_mutex);
190
for (i = 0; i < 5; i++) {
193
thr[i] = os_thread_create(handler_thread, n + i, id + i);
197
/************************************************************************
198
Reads the test database files. */
209
buf_flush_batch(BUF_FLUSH_LIST, 1000);
211
os_thread_sleep(1000000);
217
for (k = 0; k < 1; k++) {
218
for (i = 0; i < 1; i++) {
219
for (j = 0; j < 409; j++) {
220
block = buf_page_get(i, j, NULL);
222
frame = buf_block_get_frame(block);
224
buf_page_s_lock(block);
226
ut_a(*((ulint*)(frame + 16)) == j);
228
buf_page_s_unlock(block);
230
buf_page_release(block);
236
printf("Wall clock time for test %lu milliseconds\n", tm - oldtm);
240
/************************************************************************
241
Reads the test database files. */
256
for (k = 0; k < 100; k++) {
263
block = buf_page_get(i, j, NULL);
265
frame = buf_block_get_frame(block);
267
buf_page_s_lock(block);
269
ut_a(*((ulint*)(frame + 16)) == j);
271
buf_page_s_unlock(block);
273
buf_page_release(block);
277
printf("Wall clock time for random read %lu milliseconds\n",
281
/************************************************************************
282
Reads the test database files. */
293
/* Flush the pool of high-offset pages */
294
for (i = 0; i < 1000; i++) {
296
block = buf_page_get(0, i, NULL);
298
frame = buf_block_get_frame(block);
300
buf_page_s_lock(block);
302
ut_a(*((ulint*)(frame + 16)) == i);
304
buf_page_s_unlock(block);
306
buf_page_release(block);
309
printf("Test starts\n");
315
for (k = 0; k < 400; k++) {
320
j = 1001 + rnd % 3000;
322
block = buf_page_get(i, j, NULL);
324
frame = buf_block_get_frame(block);
326
buf_page_s_lock(block);
328
ut_a(*((ulint*)(frame + 16)) == j);
330
buf_page_s_unlock(block);
332
buf_page_release(block);
337
"Wall clock time for %lu random no read-ahead %lu milliseconds\n",
340
/* Flush the pool of high-offset pages */
341
for (i = 0; i < 1000; i++) {
343
block = buf_page_get(0, i, NULL);
345
frame = buf_block_get_frame(block);
347
buf_page_s_lock(block);
349
ut_a(*((ulint*)(frame + 16)) == i);
351
buf_page_s_unlock(block);
353
buf_page_release(block);
356
printf("Test starts\n");
362
for (k = 0; k < 400; k++) {
367
j = 1001 + rnd % 400;
369
block = buf_page_get(i, j, NULL);
371
frame = buf_block_get_frame(block);
373
buf_page_s_lock(block);
375
ut_a(*((ulint*)(frame + 16)) == j);
377
buf_page_s_unlock(block);
379
buf_page_release(block);
384
"Wall clock time for %lu random read-ahead %lu milliseconds\n",
389
/************************************************************************
390
Tests speed of CPU algorithms. */
400
for (i = 0; i < 400; i++) {
402
block = buf_page_get(0, i, NULL);
404
buf_page_release(block);
407
os_thread_sleep(2000000);
411
for (j = 0; j < 500; j++) {
412
for (i = 0; i < 200; i++) {
414
block = buf_page_get(0, i, NULL);
417
buf_page_s_lock(block);
419
buf_page_s_unlock(block);
422
buf_page_release(block);
428
printf("Wall clock time for %lu page get-release %lu milliseconds\n",
433
for (j = 0; j < 500; j++) {
434
for (i = 0; i < 200; i++) {
436
buf_page_get(0, i, NULL);
438
buf_page_s_lock(block);
440
buf_page_s_unlock(block);
442
buf_page_release(block);
447
printf("Wall clock time for %lu block get-release %lu milliseconds\n",
453
for (i = 0; i < 100000; i++) {
454
block = buf_block_alloc();
455
buf_block_free(block);
459
printf("Wall clock time for %lu block alloc-free %lu milliseconds\n",
462
ha_print_info(buf_pool->page_hash);
465
/************************************************************************
466
Frees the spaces in the file system. */
474
for (i = 0; i < 1; i++) {
479
/************************************************************************
480
Test for file space management. */
498
os_thread_sleep(1000000);
506
seg_page = fseg_create(0, 0, 1000, 555, &mtr);
510
os_thread_sleep(1000000);
512
printf("Segment created: header page %lu\n", seg_page);
516
block = mtr_page_get(0, seg_page, NULL, &mtr);
518
new_page = fseg_alloc_free_page(buf_block_get_frame(block) + 1000,
525
printf("Segment page allocated %lu\n", new_page);
533
block = mtr_page_get(0, seg_page, NULL, &mtr);
535
finished = fseg_free_step(
536
buf_block_get_frame(block) + 1000, &mtr);
541
/***********************************************/
542
os_thread_sleep(1000000);
547
seg_page = fseg_create(0, 0, 1000, 557, &mtr);
553
printf("Segment created: header page %lu\n", seg_page);
556
for (i = 0; i < 1023; i++) {
560
block = mtr_page_get(0, seg_page, NULL, &mtr);
562
new_page = fseg_alloc_free_page(
563
buf_block_get_frame(block) + 1000,
564
new_page + 1, FSP_UP, &mtr);
565
if (i < FSP_EXTENT_SIZE - 1) {
566
ut_a(new_page == 2 + i);
568
ut_a(new_page == i + FSP_EXTENT_SIZE + 1);
571
printf("%lu %lu; ", i, new_page);
584
block = mtr_page_get(0, seg_page, NULL, &mtr);
586
mtr_page_s_lock(block, &mtr);
588
reserved = fseg_n_reserved_pages(buf_block_get_frame(block) + 1000,
592
ut_a(reserved >= 1024);
594
printf("Pages used in segment %lu reserved by segment %lu \n",
605
block = mtr_page_get(0, seg_page, NULL, &mtr);
607
finished = fseg_free_step(
608
buf_block_get_frame(block) + 1000, &mtr);
616
/***********************************************/
620
seg_page = fseg_create(0, 0, 1000, 557, &mtr);
628
seg_page2 = fseg_create(0, 0, 1000, 558, &mtr);
632
ut_a(seg_page2 == 2);
635
new_page2 = seg_page2;
641
block = mtr_page_get(0, seg_page, NULL, &mtr);
643
new_page = fseg_alloc_free_page(
644
buf_block_get_frame(block) + 1000,
645
new_page + 1, FSP_UP, &mtr);
647
printf("1:%lu %lu; ", i, new_page);
652
new_page = fseg_alloc_free_page(
653
buf_block_get_frame(block) + 1000,
654
new_page + 1, FSP_UP, &mtr);
656
printf("1:%lu %lu; ", i, new_page);
665
block = mtr_page_get(0, seg_page2, NULL, &mtr);
667
new_page2 = fseg_alloc_free_page(
668
buf_block_get_frame(block) + 1000,
669
new_page2 + 1, FSP_UP, &mtr);
671
printf("2:%lu %lu; ", i, new_page2);
678
if (new_page2 == FIL_NULL) {
685
block = mtr_page_get(0, seg_page, NULL, &mtr);
687
mtr_page_s_lock(block, &mtr);
689
reserved = fseg_n_reserved_pages(buf_block_get_frame(block) + 1000,
692
printf("Pages used in segment 1 %lu, reserved by segment %lu \n",
699
block = mtr_page_get(0, seg_page2, NULL, &mtr);
701
mtr_page_s_lock(block, &mtr);
703
reserved = fseg_n_reserved_pages(buf_block_get_frame(block) + 1000,
706
printf("Pages used in segment 2 %lu, reserved by segment %lu \n",
715
block = mtr_page_get(0, seg_page, NULL, &mtr);
718
buf_block_get_frame(block) + 1000, &mtr);
720
block = mtr_page_get(0, seg_page2, NULL, &mtr);
722
finished = fseg_free_step(
723
buf_block_get_frame(block) + 1000, &mtr);
734
seg_page2 = fseg_create(0, 0, 1000, 558, &mtr);
742
block = mtr_page_get(0, seg_page2, NULL, &mtr);
744
new_page2 = fseg_alloc_free_page(
745
buf_block_get_frame(block) + 1000,
746
557, FSP_DOWN, &mtr);
748
printf("%lu %lu; ", i, new_page2);
751
if (new_page2 == FIL_NULL) {
761
block = mtr_page_get(0, seg_page, NULL, &mtr);
763
finished = fseg_free_step(
764
buf_block_get_frame(block) + 1000, &mtr);
777
block = mtr_page_get(0, seg_page2, NULL, &mtr);
779
finished = fseg_free_step(
780
buf_block_get_frame(block) + 1000, &mtr);
790
/***************************************/
794
for (i = 0; i < 1000; i++) {
797
seg_page = fseg_create(0, 0, 1000, 555, &mtr);
803
block = mtr_page_get(0, seg_page, NULL, &mtr);
805
new_page = fseg_alloc_free_page(buf_block_get_frame(block) + 1000,
816
block = mtr_page_get(0, seg_page, NULL, &mtr);
818
finished = fseg_free_step(
819
buf_block_get_frame(block) + 1000, &mtr);
826
printf("Wall clock time for %lu seg crea+free %lu millisecs\n",
831
buf_flush_batch(BUF_FLUSH_LIST, 500);
833
os_thread_sleep(1000000);
839
/************************************************************************
840
Main test function. */
854
fil_init(26); /* Allow 25 open files at a time */
855
buf_pool_init(1000, 1000);
860
ut_a(fil_validate());
880
n = buf_flush_batch(BUF_FLUSH_LIST, 500);
882
os_thread_sleep(1000000);
889
printf("Wall clock time for test %lu milliseconds\n", tm - oldtm);
890
printf("TESTS COMPLETED SUCCESSFULLY!\n");