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

📄 tsbuf.c

📁 Mysql for Windows最新源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		j = POOL_SIZE + 10 + rnd % 3000;				mtr_start(&mtr);		frame = buf_page_get(i, j, RW_S_LATCH, &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 random no read-ahead %lu milliseconds\n",		k, tm - oldtm);	buf_validate();	printf("Flush the pool of high-offset pages\n");	/* Flush the pool of high-offset pages */	for (i = 0; i < POOL_SIZE; i++) {		mtr_start(&mtr);			frame = buf_page_get(0, i, RW_S_LATCH, &mtr);		mtr_commit(&mtr);	}	buf_validate();	printf("--------------------------------------------------------\n");	printf("TEST 3 B. Read randomly database pages, random read-ahead\n");	oldtm = ut_clock();	rnd = 123;	for (k = 0; k < 400; k++) {		rnd += 23477;		i = 0;		j = POOL_SIZE + 10 + rnd % 400;		mtr_start(&mtr);				frame = buf_page_get(i, j, RW_S_LATCH, &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 random read-ahead %lu milliseconds\n",		k, tm - oldtm);}/************************************************************************Tests speed of CPU algorithms. */void test4(void)/*=======*/{	ulint			i, j;	ulint			tm, oldtm;	mtr_t			mtr;	buf_frame_t*		frame;		os_thread_sleep(2000000);	printf("--------------------------------------------------------\n");	printf("TEST 4. Speed of CPU algorithms\n");	oldtm = ut_clock();	for (j = 0; j < 1000; j++) {	    mtr_start(&mtr);	    for (i = 0; i < 20; i++) {		frame = buf_page_get(0, i, RW_S_LATCH, &mtr);	    }	    mtr_commit(&mtr);	}	tm = ut_clock();	printf("Wall clock time for %lu page get-release %lu milliseconds\n",			i * j, tm - oldtm);	buf_validate();	oldtm = ut_clock();	for (i = 0; i < 10000; i++) {		frame = buf_frame_alloc();		buf_frame_free(frame);	}	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);	buf_print();}/************************************************************************Tests various points of code. */void test5(void)/*=======*/{	buf_frame_t*		frame;	fil_addr_t		addr;	ulint			space;	mtr_t			mtr;		printf("--------------------------------------------------------\n");	printf("TEST 5. Various tests \n");	mtr_start(&mtr);		frame = buf_page_get(0, 313, RW_S_LATCH, &mtr);	ut_a(buf_frame_get_space_id(frame) == 0);	ut_a(buf_frame_get_page_no(frame) == 313);	ut_a(buf_frame_align(frame + UNIV_PAGE_SIZE - 1) == frame);	ut_a(buf_frame_align(frame) == frame);	ut_a(buf_block_align(frame + UNIV_PAGE_SIZE - 1) ==						buf_block_align(frame));	buf_ptr_get_fsp_addr(frame + UNIV_PAGE_SIZE - 1, &space, &addr);	ut_a(addr.page == 313)	ut_a(addr.boffset == UNIV_PAGE_SIZE - 1);	ut_a(space == 0);	mtr_commit(&mtr);}/************************************************************************Random test thread function. */ulintrandom_thread(/*===========*/	void*	arg){	ulint		n;	ulint		i, j, r, t, p, sp, count;	ulint		s;	buf_frame_t*	arr[POOL_SIZE / N_THREADS];	buf_frame_t*	frame;	mtr_t		mtr;	mtr_t		mtr2;		n = *((ulint*)arg);	printf("Random test thread %lu starts\n", os_thread_get_curr_id());	for (i = 0; i < 30; i++) {	   t = ut_rnd_gen_ulint() % 10;	   r = ut_rnd_gen_ulint() % 100;	   s = ut_rnd_gen_ulint() % (POOL_SIZE / N_THREADS);	   p = ut_rnd_gen_ulint();	   sp = ut_rnd_gen_ulint() % N_SPACES;	   if (i % 100 == 0) {	   	printf("Thr %lu tst %lu starts\n", os_thread_get_curr_id(), t);	   }	   ut_a(buf_validate());	   mtr_start(&mtr);	   if (t == 6) {	   	/* Allocate free blocks */	   	for (j = 0; j < s; j++) {	   		arr[j] = buf_frame_alloc();	   		ut_a(arr[j]);	   	}	   	for (j = 0; j < s; j++) {	   		buf_frame_free(arr[j]);	   	}	   } else if (t == 9) {/*	   	buf_flush_batch(BUF_FLUSH_LIST, 30); */	   		   } else if (t == 7) {	   	/* x-lock many blocks */	   	for (j = 0; j < s; j++) {	   		arr[j] = buf_page_get(sp, (p + j)	   					% (N_FILES * FILE_SIZE),	   					RW_X_LATCH,	   					&mtr);	   		ut_a(arr[j]);	   		if (j > 0) {	   			ut_a(arr[j] != arr[j - 1]);	   		}	   	}	   	ut_a(buf_validate());	   } else if (t == 8) {	   	/* s-lock many blocks */	   	for (j = 0; j < s; j++) {	   		arr[j] = buf_page_get(sp, (p + j)						% (N_FILES * FILE_SIZE),						RW_S_LATCH,							&mtr);	   		ut_a(arr[j]);	   		if (j > 0) {	   			ut_a(arr[j] != arr[j - 1]);	   		}	   	}	   } else if (t <= 2) {	   	for (j = 0; j < r; j++) {			/* Read pages */			mtr_start(&mtr2);			frame = buf_page_get(sp,					p % (N_FILES * FILE_SIZE),					RW_S_LATCH, &mtr2);			ut_a(mtr_read_ulint(frame + FIL_PAGE_OFFSET,						MLOG_4BYTES, &mtr2)					== p % (N_FILES * FILE_SIZE));			ut_a(mtr_read_ulint(frame + FIL_PAGE_SPACE,						MLOG_4BYTES, &mtr2)					== sp);			mtr_commit(&mtr2);			if (t == 0) {				p++;	/* upward */			} else if (t == 1) {				p--;	/* downward */			} else if (t == 2) {				p = ut_rnd_gen_ulint(); /* randomly */			}		}	   } else if (t <= 5) {	   	for (j = 0; j < r; j++) {			/* Write pages */			mtr_start(&mtr2);			frame = buf_page_get(sp, p % (N_FILES * FILE_SIZE),						RW_X_LATCH, &mtr2);			count = 1 + mtr_read_ulint(frame + COUNTER_OFFSET,						MLOG_4BYTES, &mtr2);			mutex_enter(&incs_mutex);			incs++;			mutex_exit(&incs_mutex);			mlog_write_ulint(frame + COUNTER_OFFSET, count,						MLOG_4BYTES, &mtr2);			mtr_commit(&mtr2);			if (t == 3) {				p++;	/* upward */			} else if (t == 4) {				p--;	/* downward */			} else if (t == 5) {				p = ut_rnd_gen_ulint(); /* randomly */			}		}	   } /* if t = */	   mtr_commit(&mtr);/*	   printf("Thr %lu tst %lu ends ", os_thread_get_curr_id(), t); */	   ut_a(buf_validate());	} /* for i */	printf("\nRandom test thread %lu exits\n", os_thread_get_curr_id());	return(0);}/************************************************************************Random test thread function which reports the rw-lock list. */ulintrw_list_thread(/*===========*/	void*	arg){	ulint		n;	ulint		i;		n = *((ulint*)arg);	printf("\nRw list test thread %lu starts\n", os_thread_get_curr_id());	for (i = 0; i < 10; i++) {		os_thread_sleep(3000000);		rw_lock_list_print_info();		buf_validate();	}	return(0);}/*************************************************************************Performs random operations on the buffer with several threads. */voidtest6(void)/*=======*/{	ulint		i, j;	os_thread_t	thr[N_THREADS + 1];	os_thread_id_t	id[N_THREADS + 1];	ulint		n[N_THREADS + 1];	ulint		count	= 0;	buf_frame_t*	frame;	mtr_t		mtr;		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);	}/*	n[N_THREADS] = N_THREADS;	thr[N_THREADS] = os_thread_create(rw_list_thread, n + N_THREADS,					id + N_THREADS);*/	for (i = 0; i < N_THREADS; i++) {		os_thread_wait(thr[i]);	}/*	os_thread_wait(thr[N_THREADS]); */	for (i = 0; i < N_SPACES; i++) {		for (j = 0; j < N_FILES * FILE_SIZE; j++) {			mtr_start(&mtr);					frame = buf_page_get(i, j, RW_S_LATCH, &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);			count += mtr_read_ulint(frame + COUNTER_OFFSET,						MLOG_4BYTES, &mtr);						mtr_commit(&mtr);		}	}	printf("Count %lu incs %lu\n", count, incs);	ut_a(count == incs);}/************************************************************************Frees the spaces in the file system. */voidfree_system(void)/*=============*/{	ulint	i;	for (i = 0; i < N_SPACES; i++) {		fil_space_free(i);	}}/************************************************************************Main test function. */void main(void) /*======*/{	ulint	tm, oldtm;/*	buf_debug_prints = TRUE; */		oldtm = ut_clock();		os_aio_init(160, 5);	sync_init();	mem_init(1500000);	fil_init(26);	/* Allow 25 open files at a time */	buf_pool_init(POOL_SIZE, POOL_SIZE);	log_init();		buf_validate();	ut_a(fil_validate());		create_files();	create_db();	buf_validate();	test1();	buf_validate();	test2();	buf_validate();	test3();	buf_validate();	test4();	test5();	buf_validate();	test6();	buf_validate();	buf_print();		buf_flush_batch(BUF_FLUSH_LIST, POOL_SIZE + 1);	buf_print();	buf_validate();	os_thread_sleep(1000000);		buf_print();	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 + -