162 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <my_config.h>
 | 
						|
#include <mysql.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <time.h>
 | 
						|
#include <sys/time.h>
 | 
						|
 | 
						|
int main(int argc, char** argv)
 | 
						|
{
 | 
						|
 | 
						|
	MYSQL* server;
 | 
						|
	char *host = NULL, *str_baseline = NULL,*str_test = NULL, *errmsg = NULL;
 | 
						|
	unsigned int port;
 | 
						|
	int rval, iterations,i;
 | 
						|
	clock_t begin,end;
 | 
						|
	size_t offset;
 | 
						|
	struct timeval real_begin,real_end,real_baseline,real_test;
 | 
						|
	time_t time;
 | 
						|
	double baseline, test, ratio, result;
 | 
						|
 | 
						|
	if(argc < 7){
 | 
						|
		fprintf(stderr,"Usage: %s <iterations> <baseline host> <baseline port> <test host> <test port> <max result ratio>\n",argv[0]);
 | 
						|
		fprintf(stderr,"The ratio is measured as:\ntest time / baseline time\n");
 | 
						|
		fprintf(stderr,"The test fails if this ratio is exceeded.\n");
 | 
						|
		return 1;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	;
 | 
						|
 | 
						|
	if((str_baseline = calloc(256,sizeof(char))) == NULL){
 | 
						|
		return 1;
 | 
						|
	}
 | 
						|
 | 
						|
	if((str_test = calloc(256,sizeof(char))) == NULL){
 | 
						|
		free(str_baseline);
 | 
						|
		return 1;
 | 
						|
	}
 | 
						|
 | 
						|
	iterations = atoi(argv[1]);
 | 
						|
	host = strdup(argv[2]);
 | 
						|
	port = atoi(argv[3]);
 | 
						|
	ratio = atof(argv[6]);
 | 
						|
	rval = 0;
 | 
						|
 | 
						|
	if(ratio <= 0.0){
 | 
						|
		return 1;
 | 
						|
	}
 | 
						|
	
 | 
						|
	/**Testing direct connection to master*/
 | 
						|
 | 
						|
	printf("Connecting to MySQL server through %s:%d.\n",host,port);
 | 
						|
	gettimeofday(&real_begin,NULL);
 | 
						|
	begin = clock();
 | 
						|
 | 
						|
	if((server = mysql_init(NULL)) == NULL){
 | 
						|
		return 1;
 | 
						|
	}
 | 
						|
 | 
						|
	if(mysql_real_connect(server,host,"maxuser","maxpwd",NULL,port,NULL,0) == NULL){
 | 
						|
		rval = 1;
 | 
						|
		printf( "Failed to connect to database: Error: %s\n",
 | 
						|
				mysql_error(server));
 | 
						|
		goto report;
 | 
						|
	}
 | 
						|
 | 
						|
	for(i = 0;i<iterations;i++)
 | 
						|
		{
 | 
						|
			if(mysql_change_user(server,"maxuser","maxpwd",NULL)){
 | 
						|
				rval = 1;
 | 
						|
				printf( "Failed to change user: Error: %s\n",
 | 
						|
						mysql_error(server));
 | 
						|
				goto report;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
	mysql_close(server);			
 | 
						|
 | 
						|
	end = clock();
 | 
						|
	gettimeofday(&real_end,NULL);
 | 
						|
	baseline = (double)(end - begin)/CLOCKS_PER_SEC;
 | 
						|
	timersub(&real_end,&real_begin,&real_baseline);
 | 
						|
 | 
						|
	free(host);
 | 
						|
	host = strdup(argv[4]);
 | 
						|
	port = atoi(argv[5]);
 | 
						|
 | 
						|
	/**Testing connection to master through MaxScale*/
 | 
						|
 | 
						|
	printf("Connecting to MySQL server through %s:%d.\n",host,port);
 | 
						|
	gettimeofday(&real_begin,NULL);
 | 
						|
	begin = clock();
 | 
						|
 | 
						|
	if((server = mysql_init(NULL)) == NULL){
 | 
						|
		return 1;
 | 
						|
	}
 | 
						|
 | 
						|
	if(mysql_real_connect(server,host,"maxuser","maxpwd",NULL,port,NULL,0) == NULL){
 | 
						|
		rval = 1;
 | 
						|
		printf("Failed to connect to database: Error: %s\n",
 | 
						|
				mysql_error(server));
 | 
						|
		goto report;
 | 
						|
	}
 | 
						|
 | 
						|
	for(i = 0;i<iterations;i++)
 | 
						|
		{
 | 
						|
			if(mysql_change_user(server,"maxuser","maxpwd",NULL)){
 | 
						|
				rval = 1;
 | 
						|
				printf("Failed to change user: Error: %s\n",
 | 
						|
						mysql_error(server));
 | 
						|
				goto report;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
	mysql_close(server);			
 | 
						|
 | 
						|
	end = clock();
 | 
						|
	gettimeofday(&real_end,NULL);
 | 
						|
 | 
						|
	test = (double)(end - begin)/CLOCKS_PER_SEC;
 | 
						|
	timersub(&real_end,&real_begin,&real_test);
 | 
						|
 | 
						|
	report:
 | 
						|
 | 
						|
	if(rval){	
 | 
						|
 | 
						|
		printf("\nTest failed: Errors during test run.\n");
 | 
						|
 | 
						|
	}else{
 | 
						|
	
 | 
						|
		struct tm *tm;
 | 
						|
		time = real_baseline.tv_sec;
 | 
						|
		tm = localtime(&time);
 | 
						|
		offset = strftime(str_baseline,256*sizeof(char),"%S",tm);
 | 
						|
		sprintf(str_baseline + offset,".%06d",(int)real_baseline.tv_usec);
 | 
						|
		time = real_test.tv_sec;
 | 
						|
		tm = localtime(&time);
 | 
						|
		offset = strftime(str_test,256*sizeof(char),"%S",tm);
 | 
						|
		sprintf(str_test + offset,".%06d",(int)real_test.tv_usec); 
 | 
						|
 | 
						|
		printf("\n\tCPU time in seconds\n\nDirect connection: %f\nThrough MaxScale: %f\n",baseline,test);
 | 
						|
		printf("\n\tReal time in seconds\n\nDirect connection: %s\nThrough MaxScale: %s\n",str_baseline,str_test);
 | 
						|
 | 
						|
		double base_res = real_baseline.tv_sec + (real_baseline.tv_usec / 1000000.0);
 | 
						|
		double test_res = real_test.tv_sec + (real_test.tv_usec / 1000000.0);
 | 
						|
		result = test_res/base_res;
 | 
						|
 | 
						|
		if(result  > ratio){
 | 
						|
			printf("\nTest failed: Time ratio was %f which exceeded the limit of %f.\n", result, ratio);
 | 
						|
			rval = 1;
 | 
						|
		}else{
 | 
						|
			printf("\nTest passed: Time ratio was %f.\n",result);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	free(str_baseline);
 | 
						|
	free(str_test);
 | 
						|
	free(host);
 | 
						|
	free(errmsg);
 | 
						|
	return rval;
 | 
						|
}
 |