⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tsbuf.c

📁 Mysql for Windows最新源码
💻 C
字号:
/************************************************************************The test module for the file system and buffer manager(c) 1995 Innobase OyCreated 11/16/1995 Heikki Tuuri*************************************************************************/#include "os0thread.h"#include "os0file.h"#include "ut0ut.h"#include "sync0sync.h"#include "mem0mem.h"#include "fil0fil.h"#include "..\buf0buf.h"#include "..\buf0flu.h"#include "..\buf0lru.h"os_file_t	files[1000];mutex_t		ios_mutex;ulint		ios;ulint		n[5];/************************************************************************Io-handler thread function. */ulinthandler_thread(/*===========*/	void*	arg){	ulint	segment;	void*	mess;	ulint	i;	bool	ret;		segment = *((ulint*)arg);	printf("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 test database files. */void create_db(void)/*===========*/{	ulint			i;	buf_block_t*		block;	byte*			frame;	ulint			j;	ulint			tm, oldtm;	oldtm = ut_clock();	for (i = 0; i < 1; i++) {		for (j = 0; j < 4096; j++) {			block = buf_page_create(i, j);			frame = buf_block_get_frame(block);			rw_lock_x_lock(buf_page_get_lock(block));			if (j > 0) {				fil_page_set_prev(frame, j - 1);			} else {				fil_page_set_prev(frame, 0);			}			if (j < 4095) {				fil_page_set_next(frame, j + 1);			} else {				fil_page_set_next(frame, 0);			}			*((ulint*)(frame + 16)) = j;						buf_page_note_modification(block);						rw_lock_x_unlock(buf_page_get_lock(block));			buf_page_release(block);		}	}	tm = ut_clock();	printf("Wall clock time for test %lu milliseconds\n", tm - oldtm);/*	buf_LRU_print(); */	/* Flush the pool of dirty pages by reading low-offset pages */	for (i = 0; i < 1000; i++) {				block = buf_page_get(0, i, NULL);		frame = buf_block_get_frame(block);		rw_lock_s_lock(buf_page_get_lock(block));		ut_a(*((ulint*)(frame + 16)) == i);					rw_lock_s_unlock(buf_page_get_lock(block));		buf_page_release(block);	}/*	buf_LRU_print(); */	os_thread_sleep(1000000);	ut_a(buf_all_freed());}	/*************************************************************************Creates the files for the file system test and inserts them tothe file system. */voidcreate_files(void)/*==============*/{	bool	ret;	ulint	i, k;	char	name[10];	os_thread_t		thr[5];	os_thread_id_t		id[5];		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 < 1; k++) {	for (i = 0; i < 1; i++) {		name[6] = (char)(k + (ulint)'a');		name[7] = (char)(i + (ulint)'a');			files[i] = os_file_create("j:\\tsfile4", 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(				"j:\\tsfile4", OS_FILE_OPEN,						OS_FILE_TABLESPACE, &ret);			ut_a(ret);		}		ret = os_file_set_size(files[i], 4096 * 8192, 0);		ut_a(ret);						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("j:\\tsfile4", 4096, 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);	}}/************************************************************************Reads the test database files. */void test1(void)/*=======*/{	ulint			i, j, k;	buf_block_t*		block;	byte*			frame;	ulint			tm, oldtm;	buf_flush_batch(BUF_FLUSH_LIST, 1000);	os_thread_sleep(1000000);	buf_all_freed();		oldtm = ut_clock();		for (k = 0; k < 1; k++) {	for (i = 0; i < 1; i++) {		for (j = 0; j < 409; j++) {			block = buf_page_get(i, j, NULL);			frame = buf_block_get_frame(block);			rw_lock_s_lock(buf_page_get_lock(block));			ut_a(*((ulint*)(frame + 16)) == j);						rw_lock_s_unlock(buf_page_get_lock(block));			buf_page_release(block);		}	}	}	tm = ut_clock();	printf("Wall clock time for test %lu milliseconds\n", tm - oldtm);}/************************************************************************Reads the test database files. */void test2(void)/*=======*/{	ulint			i, j, k, rnd;	buf_block_t*		block;	byte*			frame;	ulint			tm, oldtm;	oldtm = ut_clock();	rnd = 123;	for (k = 0; k < 100; k++) {		rnd += 23651;		rnd = rnd % 4096;			i = rnd / 4096; 		j = rnd % 2048;				block = buf_page_get(i, j, NULL);		frame = buf_block_get_frame(block);		rw_lock_s_lock(buf_page_get_lock(block));		ut_a(*((ulint*)(frame + 16)) == j);					rw_lock_s_unlock(buf_page_get_lock(block));		buf_page_release(block);	}	tm = ut_clock();	printf("Wall clock time for random read %lu milliseconds\n",		tm - oldtm);}/************************************************************************Reads the test database files. */void test4(void)/*=======*/{	ulint			i, j, k, rnd;	buf_block_t*		block;	byte*			frame;	ulint			tm, oldtm;	/* Flush the pool of high-offset pages */	for (i = 0; i < 1000; i++) {				block = buf_page_get(0, i, NULL);		frame = buf_block_get_frame(block);		rw_lock_s_lock(buf_page_get_lock(block));		ut_a(*((ulint*)(frame + 16)) == i);					rw_lock_s_unlock(buf_page_get_lock(block));		buf_page_release(block);	}	printf("Test starts\n");		oldtm = ut_clock();	rnd = 123;	for (k = 0; k < 400; k++) {		rnd += 4357;			i = 0;		j = 1001 + rnd % 3000;				block = buf_page_get(i, j, NULL);		frame = buf_block_get_frame(block);		rw_lock_s_lock(buf_page_get_lock(block));		ut_a(*((ulint*)(frame + 16)) == j);					rw_lock_s_unlock(buf_page_get_lock(block));		buf_page_release(block);	}	tm = ut_clock();	printf(	   "Wall clock time for %lu random no read-ahead %lu milliseconds\n",		k, tm - oldtm);	/* Flush the pool of high-offset pages */	for (i = 0; i < 1000; i++) {				block = buf_page_get(0, i, NULL);		frame = buf_block_get_frame(block);		rw_lock_s_lock(buf_page_get_lock(block));		ut_a(*((ulint*)(frame + 16)) == i);					rw_lock_s_unlock(buf_page_get_lock(block));		buf_page_release(block);	}	printf("Test starts\n");	oldtm = ut_clock();	rnd = 123;	for (k = 0; k < 400; k++) {		rnd += 4357;			i = 0;		j = 1001 + rnd % 400;				block = buf_page_get(i, j, NULL);		frame = buf_block_get_frame(block);		rw_lock_s_lock(buf_page_get_lock(block));		ut_a(*((ulint*)(frame + 16)) == j);					rw_lock_s_unlock(buf_page_get_lock(block));		buf_page_release(block);	}	tm = ut_clock();	printf(	   "Wall clock time for %lu random read-ahead %lu milliseconds\n",		k, tm - oldtm);}/************************************************************************Tests speed of CPU algorithms. */void test3(void)/*=======*/{	ulint			i, j;	buf_block_t*		block;	ulint			tm, oldtm;	for (i = 0; i < 400; i++) {				block = buf_page_get(0, i, NULL);		buf_page_release(block);	}	os_thread_sleep(2000000);	oldtm = ut_clock();	for (j = 0; j < 500; j++) {	for (i = 0; i < 200; i++) {				block = buf_page_get(0, i, NULL);/*		rw_lock_s_lock(buf_page_get_lock(block));		rw_lock_s_unlock(buf_page_get_lock(block));*/		buf_page_release(block);	}	}	tm = ut_clock();	printf("Wall clock time for %lu page get-release %lu milliseconds\n",			i * j, tm - oldtm);	oldtm = ut_clock();	for (j = 0; j < 500; j++) {	for (i = 0; i < 200; i++) {				buf_block_get(block);/*		rw_lock_s_lock(buf_page_get_lock(block));		rw_lock_s_unlock(buf_page_get_lock(block));*/		buf_page_release(block);	}	}	tm = ut_clock();	printf("Wall clock time for %lu block get-release %lu milliseconds\n",			i * j, tm - oldtm);	oldtm = ut_clock();	for (i = 0; i < 100000; i++) {		block = buf_block_alloc();		buf_block_free(block);	}	tm = ut_clock();	printf("Wall clock time for %lu block alloc-free %lu milliseconds\n",			i, tm - oldtm);	ha_print_info(buf_pool->page_hash);}/************************************************************************Frees the spaces in the file system. */voidfree_system(void)/*=============*/{	ulint	i;	for (i = 0; i < 1; i++) {		fil_space_free(i);	}}/************************************************************************Main test function. */void main(void) /*======*/{	ulint	tm, oldtm;	ulint	n;	oldtm = ut_clock();		os_aio_init(160, 5);	sync_init();	mem_init();	fil_init(26);	/* Allow 25 open files at a time */	buf_pool_init(1000, 1000);		buf_validate();	ut_a(fil_validate());		create_files();	create_db();	buf_validate();	test1();	test3();	test4();	test2();	buf_validate();	n = buf_flush_batch(BUF_FLUSH_LIST, 500);	os_thread_sleep(1000000);		buf_all_freed();		free_system();			tm = ut_clock();	printf("Wall clock time for test %lu milliseconds\n", tm - oldtm);	printf("TESTS COMPLETED SUCCESSFULLY!\n");} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -