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

📄 tssrv.c

📁 Mysql for Windows最新源码
💻 C
字号:
/************************************************************************Test for the server(c) 1996-1997 Innobase OyCreated 2/16/1996 Heikki Tuuri*************************************************************************/#include "os0proc.h"#include "sync0sync.h"#include "ut0mem.h"#include "mem0mem.h"#include "mem0pool.h"#include "data0data.h"#include "data0type.h"#include "dict0dict.h"#include "buf0buf.h"#include "buf0flu.h"#include "os0file.h"#include "os0thread.h"#include "fil0fil.h"#include "fsp0fsp.h"#include "rem0rec.h"#include "rem0cmp.h"#include "mtr0mtr.h"#include "log0log.h"#include "log0recv.h"#include "page0page.h"#include "page0cur.h"#include "trx0trx.h"#include "dict0boot.h"#include "trx0sys.h"#include "dict0crea.h"#include "btr0btr.h"#include "btr0pcur.h"#include "btr0cur.h"#include "btr0sea.h"#include "rem0rec.h"#include "srv0srv.h"#include "que0que.h"#include "com0com.h"#include "usr0sess.h"#include "lock0lock.h"#include "trx0roll.h"#include "trx0purge.h"#include "row0ins.h"#include "row0sel.h"#include "row0upd.h"#include "row0row.h"#include "lock0lock.h"#include "ibuf0ibuf.h"#include "pars0pars.h"#include "btr0sea.h"bool	measure_cont	= FALSE;os_file_t	files[1000];mutex_t		ios_mutex;ulint		ios;ulint		n[10];mutex_t		incs_mutex;ulint		incs;byte		rnd_buf[67000];ulint		glob_var1	= 0;ulint		glob_var2	= 0;mutex_t		mutex2;mutex_t		test_mutex1;mutex_t		test_mutex2;mutex_t*	volatile mutexes;bool		always_false	= FALSE;ulint*		test_array;/************************************************************************Io-handler thread function. */ulinthandler_thread(/*===========*/	void*	arg){	ulint	segment;	ulint	i;		segment = *((ulint*)arg);	printf("Io handler thread %lu starts\n", segment);	for (i = 0;; i++) {		fil_aio_wait(segment);		mutex_enter(&ios_mutex);		ios++;		mutex_exit(&ios_mutex);	}	return(0);}/*************************************************************************Creates or opens the log files. */voidcreate_log_files(void)/*==================*/{	bool	ret;	ulint	i, k;	char	name[20];	printf("--------------------------------------------------------\n");	printf("Create or open log files\n");	strcpy(name, "logfile00");	for (k = 0; k < srv_n_log_groups; k++) {	    for (i = 0; i < srv_n_log_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_AIO,									&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_AIO, &ret);			ut_a(ret);		} else {			ut_a(os_file_set_size(files[i],						8192 * srv_log_file_size, 0));		}		ret = os_file_close(files[i]);		ut_a(ret);		if (i == 0) {			fil_space_create(name, k + 100, FIL_LOG);		}		ut_a(fil_validate());		fil_node_create(name, srv_log_file_size, k + 100);	    }	    	    fil_space_create(name, k + 200, FIL_LOG);	    	    	    log_group_init(k, srv_n_log_files,				srv_log_file_size * UNIV_PAGE_SIZE,							k + 100, k + 200);	}}/*************************************************************************Creates the files for the file system test and inserts them to the filesystem. */voidcreate_files(void)/*==============*/{	bool		ret;	ulint		i, k;	char		name[20];	os_thread_t	thr[10];	os_thread_id_t	id[10];	printf("--------------------------------------------------------\n");	printf("Create or open database files\n");		strcpy(name, "tsfile00");	for (k = 0; k < 2 * srv_n_spaces; k += 2) {	    for (i = 0; i < srv_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_NORMAL, &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_NORMAL, &ret);			ut_a(ret);		} else {			ut_a(os_file_set_size(files[i],					UNIV_PAGE_SIZE * srv_file_size, 0));			/* Initialize the file contents to a random value */			/*					for (j = 0; j < srv_file_size; j++) {				for (c = 0; c < UNIV_PAGE_SIZE; c++) {					rnd_buf[c] = 0xFF;				}				os_file_write(files[i], rnd_buf,						UNIV_PAGE_SIZE * j, 0,						UNIV_PAGE_SIZE);			}			*/		}		ret = os_file_close(files[i]);		ut_a(ret);		if (i == 0) {			fil_space_create(name, k, FIL_TABLESPACE);		}		ut_a(fil_validate());		fil_node_create(name, srv_file_size, k);	    }	}	ios = 0;	mutex_create(&ios_mutex);	mutex_set_level(&ios_mutex, SYNC_NO_ORDER_CHECK);	/* Create i/o-handler threads: */		for (i = 0; i < 9; i++) {		n[i] = i;		thr[i] = os_thread_create(handler_thread, n + i, id + i);	}}/************************************************************************Inits space header of space. */voidinit_spaces(void)/*=============*/{	mtr_t	mtr;	mtr_start(&mtr);	fsp_header_init(0, srv_file_size * srv_n_files, &mtr);			mtr_commit(&mtr);}/*********************************************************************This thread is used to measure contention of latches. */ulinttest_measure_cont(/*==============*/	void*	arg){	ulint	i, j;	ulint	pcount, kcount, s_scount, s_xcount, s_mcount, lcount;	ulint	t1count;	ulint	t2count;	UT_NOT_USED(arg);	printf("Starting contention measurement\n");		for (i = 0; i < 1000; i++) {		pcount = 0;		kcount = 0;		s_scount = 0;		s_xcount = 0;		s_mcount = 0;		lcount = 0;		t1count	= 0;		t2count	= 0;		for (j = 0; j < 100; j++) {		    if (srv_measure_by_spin) {		    	ut_delay(ut_rnd_interval(0, 20000));		    } else {		    	os_thread_sleep(20000);		    }		    if (kernel_mutex.lock_word) {			kcount++;		    }		    if (buf_pool->mutex.lock_word) {		    	pcount++;		    }		    if (log_sys->mutex.lock_word) {		    	lcount++;		    }		    if (btr_search_latch.reader_count) {		    	s_scount++;		    }		    if (btr_search_latch.writer != RW_LOCK_NOT_LOCKED) {		    	s_xcount++;		    }		    if (btr_search_latch.mutex.lock_word) {		    	s_mcount++;		    }		    if (test_mutex1.lock_word) {		    	t1count++;		    }		    		    if (test_mutex2.lock_word) {		    	t2count++;		    }		}		printf(	"Mutex res. l %lu, p %lu, k %lu s x %lu s s %lu s mut %lu of %lu\n",		lcount, pcount, kcount, s_xcount, s_scount, s_mcount, j);		sync_print_wait_info();		printf(    "log i/o %lu n non sea %lu n succ %lu n h fail %lu\n",			log_sys->n_log_ios, btr_cur_n_non_sea,			btr_search_n_succ, btr_search_n_hash_fail);	}	return(0);}/*********************************************************************This thread is used to test contention of latches. */ulinttest_sync(/*======*/	void*	arg){	ulint	tm, oldtm;	ulint	i, j;	ulint	sum;	ulint	rnd		= ut_rnd_gen_ulint();	ulint	mut_ind;	byte*	ptr;		UT_NOT_USED(arg);	printf("Starting mutex reservation test\n");	oldtm = ut_clock();				sum = 0;	rnd = 87354941;	for (i = 0; i < srv_test_n_loops; i++) {			for (j = 0; j < srv_test_n_free_rnds; j++) {			rnd += 423087123;			sum += test_array[rnd % (256 * srv_test_array_size)];		}		rnd += 43605677;		mut_ind = rnd % srv_test_n_mutexes;		mutex_enter(mutexes + mut_ind);				for (j = 0; j < srv_test_n_reserved_rnds; j++) {			rnd += 423087121;			sum += test_array[rnd % (256 * srv_test_array_size)];		}				mutex_exit(mutexes + mut_ind);		if (srv_test_cache_evict) {			ptr = (byte*)(mutexes + mut_ind);			for (j = 0; j < 4; j++) {				ptr += 256 * 1024;				sum += *((ulint*)ptr);			}		}	}		if (always_false) {		printf("%lu", sum);	}		tm = ut_clock();		printf("Wall time for res. test %lu milliseconds\n", tm - oldtm);		return(0);}/********************************************************************Main test function. */void main(void) /*======*/{	os_thread_id_t	thread_ids[1000];	ulint		tm, oldtm;	ulint		rnd;	ulint		i, sum;	byte*		ptr;/*	mutex_t		mutex; */		log_do_write = TRUE;/*	yydebug = TRUE; */	srv_boot("srv_init");	os_aio_init(576, 9, 100);	fil_init(25);	buf_pool_init(srv_pool_size, srv_pool_size);	fsp_init();	log_init();	lock_sys_create(srv_lock_table_size);	create_files();	create_log_files();		init_spaces();	sess_sys_init_at_db_start();		trx_sys_create();	dict_create();	log_make_checkpoint_at(ut_dulint_max);	printf("Hotspot semaphore addresses k %lx, p %lx, l %lx, s %lx\n",		&kernel_mutex, &(buf_pool->mutex),				&(log_sys->mutex), &btr_search_latch);		if (srv_measure_contention) {		os_thread_create(&test_measure_cont, NULL, thread_ids + 999);	}	if (!srv_log_archive_on) {		ut_a(DB_SUCCESS == log_archive_noarchivelog());	}/*	mutex_create(&mutex);	oldtm = ut_clock();	for (i = 0; i < 2000000; i++) {			mutex_enter(&mutex);		mutex_exit(&mutex);	}	tm = ut_clock();	printf("Wall clock time for %lu mutex enter %lu milliseconds\n",							i, tm - oldtm);*/	if (srv_test_sync) {		if (srv_test_nocache) {        		mutexes = os_mem_alloc_nocache(srv_test_n_mutexes        						* sizeof(mutex_t));		} else {        		mutexes = mem_alloc(srv_test_n_mutexes        						* sizeof(mutex_t));        	}        	sum = 0;		rnd = 492314896;		oldtm = ut_clock();		for (i = 0; i < 4000000; i++) {			rnd += 85967944;			ptr = ((byte*)(mutexes)) + (rnd % (srv_test_n_mutexes        					    	* sizeof(mutex_t)));			sum += *((ulint*)ptr);		}		tm = ut_clock();		printf(		"Wall clock time for %lu random access %lu milliseconds\n",							i, tm - oldtm);		if (always_false) {			printf("%lu", sum);		}			test_array = mem_alloc(4 * 256 * srv_test_array_size);		for (i = 0; i < srv_test_n_mutexes; i++) {			mutex_create(mutexes + i);		}			for (i = 0; i < srv_test_n_threads; i++) {			os_thread_create(&test_sync, NULL, thread_ids + i);		}	}	srv_master_thread(NULL);	printf("TESTS COMPLETED SUCCESSFULLY!\n");	os_process_exit(0);}

⌨️ 快捷键说明

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