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

📄 tsfsp.c

📁 Mysql for Windows最新源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************The test module for file space management(c) 1996 Innobase OyCreated 1/4/1996 Heikki Tuuri*************************************************************************/#include "string.h"#include "os0thread.h"#include "os0file.h"#include "ut0ut.h"#include "ut0byte.h"#include "sync0sync.h"#include "mem0mem.h"#include "fil0fil.h"#include "mach0data.h"#include "buf0buf.h"#include "buf0flu.h"#include "log0log.h"#include "fut0lst.h"#include "fut0fut.h"#include "mtr0mtr.h"#include "mtr0log.h"#include "..\fsp0fsp.h"os_file_t	files[1000];mutex_t		ios_mutex;ulint		ios;ulint		n[10];mutex_t		incs_mutex;ulint		incs;ulint		page_nos[10000];#define N_SPACES	1#define N_FILES		2#define FILE_SIZE	1000 	/* must be > 512 */#define POOL_SIZE	1000#define	COUNTER_OFFSET	1500#define LOOP_SIZE	150#define	N_THREADS	5ulint zero = 0;buf_block_t*	bl_arr[POOL_SIZE];/************************************************************************Io-handler thread function. */ulinthandler_thread(/*===========*/	void*	arg){	ulint	segment;	void*	mess;	ulint	i;	bool	ret;		segment = *((ulint*)arg);	printf("Io handler 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 files for the file system test and inserts them tothe file system. */voidcreate_files(void)/*==============*/{	bool		ret;	ulint		i, k;	char		name[20];	os_thread_t	thr[5];	os_thread_id_t	id[5];	printf("--------------------------------------------------------\n");	printf("Create or open database files\n");	strcpy(name, "tsfile00");	for (k = 0; k < N_SPACES; k++) {	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_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);		}		ret = os_file_close(files[i]);		ut_a(ret);		if (i == 0) {			fil_space_create(name, k, OS_FILE_TABLESPACE);		}		ut_a(fil_validate());		fil_node_create(name, FILE_SIZE, 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);	}}/************************************************************************Creates the test database files. */void create_db(void)/*===========*/{	ulint			i;	buf_block_t*		block;	byte*			frame;	ulint			j;	ulint			tm, oldtm;	mtr_t			mtr;		printf("--------------------------------------------------------\n");	printf("Write database pages\n");	oldtm = ut_clock();	for (i = 0; i < N_SPACES; i++) {		for (j = 0; j < FILE_SIZE * N_FILES; j++) {			mtr_start(&mtr);					block = buf_page_create(i, j, &mtr);			frame = buf_block_get_frame(block);			buf_page_x_lock(block, &mtr);			if (j > FILE_SIZE * N_FILES				- 64 * 2 - 1) {				mlog_write_ulint(frame + FIL_PAGE_PREV, j - 5,						MLOG_4BYTES, &mtr);				mlog_write_ulint(frame + FIL_PAGE_NEXT, j - 7,						MLOG_4BYTES, &mtr);			} else {				mlog_write_ulint(frame + FIL_PAGE_PREV, j - 1,						MLOG_4BYTES, &mtr);				mlog_write_ulint(frame + FIL_PAGE_NEXT, j + 1,						MLOG_4BYTES, &mtr);			}								mlog_write_ulint(frame + FIL_PAGE_OFFSET, j,					MLOG_4BYTES, &mtr);			mlog_write_ulint(frame + FIL_PAGE_SPACE, i,					MLOG_4BYTES, &mtr);			mlog_write_ulint(frame + COUNTER_OFFSET, 0,					MLOG_4BYTES, &mtr);			mtr_commit(&mtr);					}	}	tm = ut_clock();	printf("Wall clock time for test %lu milliseconds\n", tm - oldtm);}	/************************************************************************Reads the test database files. */void test1(void)/*=======*/{	ulint			i, j, k;	buf_block_t*		block;	byte*			frame;	ulint			tm, oldtm;	mtr_t			mtr;		printf("--------------------------------------------------------\n");	printf("TEST 1. Read linearly database files\n");	oldtm = ut_clock();		for (k = 0; k < 1; k++) {	for (i = 0; i < N_SPACES; i++) {		for (j = 0; j < N_FILES * FILE_SIZE; j++) {			mtr_start(&mtr);					block = buf_page_get(i, j, &mtr);			frame = buf_block_get_frame(block);			buf_page_s_lock(block, &mtr);			ut_a(mtr_read_ulint(frame + FIL_PAGE_OFFSET,						MLOG_4BYTES, &mtr)					== j);			ut_a(mtr_read_ulint(frame + FIL_PAGE_SPACE,						MLOG_4BYTES, &mtr)					== i);						mtr_commit(&mtr);		}	}	}	tm = ut_clock();	printf("Wall clock time for %lu pages %lu milliseconds\n",			k * i * j, tm - oldtm);	buf_validate();}/************************************************************************Test for file-based lists. */voidtest2(void)/*=======*/{	mtr_t			mtr;	buf_frame_t*		frame;	buf_block_t*		block;	ulint			i;	flst_base_node_t*	base1;	fil_addr_t		base_addr1;	flst_base_node_t*	base2;	fil_addr_t		base_addr2;	flst_node_t*		node;	fil_addr_t		node_addr;	flst_node_t*		node2;	fil_addr_t		node_addr2;	flst_node_t*		node3;	fil_addr_t		node_addr3;#define	BPAGE	10#define BASE1	300#define BASE2	500#define	NODE1	800#define	NODE2	900#define	NODE3	1000#define	NODE4	1100#define INDEX	30		buf_validate();	mtr_start(&mtr);			block = buf_page_get(0, BPAGE, &mtr);	frame = buf_block_get_frame(block);	flst_init(frame + BASE1, &mtr);	flst_init(frame + BASE2, &mtr);		mtr_commit(&mtr);	printf("-------------------------------------------\n");	printf("TEST 2. Test of file-based two-way lists \n");		base_addr1.page = BPAGE;	base_addr1.boffset = BASE1;	base_addr2.page = BPAGE;	base_addr2.boffset = BASE2;	printf(   "Add 1000 elements in list1 in reversed order and in list2 in order\n");	for (i = 0; i < 1000; i++) {		mtr_start(&mtr);		base1 = fut_get_ptr(0, base_addr1, &mtr);		base2 = fut_get_ptr(0, base_addr2, &mtr);		block = buf_page_get(0, i, &mtr);		frame = buf_block_get_frame(block);		buf_page_x_lock(block, &mtr);		flst_add_first(base1, frame + NODE1, &mtr);		mlog_write_ulint(frame + NODE1 + INDEX, i,				MLOG_4BYTES, &mtr);		flst_add_last(base2, frame + NODE2, &mtr);		mlog_write_ulint(frame + NODE2 + INDEX, i,				MLOG_4BYTES, &mtr);		mtr_commit(&mtr);	}	mtr_start(&mtr);	base1 = fut_get_ptr(0, base_addr1, &mtr);	base2 = fut_get_ptr(0, base_addr2, &mtr);	flst_validate(base1, &mtr);	flst_validate(base2, &mtr);	flst_print(base1, &mtr);	flst_print(base2, &mtr);	mtr_commit(&mtr);	mtr_start(&mtr);	base1 = fut_get_ptr_s_lock(0, base_addr1, &mtr);	node_addr = flst_get_first(base1, &mtr);	mtr_commit(&mtr);	printf("Check order of elements in list1\n");	for (i = 0; i < 1000; i++) {		mtr_start(&mtr);		ut_a(!fil_addr_is_null(node_addr));				node = fut_get_ptr_x_lock(0, node_addr, &mtr);			ut_a(mtr_read_ulint(node + INDEX, MLOG_4BYTES, &mtr) ==			999 - i);		node_addr = flst_get_next_addr(node, &mtr);		mtr_commit(&mtr);	}	ut_a(fil_addr_is_null(node_addr));	mtr_start(&mtr);	base2 = fut_get_ptr_s_lock(0, base_addr2, &mtr);	node_addr = flst_get_first(base2, &mtr);	mtr_commit(&mtr);	printf("Check order of elements in list2\n");	for (i = 0; i < 1000; i++) {		mtr_start(&mtr);		ut_a(!fil_addr_is_null(node_addr));				node = fut_get_ptr_x_lock(0, node_addr, &mtr);			ut_a(mtr_read_ulint(node + INDEX, MLOG_4BYTES, &mtr)			== i);		node_addr = flst_get_next_addr(node, &mtr);		mtr_commit(&mtr);	}	ut_a(fil_addr_is_null(node_addr));	mtr_start(&mtr);	base1 = fut_get_ptr(0, base_addr1, &mtr);	base2 = fut_get_ptr(0, base_addr2, &mtr);	flst_validate(base1, &mtr);	flst_validate(base2, &mtr);	mtr_commit(&mtr);	mtr_start(&mtr);	base1 = fut_get_ptr_s_lock(0, base_addr1, &mtr);	node_addr = flst_get_first(base1, &mtr);	mtr_commit(&mtr);	for (i = 0; i < 500; i++) {		mtr_start(&mtr);		ut_a(!fil_addr_is_null(node_addr));				node = fut_get_ptr_x_lock(0, node_addr, &mtr);		node_addr = flst_get_next_addr(node, &mtr);		mtr_commit(&mtr);	}	printf("Add 200 elements to the middle of list1\n");		for (i = 0; i < 100; i++) {		mtr_start(&mtr);				node = fut_get_ptr_x_lock(0, node_addr, &mtr);		node_addr2.page = i;		node_addr2.boffset = NODE3;		node2 = fut_get_ptr_x_lock(0, node_addr2, &mtr);		node_addr3.page = i;		node_addr3.boffset = NODE4;		node3 = fut_get_ptr_x_lock(0, node_addr3, &mtr);		mlog_write_ulint(node2 + INDEX, 99 - i, MLOG_4BYTES, &mtr);		block = buf_page_get(0, BPAGE, &mtr);		frame = buf_block_get_frame(block);		base1 = frame + BASE1;				flst_insert_after(base1, node, node2, &mtr);		flst_insert_before(base1, node3, node, &mtr);		if (i % 17 == 0) {			flst_validate(base1, &mtr);		}		mtr_commit(&mtr);	}	printf("Check that 100 of the inserted nodes are in order\n");	mtr_start(&mtr);	ut_a(!fil_addr_is_null(node_addr));			node = fut_get_ptr_x_lock(0, node_addr, &mtr);	node_addr = flst_get_next_addr(node, &mtr);	mtr_commit(&mtr);	for (i = 0; i < 100; i++) {		mtr_start(&mtr);		ut_a(!fil_addr_is_null(node_addr));				node = fut_get_ptr_x_lock(0, node_addr, &mtr);			ut_a(mtr_read_ulint(node + INDEX, MLOG_4BYTES, &mtr)			== i);		node_addr = flst_get_next_addr(node, &mtr);		mtr_commit(&mtr);	}	printf("Remove 899 elements from the middle of list1\n");	mtr_start(&mtr);	base1 = fut_get_ptr_x_lock(0, base_addr1, &mtr);	node_addr = flst_get_first(base1, &mtr);	flst_print(base1, &mtr);	mtr_commit(&mtr);	for (i = 0; i < 300; i++) {		mtr_start(&mtr);		ut_a(!fil_addr_is_null(node_addr));				node = fut_get_ptr_x_lock(0, node_addr, &mtr);		node_addr = flst_get_next_addr(node, &mtr);		mtr_commit(&mtr);	}	for (i = 0; i < 899; i++) {		mtr_start(&mtr);		base1 = fut_get_ptr_x_lock(0, base_addr1, &mtr);		node_addr = flst_get_first(base1, &mtr);		node = fut_get_ptr_x_lock(0, node_addr, &mtr);		node_addr = flst_get_next_addr(node, &mtr);		ut_a(!fil_addr_is_null(node_addr));		node2 = fut_get_ptr_x_lock(0, node_addr, &mtr);		flst_remove(base1, node2, &mtr);		if (i % 17 == 0) {			flst_validate(base1, &mtr);		}				mtr_commit(&mtr);	}	printf("Remove 301 elements from the start of list1\n");	for (i = 0; i < 301; i++) {		mtr_start(&mtr);		base1 = fut_get_ptr_x_lock(0, base_addr1, &mtr);		node_addr = flst_get_first(base1, &mtr);		node = fut_get_ptr_x_lock(0, node_addr, &mtr);		flst_remove(base1, node, &mtr);		if (i % 17 == 0) {			flst_validate(base1, &mtr);		}		mtr_commit(&mtr);	}	mtr_start(&mtr);	base1 = fut_get_ptr_x_lock(0, base_addr1, &mtr);	ut_a(flst_get_len(base1, &mtr) == 0);	flst_print(base1, &mtr);	mtr_commit(&mtr);}/************************************************************************Inits space header of space 0. */voidinit_space(void)/*============*/{	mtr_t		mtr;	printf("Init space header\n");		mtr_start(&mtr);	fsp_header_init(0, FILE_SIZE * N_FILES, &mtr);			mtr_commit(&mtr);}/************************************************************************Test for file space management. */voidtest5(void)/*=======*/{	mtr_t		mtr;	ulint		seg_page;	ulint		new_page;	ulint		seg_page2;	ulint		new_page2;	ulint		seg_page3;	buf_block_t*	block;	bool		finished;	ulint		i;	ulint		reserved;	ulint		used;	ulint		tm, oldtm;		buf_validate();	fsp_validate(0);	fsp_print(0);		mtr_start(&mtr);	seg_page = fseg_create(0, 0, 1000, &mtr);	mtr_commit(&mtr);	fsp_validate(0);	buf_validate();	printf("Segment created: header page %lu, byte offset %lu\n",						seg_page, 1000);	fsp_print(0);	mtr_start(&mtr);	block = buf_page_get(0, seg_page, &mtr);		new_page = fseg_alloc_free_page(buf_block_get_frame(block) + 1000,					2, FSP_UP, &mtr);			mtr_commit(&mtr);	fsp_print(0);	fsp_validate(0);	buf_validate();	printf("Segment page allocated %lu\n", new_page);	mtr_start(&mtr);	block = buf_page_get(0, seg_page, &mtr);		fseg_free_page(buf_block_get_frame(block) + 1000,					0, new_page, &mtr);	

⌨️ 快捷键说明

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