diff options
Diffstat (limited to 'innobase/fil/ts/tsfil.c')
-rw-r--r-- | innobase/fil/ts/tsfil.c | 329 |
1 files changed, 329 insertions, 0 deletions
diff --git a/innobase/fil/ts/tsfil.c b/innobase/fil/ts/tsfil.c new file mode 100644 index 00000000000..61fdefe28af --- /dev/null +++ b/innobase/fil/ts/tsfil.c @@ -0,0 +1,329 @@ +/************************************************************************ +The test module for the file system + +(c) 1995 Innobase Oy + +Created 10/29/1995 Heikki Tuuri +*************************************************************************/ + +#include "os0thread.h" +#include "os0file.h" +#include "ut0ut.h" +#include "sync0sync.h" +#include "mem0mem.h" +#include "..\fil0fil.h" + +ulint last_thr = 1; + +byte global_buf[10000000]; +byte global_buf2[20000]; + +os_file_t files[1000]; + +os_event_t gl_ready; + +mutex_t ios_mutex; +ulint ios; + +/********************************************************************* +Test for synchronous file io. */ + +void +test1(void) +/*=======*/ +{ + ulint i, j; + void* mess; + bool ret; + void* buf; + ulint rnd, rnd3; + ulint tm, oldtm; + + printf("-------------------------------------------\n"); + printf("FIL-TEST 1. Test of synchronous file io\n"); + + /* Align the buffer for file io */ + + buf = (void*)(((ulint)global_buf + 6300) & (~0xFFF)); + + rnd = ut_time(); + rnd3 = ut_time(); + + rnd = rnd * 3416133; + rnd3 = rnd3 * 6576681; + + oldtm = ut_clock(); + + for (j = 0; j < 300; j++) { + for (i = 0; i < (rnd3 % 15); i++) { + fil_read((rnd % 1000) / 100, rnd % 100, 0, 8192, buf, NULL); + + ut_a(fil_validate()); + + ret = fil_aio_wait(0, &mess); + ut_a(ret); + + ut_a(fil_validate()); + + ut_a(*((ulint*)buf) == rnd % 1000); + + rnd += 1; + } + rnd = rnd + 3416133; + rnd3 = rnd3 + 6576681; + } + + tm = ut_clock(); + printf("Wall clock time for synchr. io %lu milliseconds\n", + tm - oldtm); + +} + +/************************************************************************ +Io-handler thread function. */ + +ulint +handler_thread( +/*===========*/ + void* arg) +{ + ulint segment; + void* mess; + void* buf; + ulint i; + bool ret; + + segment = *((ulint*)arg); + + buf = (void*)(((ulint)global_buf + 6300) & (~0xFFF)); + + printf("Thread %lu starts\n", segment); + + for (i = 0;; i++) { + ret = fil_aio_wait(segment, &mess); + ut_a(ret); + + if ((ulint)mess == 3333) { + os_event_set(gl_ready); + } else { + ut_a((ulint)mess == + *((ulint*)((byte*)buf + 8192 * (ulint)mess))); + } + + mutex_enter(&ios_mutex); + ios++; + mutex_exit(&ios_mutex); + + ut_a(ret); +/* printf("Message for thread %lu %lu\n", segment, + (ulint)mess); */ + } + + return(0); +} + +/************************************************************************ +Test of io-handler threads */ + +void +test2(void) +/*=======*/ +{ + ulint i; + ulint j; + void* buf; + ulint rnd, rnd3; + ulint tm, oldtm; + os_thread_t thr[5]; + os_thread_id_t id[5]; + ulint n[5]; + + /* Align the buffer for file io */ + + buf = (void*)(((ulint)global_buf + 6300) & (~0xFFF)); + + gl_ready = os_event_create(NULL); + 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); + } + + printf("-------------------------------------------\n"); + printf("FIL-TEST 2. Test of asynchronous file io\n"); + + rnd = ut_time(); + rnd3 = ut_time(); + + rnd = rnd * 3416133; + rnd3 = rnd3 * 6576681; + + oldtm = ut_clock(); + + for (j = 0; j < 300; j++) { + for (i = 0; i < (rnd3 % 15); i++) { + fil_read((rnd % 1000) / 100, rnd % 100, 0, 8192, + (void*)((byte*)buf + 8192 * (rnd % 1000)), + (void*)(rnd % 1000)); + + rnd += 1; + } + ut_a(fil_validate()); + rnd = rnd + 3416133; + rnd3 = rnd3 + 6576681; + } + + ut_a(!os_aio_all_slots_free()); + + tm = ut_clock(); + printf("Wall clock time for asynchr. io %lu milliseconds\n", + tm - oldtm); + + fil_read(5, 25, 0, 8192, + (void*)((byte*)buf + 8192 * 1000), + (void*)3333); + + tm = ut_clock(); + + ut_a(fil_validate()); + + printf("All ios queued! N ios: %lu\n", ios); + + printf("Wall clock time for test %lu milliseconds\n", tm - oldtm); + + os_event_wait(gl_ready); + + tm = ut_clock(); + printf("N ios: %lu\n", ios); + printf("Wall clock time for test %lu milliseconds\n", tm - oldtm); + + os_thread_sleep(2000000); + + printf("N ios: %lu\n", ios); + + ut_a(fil_validate()); + ut_a(os_aio_all_slots_free()); +} + +/************************************************************************* +Creates the files for the file system test and inserts them to +the file system. */ + +void +create_files(void) +/*==============*/ +{ + bool ret; + ulint i, j, k, n; + void* buf; + void* mess; + char name[10]; + + buf = (void*)(((ulint)global_buf2 + 6300) & (~0xFFF)); + + name[0] = 't'; + name[1] = 's'; + name[2] = 'f'; + name[3] = 'i'; + name[4] = 'l'; + name[5] = 'e'; + name[8] = '\0'; + + for (k = 0; k < 10; k++) { + for (i = 0; i < 20; i++) { + + name[6] = (char)(k + (ulint)'a'); + name[7] = (char)(i + (ulint)'a'); + + 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); + } else { + + for (j = 0; j < 5; j++) { + for (n = 0; n < 8192 / sizeof(ulint); n++) { + *((ulint*)buf + n) = + k * 100 + i * 5 + j; + } + + ret = os_aio_write(files[i], buf, 8192 * j, + 0, 8192, NULL); + ut_a(ret); + + ret = os_aio_wait(0, &mess); + + ut_a(ret); + ut_a(mess == NULL); + } + } + + ret = os_file_close(files[i]); + ut_a(ret); + + if (i == 0) { + fil_space_create("noname", k, OS_FILE_TABLESPACE); + } + + ut_a(fil_validate()); + + fil_node_create(name, 5, k); + } + } +} + +/************************************************************************ +Frees the spaces in the file system. */ + +void +free_system(void) +/*=============*/ +{ + ulint i; + + for (i = 0; i < 10; i++) { + fil_space_free(i); + } +} + +/************************************************************************ +Main test function. */ + +void +main(void) +/*======*/ +{ + ulint tm, oldtm; + + oldtm = ut_clock(); + + os_aio_init(160, 5); + sync_init(); + mem_init(); + fil_init(2); /* Allow only 2 open files at a time */ + + ut_a(fil_validate()); + + create_files(); + + test1(); + + test2(); + + free_system(); + + tm = ut_clock(); + printf("Wall clock time for test %lu milliseconds\n", tm - oldtm); + printf("TESTS COMPLETED SUCCESSFULLY!\n"); +} |