Speed up on purge_query_digests_async()

Responsible for the various TRUNCATE commands on stats_mysql_query_digest(_reset)
pull/4096/head
René Cannaò 3 years ago
parent a1de300a8b
commit 4c3dab1496

@ -1049,51 +1049,46 @@ unsigned long long Query_Processor::purge_query_digests(bool async_purge, bool p
unsigned long long Query_Processor::purge_query_digests_async(char **msg) {
unsigned long long ret = 0;
pthread_rwlock_wrlock(&digest_rwlock);
umap_query_digest digest_umap_aux;
umap_query_digest_text digest_text_umap_aux;
pthread_rwlock_wrlock(&digest_rwlock);
digest_umap.swap(digest_umap_aux);
digest_text_umap.swap(digest_text_umap_aux);
pthread_rwlock_unlock(&digest_rwlock);
int num_rows = 0;
unsigned long long curtime1=monotonic_time();
size_t map1_size = digest_umap.size();
size_t map2_size = digest_text_umap.size();
size_t map1_size = digest_umap_aux.size();
size_t map2_size = digest_text_umap_aux.size();
ret = map1_size + map2_size;
unsigned long long i = 0;
QP_query_digest_stats **array1 = (QP_query_digest_stats **)malloc(sizeof(QP_query_digest_stats *)*map1_size);
char **array2 = (char **)malloc(sizeof(char *)*map2_size);
i=0;
for (std::unordered_map<uint64_t, void *>::iterator it=digest_umap.begin(); it!=digest_umap.end(); ++it) {
array1[i]=(QP_query_digest_stats *)it->second;
i++;
//delete qds;
for (
std::unordered_map<uint64_t, void *>::iterator it = digest_umap_aux.begin();
it != digest_umap_aux.end();
++it
) {
QP_query_digest_stats *qds = (QP_query_digest_stats *)it->second;
delete qds;
}
i=0;
for (std::unordered_map<uint64_t, char *>::iterator it=digest_text_umap.begin(); it!=digest_text_umap.end(); ++it) {
array2[i] = it->second;
//free(it->second);
i++;
digest_umap_aux.clear();
for (std::unordered_map<uint64_t, char *>::iterator it=digest_text_umap_aux.begin(); it!=digest_text_umap_aux.end(); ++it) {
free(it->second);
}
digest_umap.erase(digest_umap.begin(),digest_umap.end());
digest_text_umap.erase(digest_text_umap.begin(),digest_text_umap.end());
pthread_rwlock_unlock(&digest_rwlock);
unsigned long long curtime2=monotonic_time();
curtime1 = curtime1/1000;
curtime2 = curtime2/1000;
digest_text_umap_aux.clear();
if (map1_size >= DIGEST_STATS_FAST_MINSIZE) {
proxy_info("Purging stats_mysql_query_digest: locked for %llums to remove %lu entries\n", curtime2-curtime1, map1_size);
}
char buf[128];
sprintf(buf, "Query digest map locked for %llums", curtime2-curtime1);
*msg = strdup(buf);
for (i=0; i<map1_size; i++) {
QP_query_digest_stats *qds = array1[i];
delete qds;
}
for (i=0; i<map2_size; i++) {
char *p = array2[i];
free(p);
unsigned long long curtime2=monotonic_time();
curtime1 = curtime1/1000;
curtime2 = curtime2/1000;
proxy_info("TRUNCATE stats_mysql_query_digest: (not locked) %llums to remove %lu entries\n", curtime2-curtime1, map1_size);
}
free(array1);
free(array2);
return ret;
}
unsigned long long Query_Processor::purge_query_digests_sync(bool parallel) {
unsigned long long ret = 0;
pthread_rwlock_wrlock(&digest_rwlock);

Loading…
Cancel
Save