Drizzled Public API Documentation

stats_table.cc
1 /*
2  * Copyright (C) 2009, Padraig O'Sullivan
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * * Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation
12  * and/or other materials provided with the distribution.
13  * * Neither the name of Padraig O'Sullivan nor the names of its contributors
14  * may be used to endorse or promote products derived from this software
15  * without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27  * THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #include <config.h>
31 
32 #include "stats_table.h"
33 
34 #include <drizzled/error.h>
35 #include <libmemcached/server.h>
36 
37 #if !defined(HAVE_MEMCACHED_SERVER_FN)
38 typedef memcached_server_function memcached_server_fn;
39 #endif
40 
41 namespace drizzle_plugin
42 {
43 
44 extern "C"
45 memcached_return server_function(const memcached_st *ptr,
46  memcached_server_st *server,
47  void *context);
48 
50 {
51  StatsTableTool::Generator* generator;
53  : generator(generator_arg)
54  {}
55 };
56 
57 
58 extern "C"
59 memcached_return server_function(const memcached_st *memc,
60  memcached_server_st *server,
61  void *context)
62 {
63  server_function_context *ctx= static_cast<server_function_context *>(context);
64 
65  const char *server_name= memcached_server_name(*memc, *server);
66  in_port_t server_port= memcached_server_port(*memc, *server);
67 
68  memcached_stat_st stats;
69  memcached_return ret= memcached_stat_servername(&stats, NULL,
70  server_name, server_port);
71 
72  if (ret != MEMCACHED_SUCCESS)
73  {
74  my_printf_error(ER_UNKNOWN_ERROR, _("Unable get stats from memcached server %s. Got error from memcached_stat_servername()."), MYF(0), server_name);
75  return ret;
76  }
77 
78  char **list= memcached_stat_get_keys((memcached_st *)memc, &stats, &ret);
79  char **ptr= NULL;
80 
81  ctx->generator->push(server_name);
82  ctx->generator->push(static_cast<uint64_t>(server_port));
83 
84  for (ptr= list; *ptr; ptr++)
85  {
86  char *value= memcached_stat_get_value((memcached_st *)memc, &stats, *ptr, &ret);
87  ctx->generator->push(value);
88  free(value);
89  }
90  free(list);
91 
92  return MEMCACHED_SUCCESS;
93 }
94 
95 
96 StatsTableTool::StatsTableTool() :
97  plugin::TableFunction("DATA_DICTIONARY", "MEMCACHED_STATS")
98 {
99  add_field("NAME");
100  add_field("PORT_NUMBER", plugin::TableFunction::NUMBER);
101  add_field("PROCESS_ID", plugin::TableFunction::NUMBER);
102  add_field("UPTIME", plugin::TableFunction::NUMBER);
103  add_field("TIME", plugin::TableFunction::NUMBER);
104  add_field("VERSION");
105  add_field("POINTER_SIZE", plugin::TableFunction::NUMBER);
106  add_field("RUSAGE_USER", plugin::TableFunction::NUMBER);
107  add_field("RUSAGE_SYSTEM", plugin::TableFunction::NUMBER);
108  add_field("CURRENT_ITEMS", plugin::TableFunction::NUMBER);
109  add_field("TOTAL_ITEMS", plugin::TableFunction::NUMBER);
110  add_field("BYTES", plugin::TableFunction::NUMBER);
111  add_field("CURRENT_CONNECTIONS", plugin::TableFunction::NUMBER);
112  add_field("TOTAL_CONNECTIONS", plugin::TableFunction::NUMBER);
113  add_field("CONNECTION_STRUCTURES", plugin::TableFunction::NUMBER);
114  add_field("GETS", plugin::TableFunction::NUMBER);
115  add_field("SETS", plugin::TableFunction::NUMBER);
116  add_field("HITS", plugin::TableFunction::NUMBER);
117  add_field("MISSES", plugin::TableFunction::NUMBER);
118  add_field("EVICTIONS", plugin::TableFunction::NUMBER);
119  add_field("BYTES_READ", plugin::TableFunction::NUMBER);
120  add_field("BYTES_WRITTEN", plugin::TableFunction::NUMBER);
121  add_field("LIMIT_MAXBYTES", plugin::TableFunction::NUMBER);
122  add_field("THREADS", plugin::TableFunction::NUMBER);
123 }
124 
125 
126 StatsTableTool::Generator::Generator(drizzled::Field **arg) :
127  plugin::TableFunction::Generator(arg)
128 {
129  /* This will be set to the real number if we initialize properly below */
130  number_of_hosts= 0;
131 
132  host_number= 0;
133 
134  /* set to NULL if we are not able to init we dont want to call delete on this */
135  memc= NULL;
136 
137  drizzled::sys_var *servers_var= drizzled::find_sys_var("memcached_stats_servers");
138  assert(servers_var != NULL);
139 
140  const string servers_string(static_cast<char *>(servers_var.value_ptr(NULL, 0)));
141 
142  if (servers_string.empty())
143  {
144  my_printf_error(ER_UNKNOWN_ERROR, _("No value in MEMCACHED_STATS_SERVERS variable."), MYF(0));
145  return;
146  }
147 
148  memc= memcached_create(NULL);
149  if (memc == NULL)
150  {
151  my_printf_error(ER_UNKNOWN_ERROR, _("Unable to create memcached struct. Got error from memcached_create()."), MYF(0));
152  return;
153  }
154 
155  memcached_server_st *tmp_serv= memcached_servers_parse(servers_string.c_str());
156  if (tmp_serv == NULL)
157  {
158  my_printf_error(ER_UNKNOWN_ERROR, _("Unable to create memcached server list. Got error from memcached_servers_parse(%s)."), MYF(0), servers_string.c_str());
159  return;
160  }
161 
162  memcached_server_push(memc, tmp_serv);
163  memcached_server_list_free(tmp_serv);
164 
165  number_of_hosts= memc->number_of_hosts;
166 }
167 
168 
169 StatsTableTool::Generator::~Generator()
170 {
171  if (memc != NULL)
172  {
173  memcached_free(memc);
174  }
175 }
176 
177 
178 bool StatsTableTool::Generator::populate()
179 {
180  if (host_number == number_of_hosts)
181  {
182  return false;
183  }
184 
185  server_function_context context(this);
186 
187  memcached_server_function callbacks[1];
188  callbacks[0]= server_function;
189 
190  unsigned int iferror;
191  iferror= (*callbacks[0])(memc, &memc->servers[host_number], (void *)&context);
192 
193  if (iferror)
194  {
195  return false;
196  }
197 
198  host_number++;
199 
200  return true;
201 }
202 
203 } /* namespace drizzle_plugin */
sys_var * find_sys_var(const std::string &name)
Definition: sys_var.cc:1411