~drizzle-trunk/drizzle/development

1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
1
/*
1144.5.4 by Padraig O'Sullivan
Updated the licence to be BSD since I don't see why this would need to be GPL.
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.
1144.5.7 by Padraig O'Sullivan
Updated the BSD header to actually have my name instead of capttofu's!
13
 *   * Neither the name of Padraig O'Sullivan nor the names of its contributors
1144.5.4 by Padraig O'Sullivan
Updated the licence to be BSD since I don't see why this would need to be GPL.
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.
1144.5.1 by Padraig O'Sullivan
Created plugin which simply adds I_S tables for querying memcached stats.
28
 */
29
1273.13.94 by Brian Aker
Lint fixes.
30
#include "config.h"
31
1144.5.1 by Padraig O'Sullivan
Created plugin which simply adds I_S tables for querying memcached stats.
32
#include "stats_table.h"
33
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
34
#include "drizzled/error.h"
1452.2.5 by Monty Taylor
Fixed the memcached_stats plugin to work with the latest libmemcached, now
35
#include <libmemcached/server.h>
1144.5.1 by Padraig O'Sullivan
Created plugin which simply adds I_S tables for querying memcached stats.
36
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
37
#if !defined(HAVE_MEMCACHED_SERVER_FN)
38
typedef memcached_server_function memcached_server_fn;
39
#endif
40
1964.2.8 by Monty Taylor
Updated memcached_stats plugin.
41
namespace drizzle_plugin
42
{
43
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
44
extern "C"
1273.13.57 by Brian Aker
Fix for recursive stat use.
45
memcached_return  server_function(const memcached_st *ptr,
1452.2.5 by Monty Taylor
Fixed the memcached_stats plugin to work with the latest libmemcached, now
46
                                  memcached_server_st *server,
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
47
                                  void *context);
48
49
struct server_function_context
50
{
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
51
  StatsTableTool::Generator* generator; 
52
  server_function_context(StatsTableTool::Generator *generator_arg)
53
    : generator(generator_arg)
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
54
  {}
55
};
56
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
57
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
58
extern "C"
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
59
memcached_return  server_function(const memcached_st *memc,
1452.2.5 by Monty Taylor
Fixed the memcached_stats plugin to work with the latest libmemcached, now
60
                                  memcached_server_st *server,
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
61
                                  void *context)
62
{
63
  server_function_context *ctx= static_cast<server_function_context *>(context);
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
64
1452.2.5 by Monty Taylor
Fixed the memcached_stats plugin to work with the latest libmemcached, now
65
  const char *server_name= memcached_server_name(*memc, *server);
66
  in_port_t server_port= memcached_server_port(*memc, *server);
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
67
68
  memcached_stat_st stats;
69
  memcached_return ret= memcached_stat_servername(&stats, NULL,
70
                                                  server_name, server_port);
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
71
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
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
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
78
  char **list= memcached_stat_get_keys((memcached_st *)memc, &stats, &ret);
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
79
  char **ptr= NULL;
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
80
 
81
  ctx->generator->push(server_name);
1368 by Brian Aker
Fix build issues, disabled tests (someone needs to go through them... who is
82
  ctx->generator->push(static_cast<uint64_t>(server_port));
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
83
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
84
  for (ptr= list; *ptr; ptr++)
85
  {
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
86
    char *value= memcached_stat_get_value((memcached_st *)memc, &stats, *ptr, &ret);
87
    ctx->generator->push(value);
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
88
    free(value);
89
  }
90
  free(list);
1273.13.57 by Brian Aker
Fix for recursive stat use.
91
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
92
  return MEMCACHED_SUCCESS;
93
}
94
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
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
1964.2.8 by Monty Taylor
Updated memcached_stats plugin.
126
StatsTableTool::Generator::Generator(drizzled::Field **arg) :
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
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
1964.2.8 by Monty Taylor
Updated memcached_stats plugin.
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)));
1144.5.1 by Padraig O'Sullivan
Created plugin which simply adds I_S tables for querying memcached stats.
141
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
142
  if (servers_string.empty())
143
  {
144
    my_printf_error(ER_UNKNOWN_ERROR, _("No value in MEMCACHED_STATS_SERVERS variable."), MYF(0));
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
145
    return; 
146
  }
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
147
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
148
  memc= memcached_create(NULL);
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
149
  if (memc == NULL)
150
  {
151
    my_printf_error(ER_UNKNOWN_ERROR, _("Unable to create memcached struct.  Got error from memcached_create()."), MYF(0));
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
152
    return;
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
153
  }
154
1144.5.1 by Padraig O'Sullivan
Created plugin which simply adds I_S tables for querying memcached stats.
155
  memcached_server_st *tmp_serv=
156
    memcached_servers_parse(servers_string.c_str());
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
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());
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
160
    return;
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
161
  }
162
163
  memcached_server_push(memc, tmp_serv);
1144.5.1 by Padraig O'Sullivan
Created plugin which simply adds I_S tables for querying memcached stats.
164
  memcached_server_list_free(tmp_serv);
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
165
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
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
1452.2.5 by Monty Taylor
Fixed the memcached_stats plugin to work with the latest libmemcached, now
188
  memcached_server_function callbacks[1];
1259.4.4 by Monty Taylor
Fixed the memcached stats test to launch a memcached, and also to deal with the
189
  callbacks[0]= server_function;
1300.2.2 by Joe Daly
port memcached stats plugin to use data_dictionary
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;
1144.5.1 by Padraig O'Sullivan
Created plugin which simply adds I_S tables for querying memcached stats.
202
}
1964.2.8 by Monty Taylor
Updated memcached_stats plugin.
203
204
} /* namespace drizzle_plugin */