30
30
#include "config.h"
31
#include "drizzled/session.h"
32
#include "drizzled/show.h"
34
32
#include "analysis_table.h"
35
33
#include "sysvar_holder.h"
35
#include "drizzled/error.h"
37
37
#include <libmemcached/memcached.h>
42
39
using namespace std;
43
40
using namespace drizzled;
45
int MemcachedAnalysisISMethods::fillTable(Session *,
47
plugin::InfoSchemaTable *schema_table)
49
const CHARSET_INFO * const scs= system_charset_info;
42
AnalysisTableTool::AnalysisTableTool() :
43
plugin::TableFunction("DATA_DICTIONARY", "MEMCACHED_ANALYSIS")
45
add_field("SERVERS_ANALYZED", plugin::TableFunction::NUMBER);
46
add_field("AVERAGE_ITEM_SIZE", plugin::TableFunction::NUMBER);
47
add_field("NODE_WITH_MOST_MEM_CONSUMPTION");
48
add_field("USED_BYTES", plugin::TableFunction::NUMBER);
49
add_field("NODE_WITH_LEAST_FREE_SPACE");
50
add_field("FREE_BYTES", plugin::TableFunction::NUMBER);
51
add_field("NODE_WITH_LONGEST_UPTIME");
52
add_field("LONGEST_UPTIME", plugin::TableFunction::NUMBER);
53
add_field("POOL_WIDE_HIT_RATIO", plugin::TableFunction::NUMBER);
56
AnalysisTableTool::Generator::Generator(Field **arg) :
57
plugin::TableFunction::Generator(arg)
62
bool AnalysisTableTool::Generator::populate()
50
70
SysvarHolder &sysvar_holder= SysvarHolder::singleton();
51
71
const string servers_string= sysvar_holder.getServersString();
73
if (servers_string.empty())
75
my_printf_error(ER_UNKNOWN_ERROR, _("No value in MEMCACHED_STATS_SERVERS variable."), MYF(0));
53
79
memcached_return rc;
54
80
memcached_st *serv= memcached_create(NULL);
55
81
memcached_server_st *tmp_serv=
64
90
if (server_count > 1)
66
92
memcached_analysis_st *report= memcached_analyze(serv, stats, &rc);
67
table->restoreRecordAsDefault();
69
table->setWriteSet(0);
70
table->setWriteSet(1);
71
table->setWriteSet(2);
72
table->setWriteSet(3);
73
table->setWriteSet(4);
74
table->setWriteSet(5);
75
table->setWriteSet(6);
76
table->setWriteSet(7);
77
table->setWriteSet(8);
79
table->field[0]->store(server_count);
80
table->field[1]->store(report->average_item_size);
82
table->field[2]->store(memcached_server_name(serv,
83
servers[report->most_consumed_server]),
86
table->field[3]->store(report->most_used_bytes);
87
table->field[4]->store(memcached_server_name(serv,
88
servers[report->least_free_server]),
91
table->field[5]->store(report->least_remaining_bytes);
92
table->field[6]->store(memcached_server_name(serv,
93
servers[report->oldest_server]),
96
table->field[7]->store(report->longest_uptime);
97
table->field[8]->store(report->pool_hit_ratio);
99
/* store the actual record now */
100
schema_table->addRow(table->record[0], table->s->reclength);
95
push(report->average_item_size);
96
push(memcached_server_name(serv, servers[report->most_consumed_server]));
97
push(report->most_used_bytes);
98
push(memcached_server_name(serv, servers[report->least_free_server]));
99
push(report->least_remaining_bytes);
100
push(memcached_server_name(serv, servers[report->oldest_server]));
101
push(report->longest_uptime);
102
push(static_cast<int64_t>(report->pool_hit_ratio));
104
106
memcached_stat_free(serv, stats);
105
107
memcached_free(serv);
109
bool createMemcachedAnalysisColumns(vector<const plugin::ColumnInfo *> &cols)
112
* Create each column for the memcached analysis table.
114
const plugin::ColumnInfo *num_analyzed= new(std::nothrow) plugin::ColumnInfo("SERVERS_ANALYZED",
116
DRIZZLE_TYPE_LONGLONG,
119
"Num of Servers Analyzed");
125
const plugin::ColumnInfo *avg_size= new(std::nothrow) plugin::ColumnInfo("AVERAGE_ITEM_SIZE",
127
DRIZZLE_TYPE_LONGLONG,
130
"Average Item Size");
136
const plugin::ColumnInfo *mem_node= new(std::nothrow) plugin::ColumnInfo("NODE_WITH_MOST_MEM_CONSUMPTION",
138
DRIZZLE_TYPE_VARCHAR,
141
"Node with Most Memory Consumption");
147
const plugin::ColumnInfo *used_bytes= new(std::nothrow) plugin::ColumnInfo("USED_BYTES",
149
DRIZZLE_TYPE_LONGLONG,
158
const plugin::ColumnInfo *free_node= new(std::nothrow) plugin::ColumnInfo("NODE_WITH_LEAST_FREE_SPACE",
160
DRIZZLE_TYPE_VARCHAR,
163
"Node with Least Free Space");
169
const plugin::ColumnInfo *free_bytes= new(std::nothrow) plugin::ColumnInfo("FREE_BYTES",
171
DRIZZLE_TYPE_LONGLONG,
180
const plugin::ColumnInfo *up_node= new(std::nothrow) plugin::ColumnInfo("NODE_WITH_LONGEST_UPTIME",
182
DRIZZLE_TYPE_VARCHAR,
185
"Node with Longest Uptime");
191
const plugin::ColumnInfo *uptime= new(std::nothrow) plugin::ColumnInfo("LONGEST_UPTIME",
193
DRIZZLE_TYPE_LONGLONG,
202
const plugin::ColumnInfo *hit_ratio= new(std::nothrow) plugin::ColumnInfo("POOL_WIDE_HIT_RATIO",
204
DRIZZLE_TYPE_LONGLONG,
207
"Pool-wide Hit Ratio");
214
cols.push_back(num_analyzed);
215
cols.push_back(avg_size);
216
cols.push_back(mem_node);
217
cols.push_back(used_bytes);
218
cols.push_back(free_node);
219
cols.push_back(free_bytes);
220
cols.push_back(up_node);
221
cols.push_back(uptime);
222
cols.push_back(hit_ratio);