Drizzled Public API Documentation

analysis_table.cc
00001 /* 
00002  * Copyright (C) 2009, Padraig O'Sullivan
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions are met:
00007  *
00008  *   * Redistributions of source code must retain the above copyright notice,
00009  *     this list of conditions and the following disclaimer.
00010  *   * Redistributions in binary form must reproduce the above copyright notice,
00011  *     this list of conditions and the following disclaimer in the documentation
00012  *     and/or other materials provided with the distribution.
00013  *   * Neither the name of Padraig O'Sullivan nor the names of its contributors
00014  *     may be used to endorse or promote products derived from this software
00015  *     without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00018  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
00021  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00022  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00023  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00024  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00025  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00026  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
00027  * THE POSSIBILITY OF SUCH DAMAGE.
00028  */
00029 
00030 #include <config.h>
00031 
00032 #include "analysis_table.h"
00033 #include "sysvar_holder.h"
00034 
00035 #include <drizzled/error.h>
00036 
00037 #include <libmemcached/memcached.h>
00038 #include <libmemcached/server.h>
00039 
00040 namespace drizzle_plugin
00041 {
00042 
00043 AnalysisTableTool::AnalysisTableTool() :
00044   plugin::TableFunction("DATA_DICTIONARY", "MEMCACHED_ANALYSIS")
00045 {
00046   add_field("SERVERS_ANALYZED", plugin::TableFunction::NUMBER);
00047   add_field("AVERAGE_ITEM_SIZE", plugin::TableFunction::NUMBER);
00048   add_field("NODE_WITH_MOST_MEM_CONSUMPTION");
00049   add_field("USED_BYTES", plugin::TableFunction::NUMBER);
00050   add_field("NODE_WITH_LEAST_FREE_SPACE");
00051   add_field("FREE_BYTES", plugin::TableFunction::NUMBER);
00052   add_field("NODE_WITH_LONGEST_UPTIME");
00053   add_field("LONGEST_UPTIME", plugin::TableFunction::NUMBER);
00054   add_field("POOL_WIDE_HIT_RATIO", plugin::TableFunction::NUMBER); 
00055 }
00056 
00057 AnalysisTableTool::Generator::Generator(Field **arg) :
00058   plugin::TableFunction::Generator(arg)
00059 {
00060   is_done= false;
00061 }
00062 
00063 bool AnalysisTableTool::Generator::populate()
00064 {
00065   if (is_done)
00066   {
00067     return false;
00068   }
00069   is_done= true;
00070 
00071   drizzled::sys_var *servers_var= drizzled::find_sys_var("memcached_stats_servers");
00072   assert(servers_var != NULL);
00073 
00074   const string servers_string(static_cast<char *>(servers_var.value_ptr(NULL, 0, NULL)));
00075 
00076   if (servers_string.empty()) 
00077   {       
00078     my_printf_error(ER_UNKNOWN_ERROR, _("No value in MEMCACHED_STATS_SERVERS variable."), MYF(0));
00079     return false;
00080   }    
00081 
00082   memcached_return rc;
00083   memcached_st *serv= memcached_create(NULL);
00084   memcached_server_st *tmp_serv=
00085     memcached_servers_parse(servers_string.c_str());
00086   memcached_server_push(serv, tmp_serv);
00087   memcached_server_list_free(tmp_serv);
00088   memcached_stat_st *stats= memcached_stat(serv, NULL, &rc);
00089   memcached_server_st *servers= memcached_server_list(serv);
00090 
00091   uint32_t server_count= memcached_server_count(serv);
00092 
00093   if (server_count > 1)
00094   {
00095     memcached_analysis_st *report= memcached_analyze(serv, stats, &rc);
00096 
00097     push(static_cast<uint64_t>(server_count));
00098     push(static_cast<uint64_t>(report->average_item_size));
00099     push(memcached_server_name(serv, servers[report->most_consumed_server]));
00100     push(report->most_used_bytes);
00101     push(memcached_server_name(serv, servers[report->least_free_server]));
00102     push(report->least_remaining_bytes);
00103     push(memcached_server_name(serv, servers[report->oldest_server]));
00104     push(static_cast<uint64_t>(report->longest_uptime));
00105     push(static_cast<int64_t>(report->pool_hit_ratio));
00106     free(report);
00107   } 
00108 
00109   memcached_stat_free(serv, stats);
00110   memcached_free(serv);
00111 
00112   return true;
00113 }
00114 
00115 } /* namespace drizzle_plugin */