~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to plugin/memcached_stats/stats_table.cc

  • Committer: Brian Aker
  • Date: 2010-12-18 18:24:57 UTC
  • mfrom: (1999.6.3 trunk)
  • Revision ID: brian@tangent.org-20101218182457-yi1wd0so2hml1k1w
Merge in Lee's copyright header fix

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
 
49
struct server_function_context
 
50
{
 
51
  StatsTableTool::Generator* generator; 
 
52
  server_function_context(StatsTableTool::Generator *generator_arg)
 
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, NULL)));
 
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=
 
156
    memcached_servers_parse(servers_string.c_str());
 
157
  if (tmp_serv == NULL)
 
158
  {
 
159
    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());
 
160
    return;
 
161
  }
 
162
 
 
163
  memcached_server_push(memc, tmp_serv);
 
164
  memcached_server_list_free(tmp_serv);
 
165
 
 
166
  number_of_hosts= memc->number_of_hosts;  
 
167
}
 
168
 
 
169
 
 
170
StatsTableTool::Generator::~Generator()
 
171
{
 
172
  if (memc != NULL)
 
173
  {
 
174
    memcached_free(memc);
 
175
  }
 
176
}
 
177
 
 
178
 
 
179
bool StatsTableTool::Generator::populate()
 
180
{
 
181
  if (host_number == number_of_hosts)
 
182
  {
 
183
    return false;
 
184
  }
 
185
 
 
186
  server_function_context context(this);
 
187
 
 
188
  memcached_server_function callbacks[1];
 
189
  callbacks[0]= server_function;
 
190
 
 
191
  unsigned int iferror; 
 
192
  iferror= (*callbacks[0])(memc, &memc->servers[host_number], (void *)&context); 
 
193
 
 
194
  if (iferror)
 
195
  {
 
196
    return false;
 
197
  }
 
198
 
 
199
  host_number++;
 
200
 
 
201
  return true;
 
202
}
 
203
 
 
204
} /* namespace drizzle_plugin */