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

📄 tsfsp.c

📁 Mysql for Windows最新源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		mtr_commit(&mtr);	fsp_validate(0);	printf("Segment page freed %lu\n", new_page);		finished = FALSE;	while (!finished) {			mtr_start(&mtr);		block = buf_page_get(0, seg_page, &mtr);			finished = fseg_free_step(			buf_block_get_frame(block) + 1000, &mtr);				mtr_commit(&mtr);	}	fsp_validate(0);	/***********************************************/	buf_validate();	mtr_start(&mtr);	seg_page = fseg_create(0, 0, 1000, &mtr);	mtr_commit(&mtr);	ut_a(seg_page == 2);		printf("Segment created: header page %lu\n", seg_page);	new_page = seg_page;	for (i = 0; i < 511; i++) {		mtr_start(&mtr);		block = buf_page_get(0, seg_page, &mtr);			new_page = fseg_alloc_free_page(					buf_block_get_frame(block) + 1000,					new_page + 1, FSP_UP, &mtr);		printf("%lu %lu; ", i, new_page);		if (i % 10 == 0) {			printf("\n");		}			mtr_commit(&mtr);		if (i % 117 == 0) {			fsp_validate(0);		}	}	fsp_validate(0);	buf_validate();	mtr_start(&mtr);	block = buf_page_get(0, seg_page, &mtr);	reserved = fseg_n_reserved_pages(buf_block_get_frame(block) + 1000,					&used, &mtr);	ut_a(used == 512);		ut_a(reserved >= 512);		printf("Pages used in segment %lu reserved by segment %lu \n",		used, reserved);		mtr_commit(&mtr);	finished = FALSE;	while (!finished) {		i++;				mtr_start(&mtr);		block = buf_page_get(0, seg_page, &mtr);			finished = fseg_free_step(			buf_block_get_frame(block) + 1000, &mtr);				mtr_commit(&mtr);		if (i % 117 == 0) {			fsp_validate(0);		}	}	fsp_validate(0);	buf_validate();	/***********************************************/	mtr_start(&mtr);	seg_page = fseg_create(0, 0, 1000, &mtr);	mtr_commit(&mtr);	ut_a(seg_page == 2);	mtr_start(&mtr);	seg_page2 = fseg_create(0, 0, 1000, &mtr);	mtr_commit(&mtr);	ut_a(seg_page2 == 3);		new_page = seg_page;	new_page2 = seg_page2;	for (;;) {		mtr_start(&mtr);		block = buf_page_get(0, seg_page, &mtr);			new_page = fseg_alloc_free_page(					buf_block_get_frame(block) + 1000,					new_page + 1, FSP_UP, &mtr);		printf("1:%lu %lu; ", i, new_page);		if (i % 10 == 0) {			printf("\n");		}			new_page = fseg_alloc_free_page(					buf_block_get_frame(block) + 1000,					new_page + 1, FSP_UP, &mtr);		printf("1:%lu %lu; ", i, new_page);		if (i % 10 == 0) {			printf("\n");		}				mtr_commit(&mtr);		i++;		if (i % 217 == 0) {			fsp_validate(0);		}				mtr_start(&mtr);		block = buf_page_get(0, seg_page2, &mtr);			new_page2 = fseg_alloc_free_page(					buf_block_get_frame(block) + 1000,					new_page2 + 1, FSP_DOWN, &mtr);		printf("2:%lu %lu; ", i, new_page2);		if (i % 10 == 0) {			printf("\n");		}			mtr_commit(&mtr);		if (new_page2 == FIL_NULL) {			break;		}	}	mtr_start(&mtr);	block = buf_page_get(0, seg_page, &mtr);	reserved = fseg_n_reserved_pages(buf_block_get_frame(block) + 1000,					&used, &mtr);	printf("Pages used in segment 1 %lu, reserved by segment %lu \n",		used, reserved);		mtr_commit(&mtr);	fsp_validate(0);	mtr_start(&mtr);	block = buf_page_get(0, seg_page2, &mtr);	reserved = fseg_n_reserved_pages(buf_block_get_frame(block) + 1000,					&used, &mtr);	printf("Pages used in segment 2 %lu, reserved by segment %lu \n",		used, reserved);		mtr_commit(&mtr);	fsp_print(0);		for (;;) {		i++;		mtr_start(&mtr);		block = buf_page_get(0, seg_page, &mtr);			fseg_free_step(			      buf_block_get_frame(block) + 1000, &mtr);			block = buf_page_get(0, seg_page2, &mtr);			finished = fseg_free_step(			      buf_block_get_frame(block) + 1000, &mtr);		mtr_commit(&mtr);		if (finished) {			break;		}		if (i % 117 == 0) {			fsp_validate(0);		}	}	fsp_validate(0);	mtr_start(&mtr);	seg_page3 = fseg_create(0, 0, 1000, &mtr);	page_nos[0] = seg_page3;	new_page2 = seg_page3;	mtr_commit(&mtr);	for (i = 1; i < 250; i++) {		mtr_start(&mtr);		block = buf_page_get(0, seg_page3, &mtr);			new_page2 = fseg_alloc_free_page(					buf_block_get_frame(block) + 1000,					new_page2 + 1, FSP_UP, &mtr);		page_nos[i] = new_page2;		mtr_commit(&mtr);	}	/*************************************************/	mtr_start(&mtr);	fseg_create(0, seg_page3, 1500, &mtr);	mtr_commit(&mtr);	for (i = 0; i < 250; i++) {		mtr_start(&mtr);		block = buf_page_get(0, seg_page3, &mtr);			new_page2 = fseg_alloc_free_page(					buf_block_get_frame(block) + 1500,					new_page2 + 1, FSP_UP, &mtr);		page_nos[i] = new_page2;		mtr_commit(&mtr);	}	printf("---------------------------------------------------------\n");	printf("TEST 5A13. Test free_step.\n");	fseg_free(0, seg_page3, 1500);		printf("---------------------------------------------------------\n");	printf("TEST 5A3. Test free_step.\n");	for (;;) {		mtr_start(&mtr);		block = buf_page_get(0, seg_page3, &mtr);			finished = fseg_free_step(			      buf_block_get_frame(block) + 1000, &mtr);			mtr_commit(&mtr);		if (finished) {			break;		}	}	/***************************************************/		mtr_start(&mtr);	seg_page2 = fseg_create(0, 0, 1000, &mtr);	page_nos[0] = seg_page2;	new_page2 = seg_page2;	mtr_commit(&mtr);	i = 1;	for (;;) {		mtr_start(&mtr);		block = buf_page_get(0, seg_page2, &mtr);			new_page2 = fseg_alloc_free_page(					buf_block_get_frame(block) + 1000,					new_page2 + 1, FSP_UP, &mtr);		page_nos[i] = new_page2;/*		printf("%lu %lu; ", i, new_page2);*/		mtr_commit(&mtr);		if (new_page2 == FIL_NULL) {			break;		}		i++;	}	printf("---------------------------------------------------------\n");	printf("TEST 5D. Test free_step.\n");	for (;;) {		mtr_start(&mtr);		block = buf_page_get(0, seg_page, &mtr);			finished = fseg_free_step(			      buf_block_get_frame(block) + 1000, &mtr);			mtr_commit(&mtr);		if (finished) {			break;		}	}	for (;;) {		mtr_start(&mtr);		block = buf_page_get(0, seg_page2, &mtr);			finished = fseg_free_step(			      buf_block_get_frame(block) + 1000, &mtr);			mtr_commit(&mtr);		if (finished) {			break;		}	}		/***************************************/		oldtm = ut_clock();	fsp_validate(0);    for (i = 0; i < 10; i++) {		mtr_start(&mtr);	seg_page = fseg_create(0, 0, 1000, &mtr);	mtr_commit(&mtr);	mtr_start(&mtr);	block = buf_page_get(0, seg_page, &mtr);		new_page = fseg_alloc_free_page(buf_block_get_frame(block) + 1000,					3, FSP_UP, &mtr);			mtr_commit(&mtr);	finished = FALSE;	while (!finished) {			mtr_start(&mtr);		block = buf_page_get(0, seg_page, &mtr);			finished = fseg_free_step(			buf_block_get_frame(block) + 1000, &mtr);				mtr_commit(&mtr);	}    }	tm = ut_clock();	printf("Wall clock time for %lu seg crea+free %lu millisecs\n",			i, tm - oldtm);	buf_validate();	fsp_validate(0);	fsp_print(0);	buf_flush_batch(BUF_FLUSH_LIST, 2000);	os_thread_sleep(3000000);/*	buf_print(); */	buf_all_freed();}	/************************************************************************Random test thread function. */ulintrandom_thread(/*===========*/	void*	arg){	ulint		n;	ulint		i, j, t, p, sp, d, b;	ulint		s;	ulint		arr[FILE_SIZE * N_FILES];	ulint		seg_page;	fseg_header_t*	seg_header;	fil_addr_t	seg_addr;	byte		dir;	ulint		k;	mtr_t		mtr;	bool		finished;	ulint		used;	ulint		reserved;		n = *((ulint*)arg);	n = os_thread_get_curr_id();	printf("Random test thread %lu starts\n", n);	for (i = 0; i < 30; i++) {	   t = ut_rnd_gen_ulint() % 10;	   s = ut_rnd_gen_ulint() % FILE_SIZE * N_FILES;	   p = 0;	   sp = ut_rnd_gen_ulint() % N_SPACES;	   d = ut_rnd_gen_ulint() % 3;	   b = ut_rnd_gen_ulint() % 3;	   	   if (i % 10 == 0) {	   	printf("Thr %lu round %lu starts\n", n, i);	   }	   ut_a(buf_validate());	   if (t != 0) {		do {		mtr_start(&mtr);		seg_page = fseg_create(sp, p, 1000, &mtr);		mtr_commit(&mtr);		} while (seg_page == FIL_NULL);				seg_addr.page = seg_page;		seg_addr.boffset = 1000;		k = 0;		j = 0;	   	while (j < s) {	   		j++;	   		if (d == 0) {	   			dir = FSP_DOWN;	   		} else if (d == 1) {	   			dir = FSP_NO_DIR;	   		} else {	   			dir = FSP_UP;	   		}			mtr_start(&mtr);			seg_header = fut_get_ptr(sp, seg_addr, &mtr);			if (b != 0) {	   			arr[k] = fseg_alloc_free_page(seg_header,						p, dir, &mtr);	   			k++;	   		} else if (k > 0) {				fseg_free_page(seg_header, sp, arr[k - 1],						&mtr);				k--;			} 		   		mtr_commit(&mtr);	   		if ((k > 0) && (arr[k - 1] == FIL_NULL)) {	   			k--;				break;			}			if (p > 0) {				p = arr[k - 1] + dir - 1;			}			if (j % 577 == 0) {				if (k > 0) {					p = arr[k / 2] + 1;				} else {					p = 0;				}				d = ut_rnd_gen_ulint() % 3;	   			b = ut_rnd_gen_ulint() % 3;			}		   	}		finished = FALSE;		mtr_start(&mtr);		seg_header = fut_get_ptr(sp, seg_addr, &mtr);			reserved = fseg_n_reserved_pages(seg_header,					&used, &mtr);		printf("Pages used in segment %lu reserved by segment %lu \n",			used, reserved);			mtr_commit(&mtr);		printf("Thread %lu starts releasing seg %lu size %lu\n", n,				seg_addr.page, k);		while (!finished) {			mtr_start(&mtr);			seg_header = fut_get_ptr(sp, seg_addr, &mtr);				finished = fseg_free_step(seg_header, &mtr);				mtr_commit(&mtr);		}	   } else {		fsp_print(sp);		printf("Thread %lu validates fsp\n", n);	   	fsp_validate(sp);	   	buf_validate();	   }	} /* for i */	printf("\nRandom test thread %lu exits\n", os_thread_get_curr_id());	return(0);}/*************************************************************************Performs random operations on the buffer with several threads. */voidtest6(void)/*=======*/{	ulint		i;	os_thread_t	thr[N_THREADS + 1];	os_thread_id_t	id[N_THREADS + 1];	ulint		n[N_THREADS + 1];		printf("--------------------------------------------------------\n");	printf("TEST 6. Random multi-thread test on the buffer \n");	incs = 0;	mutex_create(&incs_mutex);		for (i = 0; i < N_THREADS; i++) {		n[i] = i;		thr[i] = os_thread_create(random_thread, n + i, id + i);	}	for (i = 0; i < N_THREADS; i++) {		os_thread_wait(thr[i]);	}}/************************************************************************Main test function. */void main(void) /*======*/{	ulint	tm, oldtm;	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(POOL_SIZE, POOL_SIZE);	log_init();	fsp_init();		buf_validate();	ut_a(fil_validate());		create_files();	create_db();	buf_validate();/*	test1(); *//*	buf_validate(); *//*	test2();	buf_validate();*/	init_space();	test5();	buf_validate();/*	test6(); */	buf_flush_batch(BUF_FLUSH_LIST, POOL_SIZE + 1);/*	buf_print(); */	buf_validate();	os_thread_sleep(1000000);	/*	buf_print(); */	buf_all_freed();		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 + -