Implementation of first set of self benchmark functions

pull/2182/head
René Cannaò 7 years ago
parent c3177788de
commit 5d9f13386c

@ -435,6 +435,74 @@ static ProxySQL_Admin *SPA=NULL;
static void * (*child_func[3]) (void *arg);
int ProxySQL_Test___GetDigestTable(bool reset) {
int r = 0;
if (!GloQPro) return 0;
SQLite3_result * resultset=NULL;
if (reset==true) {
resultset=GloQPro->get_query_digests_reset();
} else {
resultset=GloQPro->get_query_digests();
}
if (resultset==NULL) return 0;
r = resultset->rows_count;
delete resultset;
return r;
}
void ProxySQL_Test___GenerateRandomQueryInDigestTable(int n) {
//unsigned long long queries=n;
//queries *= 1000;
MySQL_Session *sess = new MySQL_Session();
sess->client_myds = new MySQL_Data_Stream();
sess->client_myds->fd=0;
sess->client_myds->init(MYDS_FRONTEND, sess, sess->client_myds->fd);
MySQL_Connection *myconn=new MySQL_Connection();
sess->client_myds->attach_connection(myconn);
myconn->set_is_client(); // this is used for prepared statements
unsigned long long cur = monotonic_time();
SQP_par_t qp;
qp.first_comment=NULL;
qp.query_prefix=NULL;
qp.digest_text = (char *)malloc(1024);
MySQL_Connection_userinfo ui;
char * username_buf = (char *)malloc(32);
char * schemaname_buf = (char *)malloc(32);
//ui.username = username_buf;
//ui.schemaname = schemaname_buf;
for (int i=0; i<n; i++) {
for (int j=0; j<10; j++) {
sprintf(qp.digest_text,"SELECT ? FROM table%d a JOIN table%d b WHERE a.id > ? AND a.c IN (?,?,?) ORDER BY k,l DESC LIMIT ?",i, j);
int digest_text_length = strlen(qp.digest_text);
qp.digest=SpookyHash::Hash64(qp.digest_text, digest_text_length, 0);
for (int k=0; k<10; k++) {
sprintf(username_buf,"user_%d",k%10);
for (int l=0; l<10; l++) {
sprintf(schemaname_buf,"shard_%d",l%10);
ui.set(username_buf, NULL, schemaname_buf, NULL);
int hg = 0;
uint64_t hash2;
SpookyHash myhash;
myhash.Init(19,3);
myhash.Update(ui.username,strlen(ui.username));
myhash.Update(&qp.digest,sizeof(qp.digest));
myhash.Update(ui.schemaname,strlen(ui.schemaname));
myhash.Update(&hg,sizeof(hg));
myhash.Final(&qp.digest_total,&hash2);
//update_query_digest(qp, sess->current_hostgroup, ui, t, sess->thread->curtime, NULL, sess);
GloQPro->update_query_digest(&qp,hg,&ui,fastrand(),0,NULL,sess);
}
}
}
}
delete sess;
}
typedef struct _main_args {
int nfds;
struct pollfd *fds;
@ -2550,6 +2618,44 @@ void admin_session_handler(MySQL_Session *sess, void *_pa, PtrSize_t *pkt) {
}
}
}
if (!strncasecmp("PROXYSQLTEST ", query_no_space, strlen("PROXYSQLTEST "))) {
if (sess->session_type == PROXYSQL_SESSION_ADMIN) { // no stats
int test_n = 0;
int test_arg1 = 0;
int test_arg2 = 0;
int r1 = 0;
sscanf(query_no_space+strlen("PROXYSQLTEST "),"%d %d %d", &test_n, &test_arg1, &test_arg2);
if (test_n) {
switch (test_n) {
case 1:
if (test_arg1==0) {
test_arg1=1;
}
ProxySQL_Test___GenerateRandomQueryInDigestTable(test_arg1);
SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL);
run_query=false;
break;
case 2:
r1 = ProxySQL_Test___GetDigestTable(false);
SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL, r1);
run_query=false;
break;
case 3:
r1 = ProxySQL_Test___GetDigestTable(true);
SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL, r1);
run_query=false;
break;
default:
SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"Invalid test");
run_query=false;
break;
}
} else {
SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"Invalid test");
}
goto __run_query;
}
}
{
ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa;
needs_vacuum = SPA->GenericRefreshStatistics(query_no_space,query_no_space_length, ( sess->session_type == PROXYSQL_SESSION_ADMIN ? true : false ) );

Loading…
Cancel
Save