From 5d9f13386ce7b8d7b8f3a8702b603f0f5fffa89c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 5 Aug 2019 00:35:04 +1000 Subject: [PATCH] Implementation of first set of self benchmark functions --- lib/ProxySQL_Admin.cpp | 106 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 5f8dc069d..915c826c1 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -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 ? 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 ) );