Moving query digest table to std::unordered_map

This is an attempt to track a possible memory leak or fragmentation
pull/480/head
René Cannaò 10 years ago
parent 89c7fad16e
commit a285b2ce94

@ -28,6 +28,7 @@
#include <type_traits>
#include <iosfwd>
#include <map>
#include <unordered_map>
#include <set>
#include <sstream>
#include <string>

@ -4,7 +4,8 @@
#include "cpp.h"
typedef btree::btree_map<uint64_t, void *> BtMap_query_digest;
//typedef btree::btree_map<uint64_t, void *> BtMap_query_digest;
typedef std::unordered_map<std::uint64_t, void *> umap_query_digest;
enum MYSQL_COM_QUERY_command {
MYSQL_COM_QUERY_ALTER_TABLE,
@ -188,7 +189,8 @@ class Query_Processor {
enum MYSQL_COM_QUERY_command __query_parser_command_type(void *args);
rwlock_t digest_rwlock;
BtMap_query_digest digest_bt_map;
//BtMap_query_digest digest_bt_map;
umap_query_digest digest_umap;
protected:
rwlock_t rwlock;

@ -581,7 +581,8 @@ SQLite3_result * Query_Processor::get_query_digests() {
result->add_column_definition(SQLITE_TEXT,"sum_time");
result->add_column_definition(SQLITE_TEXT,"min_time");
result->add_column_definition(SQLITE_TEXT,"max_time");
for (btree::btree_map<uint64_t, void *>::iterator it=digest_bt_map.begin(); it!=digest_bt_map.end(); ++it) {
//for (btree::btree_map<uint64_t, void *>::iterator it=digest_bt_map.begin(); it!=digest_bt_map.end(); ++it) {
for (std::unordered_map<uint64_t, void *>::iterator it=digest_umap.begin(); it!=digest_umap.end(); ++it) {
QP_query_digest_stats *qds=(QP_query_digest_stats *)it->second;
char **pta=qds->get_row();
result->add_row(pta);
@ -605,14 +606,16 @@ SQLite3_result * Query_Processor::get_query_digests_reset() {
result->add_column_definition(SQLITE_TEXT,"sum_time");
result->add_column_definition(SQLITE_TEXT,"min_time");
result->add_column_definition(SQLITE_TEXT,"max_time");
for (btree::btree_map<uint64_t, void *>::iterator it=digest_bt_map.begin(); it!=digest_bt_map.end(); ++it) {
//for (btree::btree_map<uint64_t, void *>::iterator it=digest_bt_map.begin(); it!=digest_bt_map.end(); ++it) {
for (std::unordered_map<uint64_t, void *>::iterator it=digest_umap.begin(); it!=digest_umap.end(); ++it) {
QP_query_digest_stats *qds=(QP_query_digest_stats *)it->second;
char **pta=qds->get_row();
result->add_row(pta);
qds->free_row(pta);
delete qds;
}
digest_bt_map.erase(digest_bt_map.begin(),digest_bt_map.end());
//digest_bt_map.erase(digest_bt_map.begin(),digest_bt_map.end());
digest_umap.erase(digest_umap.begin(),digest_umap.end());
spin_wrunlock(&digest_rwlock);
return result;
}
@ -897,16 +900,20 @@ void Query_Processor::update_query_digest(void *p, int hid, MySQL_Connection_use
QP_query_digest_stats *qds;
btree::btree_map<uint64_t, void *>::iterator it;
it=digest_bt_map.find(qp->digest_total);
if (it != digest_bt_map.end()) {
//btree::btree_map<uint64_t, void *>::iterator it;
//it=digest_bt_map.find(qp->digest_total);
//if (it != digest_bt_map.end()) {
std::unordered_map<uint64_t, void *>::iterator it;
it=digest_umap.find(qp->digest_total);
if (it != digest_umap.end()) {
// found
qds=(QP_query_digest_stats *)it->second;
qds->add_time(t,n);
} else {
qds=new QP_query_digest_stats(ui->username, ui->schemaname, qp->digest, qp->digest_text, hid);
qds->add_time(t,n);
digest_bt_map.insert(std::make_pair(qp->digest_total,(void *)qds));
//digest_bt_map.insert(std::make_pair(qp->digest_total,(void *)qds));
digest_umap.insert(std::make_pair(qp->digest_total,(void *)qds));
}
spin_wrunlock(&digest_rwlock);

Loading…
Cancel
Save