Skip to content
Browse files

*** empty log message ***

  • Loading branch information...
1 parent 8099eca commit 55e39e451663ad154cba21360a4f71a1831fefa6 massie committed Dec 15, 2004
View
14 monitor-core/gmond/conf.h
@@ -19,6 +19,9 @@ udp_recv_channel { \n\
port = 8649 \n\
bind = 239.2.11.71 \n\
} \n\
+tcp_accept_channel { \n\
+ port = 8666 \n\
+} \n\
collection_group { \n\
name = \"cpu_stat\" \n\
metric { \n\
@@ -51,11 +54,10 @@ static cfg_opt_t location_opts[] = {
CFG_END()
};
-static cfg_opt_t id_opts[] = {
- CFG_STR("cluster", NULL, CFGF_NONE ),
+static cfg_opt_t cluster_opts[] = {
+ CFG_STR("name", NULL, CFGF_NONE ),
CFG_STR("owner", NULL, CFGF_NONE ),
- CFG_STR("latitude", NULL, CFGF_NONE ),
- CFG_STR("longitude", NULL, CFGF_NONE ),
+ CFG_STR("latlong", NULL, CFGF_NONE ),
CFG_STR("url", NULL, CFGF_NONE ),
CFG_END()
};
@@ -97,6 +99,8 @@ static cfg_opt_t tcp_accept_channel_opts[] = {
CFG_INT("port", -1, CFGF_NONE ),
CFG_STR("interface", NULL, CFGF_NONE),
CFG_STR("protocol", "xml", CFGF_NONE),
+ CFG_STR("allow_ip", NULL, CFGF_NONE),
+ CFG_STR("allow_mask", NULL, CFGF_NONE),
CFG_END()
};
@@ -148,7 +152,7 @@ static cfg_opt_t collection_group_opts[] = {
static cfg_opt_t gmond_opts[] = {
CFG_SEC("location", location_opts, CFGF_NONE),
- CFG_SEC("identification", id_opts, CFGF_NONE),
+ CFG_SEC("cluster", cluster_opts, CFGF_NONE),
CFG_SEC("behavior", behavior_opts, CFGF_NONE),
CFG_SEC("udp_send_channel", udp_send_channel_opts, CFGF_MULTI),
CFG_SEC("udp_recv_channel", udp_recv_channel_opts, CFGF_MULTI),
View
410 monitor-core/gmond/gmond.c
@@ -10,7 +10,7 @@
#include <apr_poll.h>
#include <apr_network_io.h>
#include <apr_signal.h>
-#include <apr_thread_proc.h> /* for apr_proc_detach(). no threads. */
+#include <apr_thread_proc.h> /* for apr_proc_detach(). no threads used. */
#include <apr_tables.h>
#include "cmdline.h" /* generated by cmdline.sh which runs gengetopt */
@@ -21,6 +21,7 @@
#include "apr_net.h" /* our private network functions based on apr */
#include "debug_msg.h"
#include "protocol.h" /* generated header from ./lib/protocol.x xdr definition file */
+#include "dtd.h" /* the DTD definition for our XML */
/* When this gmond was started */
apr_time_t started;
@@ -48,12 +49,20 @@ apr_array_header_t *udp_recv_acl_array = NULL;
/* The array for outgoing UDP message channels */
apr_array_header_t *udp_send_array = NULL;
+/* The pollset for incoming TCP requests */
+apr_pollset_t *tcp_accept_pollset = NULL;
+/* The access control list for each of the TCP accept channels */
+apr_array_header_t *tcp_accept_acl_array = NULL;
+
/* The hash to hold the hosts (key = host IP) */
apr_hash_t *hosts;
+
/* The "hosts" hash contains values of type "hostdata" */
struct Ganglia_host_data {
/* Name of the host */
char *hostname;
+ /* The IP of this host */
+ char *ip;
/* Timestamp of when the remote host gmond started */
unsigned int gmond_started;
/* The pool used to malloc memory for this host */
@@ -294,22 +303,45 @@ setup_udp_recv_pollset( void )
/* TODO: This function needs to be updated later to handle proxy information */
static Ganglia_host_data *
-find_host_data( char *remoteip, apr_sockaddr_t *sa)
+Ganglia_host_data_get( char *remoteip, apr_sockaddr_t *sa, Ganglia_message *fullmsg)
{
apr_status_t status;
apr_pool_t *pool;
Ganglia_host_data *hostdata;
char *hostname = NULL;
- char *remoteipdup = NULL;
+ char *ip = remoteip;
+ Ganglia_format_26 *msg = NULL;
+
+ if(fullmsg && fullmsg->format == GANGLIA_FORMAT_26 && fullmsg->Ganglia_message_u.format_26)
+ {
+ /* This message is in ganglia (2.6.x) format */
+ msg = fullmsg->Ganglia_message_u.format_26;
+ if(msg->hdr && msg->hdr->host)
+ {
+ if(msg->hdr->host->hostname)
+ {
+ hostname = msg->hdr->host->hostname;
+ }
+ if(msg->hdr->host->ip)
+ {
+ ip = msg->hdr->host->ip;
+ }
+ }
+ }
- hostdata = (Ganglia_host_data *)apr_hash_get( hosts, remoteip, APR_HASH_KEY_STRING );
+ hostdata = (Ganglia_host_data *)apr_hash_get( hosts, ip, APR_HASH_KEY_STRING );
if(!hostdata)
{
- /* Lookup the hostname (TODO: check for proxy info) */
- status = apr_getnameinfo(&hostname, sa, 0);
- if(status != APR_SUCCESS)
+ /* Lookup the hostname or use the proxy information if available */
+ if( !hostname )
{
- hostname = remoteip;
+ /* We'll use the resolver to find the hostname */
+ status = apr_getnameinfo(&hostname, sa, 0);
+ if(status != APR_SUCCESS)
+ {
+ /* If hostname lookup fails.. set it to the ip */
+ hostname = ip;
+ }
}
/* This is the first time we've heard from this host.. create a new pool */
@@ -334,7 +366,7 @@ find_host_data( char *remoteip, apr_sockaddr_t *sa)
hostdata->hostname = apr_pstrdup( pool, hostname );
/* Dup the remoteip (it will be freed later) */
- remoteipdup = apr_pstrdup( pool, remoteip);
+ hostdata->ip = apr_pstrdup( pool, ip);
/* Set the timestamps */
hostdata->first_heard_from = hostdata->last_heard_from = apr_time_now();
@@ -348,17 +380,44 @@ find_host_data( char *remoteip, apr_sockaddr_t *sa)
}
/* Save this host data to the "hosts" hash */
- apr_hash_set( hosts, remoteipdup, APR_HASH_KEY_STRING, hostdata);
+ apr_hash_set( hosts, hostdata->ip, APR_HASH_KEY_STRING, hostdata);
}
else
{
- /* We already have this host in our "hosts" hash undate timestamp */
+ /* We already have this host in our "hosts" hash update timestamp */
hostdata->last_heard_from = apr_time_now();
}
return hostdata;
}
+/* This function takes an old 2.5.x message and converts it to
+ * a 2.6.0 format.
+ */
+static Ganglia_format_26 *
+convert_old_metric_to_format_26( Ganglia_old_metric *old_metric )
+{
+ Ganglia_format_26 *format_26 = NULL;
+ Ganglia_message_body_26 *bdy = NULL;
+
+ if(!old_metric)
+ return NULL;
+
+ format_26 = malloc( sizeof(Ganglia_format_26));
+ if(!format_26)
+ return NULL;
+
+ format_26->hdr = NULL; /* no proxy etc info */
+ format_26->bdy = bdy = malloc(sizeof(Ganglia_message_body_26));
+ if(!bdy)
+ {
+ free(format_26);
+ return NULL;
+ }
+
+ return format_26;
+}
+
static void
poll_udp_recv_channels(apr_interval_time_t timeout)
{
@@ -421,11 +480,12 @@ poll_udp_recv_channels(apr_interval_time_t timeout)
Ganglia_message msg;
Ganglia_host_data *hostdata = NULL;
Ganglia_old_metric *old_metric;
+ Ganglia_format_26 *format_26 = NULL;
/* Create the XDR receive stream */
xdrmem_create(&x, buf, max_udp_message_len, XDR_DECODE);
- /* Flush the data */
+ /* Flush the data... */
memset( &msg, 0, sizeof(Ganglia_message));
/* Read the gangliaMessage from the stream */
@@ -434,13 +494,53 @@ poll_udp_recv_channels(apr_interval_time_t timeout)
continue;
}
+ /* Process the host information and get the Ganglia_host_data.
+ * We call this _after_ we process the content of the message
+ * because the newer message format allows for proxy information
+ * to be sent. NOTE: The ACL test above looks at the IP header
+ * and not the proxy information provided. */
+ hostdata = Ganglia_host_data_get( remoteip, remotesa, &msg);
+ if(!hostdata)
+ {
+ /* Most likely a memory error. Free the memory for this
+ * message and move along... */
+ xdr_free((xdrproc_t)xdr_Ganglia_message, (char *)&msg);
+ continue;
+ }
+
/* Check if this is an old metric format */
old_metric = Ganglia_old_metric_get( msg.format );
if(old_metric)
{
/* Move this data into a newer format (later) */
- fprintf(stderr,"%s\t=>\t%s\n", remoteip, old_metric->name);
+ debug_msg("%s\t=>\t%s", remoteip, old_metric->name);
+ format_26 = convert_old_metric_to_format_26( old_metric );
+ if(!format_26)
+ {
+ continue;
+ }
+ }
+ else if( msg.format == GANGLIA_FORMAT_26 )
+ {
+ /* This data is in 2.6.x format */
+ format_26 = msg.Ganglia_message_u.format_26;
+ if(!format_26)
+ {
+ continue;
+ }
+ }
+ else
+ {
+ /* This data isn't in a format that I understand.
+ * Free the message and move on... */
+ xdr_free((xdrproc_t)xdr_Ganglia_message, (char *)&msg);
+ continue;
}
+
+ /* At this point we are ready to save format_26 data to
+ * the host's metric hash */
+
+
/* If I want to find out how much data I decoded
decoded = xdr_getpos(&x); */
@@ -515,6 +615,277 @@ setup_udp_send_array( void )
}
}
+static void
+setup_tcp_accept_pollset( void )
+{
+ apr_status_t status;
+ int i, num_tcp_accept_channels = cfg_size( config_file, "tcp_accept_channel");
+
+ /* Create my TCP accept pollset */
+ apr_pollset_create(&tcp_accept_pollset, num_tcp_accept_channels, global_context, 0);
+
+ /* Create my TCP accept ACL array */
+ tcp_accept_acl_array = apr_array_make( global_context, num_tcp_accept_channels,
+ sizeof(apr_ipsubnet_t *));
+
+ for(i=0; i< num_tcp_accept_channels; i++)
+ {
+ cfg_t *tcp_accept_channel = cfg_getnsec( config_file, "tcp_accept_channel", i);
+ char *bindaddr, *protocol, *allow_ip, *allow_mask, *interface;
+ int port;
+ apr_socket_t *socket = NULL;
+ apr_ipsubnet_t *ipsub = NULL;
+ apr_pollfd_t socket_pollfd;
+ apr_pool_t *pool = NULL;
+
+ port = cfg_getint( tcp_accept_channel, "port");
+ bindaddr = cfg_getstr( tcp_accept_channel, "bind");
+ protocol = cfg_getstr( tcp_accept_channel, "protocol");
+ allow_ip = cfg_getstr( tcp_accept_channel, "allow_ip");
+ allow_mask = cfg_getstr( tcp_accept_channel, "allow_mask");
+ interface = cfg_getstr( tcp_accept_channel, "interface");
+
+ debug_msg("tcp_accept_channel bind=%s port=%d protocol=%s\n",
+ bindaddr? bindaddr: "NULL", port,
+ protocol? protocol:"NULL");
+
+ /* Create a subpool context */
+ apr_pool_create(&pool, global_context);
+
+ /* Create the socket for the channel */
+ socket = create_tcp_server(pool, port, bindaddr, interface);
+ if(!socket)
+ {
+ fprintf(stderr,"Unable to create tcp_accept_channel. Exiting.\n");
+ exit(1);
+ }
+
+ /* Build the socket poll file descriptor structure */
+ socket_pollfd.desc_type = APR_POLL_SOCKET;
+ socket_pollfd.reqevents = APR_POLLIN;
+ socket_pollfd.desc.s = socket;
+ socket_pollfd.client_data = protocol;
+
+ /* Add the socket to the pollset */
+ status = apr_pollset_add(tcp_accept_pollset, &socket_pollfd);
+ if(status != APR_SUCCESS)
+ {
+ fprintf(stderr,"Failed to add socket to pollset. Exiting.\n");
+ exit(1);
+ }
+
+ /* Save the ACL information */
+ if(allow_ip)
+ {
+ status = apr_ipsubnet_create(&ipsub, allow_ip, allow_mask, pool);
+ if(status != APR_SUCCESS)
+ {
+ fprintf(stderr,"Unable to build ACL for ip=%s mask=%s. Exiting.\n",
+ allow_ip, allow_mask);
+ exit(1);
+ }
+ }
+
+ /* ipsub of NULL means no acl in effect */
+ *(apr_ipsubnet_t **)apr_array_push(tcp_accept_acl_array) = ipsub;
+ }
+}
+
+static apr_status_t
+print_xml_header( apr_socket_t *client )
+{
+ apr_status_t status;
+ apr_size_t len = strlen(DTD);
+ char gangliaxml[128];
+ char clusterxml[1024];
+ static int clusterinit = 0;
+ static char *name = NULL;
+ static char *owner = NULL;
+ static char *latlong = NULL;
+ static char *url = NULL;
+ apr_time_t now = apr_time_now();
+
+ status = apr_send( client, DTD, &len );
+ if(status != APR_SUCCESS)
+ return status;
+
+ len = apr_snprintf( gangliaxml, 128, "<GANGLIA_XML VERSION=\"%s\" SOURCE=\"gmond\">\n",
+ VERSION);
+ status = apr_send( client, gangliaxml, &len);
+ if(status != APR_SUCCESS)
+ return status;
+
+ if(!clusterinit)
+ {
+ cfg_t *cluster = cfg_getsec(config_file, "cluster");
+ name = cfg_getstr( cluster, "name" );
+ owner = cfg_getstr( cluster, "owner" );
+ latlong = cfg_getstr( cluster, "latlong" );
+ url = cfg_getstr( cluster, "url" );
+ clusterinit = 1;
+ }
+
+ len = apr_snprintf( clusterxml, 1024,
+ "<CLUSTER NAME=\"%s\" LOCALTIME=\"%d\" OWNER=\"%s\" LATLONG=\"%s\" URL=\"%s\">\n",
+ name?name:"unspecified",
+ (int)(now / APR_USEC_PER_SEC),
+ owner?owner:"unspecified",
+ latlong?latlong:"unspecified",
+ url?url:"unspecified");
+
+ return apr_send( client, clusterxml, &len);
+}
+
+static apr_status_t
+print_xml_footer( apr_socket_t *client )
+{
+ apr_size_t len = 26;
+ return apr_send( client, "</CLUSTER>\n</GANGLIA_XML>\n", &len);
+}
+
+static apr_status_t
+print_host_start( apr_socket_t *client, Ganglia_host_data *hostinfo)
+{
+ apr_size_t len;
+ char hostxml[1024]; /* for <HOST></HOST> */
+ apr_time_t now = apr_time_now();
+ int tn = (now - hostinfo->last_heard_from) / APR_USEC_PER_SEC;
+
+ len = apr_snprintf(hostxml, 1024,
+ "<HOST NAME=\"%s\" IP=\"%s\" TN=\"%d\" TMAX=\"%d\" DMAX=\"%d\" LOCATION=\"%s\" GMOND_STARTED=\"%d\">\n",
+ hostinfo->hostname,
+ hostinfo->ip,
+ tn,
+ 0 /*tmax*/,
+ 0 /*dmax*/,
+ "unspecified", /*location*/
+ 0 /*gmond_started*/);
+
+ return apr_send(client, hostxml, &len);
+}
+
+static apr_status_t
+print_host_end( apr_socket_t *client)
+{
+ apr_size_t len = 8;
+ return apr_send(client, "</HOST>\n", &len);
+}
+
+static void
+poll_tcp_accept_channels(apr_interval_time_t timeout)
+{
+ apr_status_t status;
+ const apr_pollfd_t *descs = NULL;
+ apr_int32_t num = 0;
+
+ /* Poll for data with given timeout */
+ status = apr_pollset_poll(tcp_accept_pollset, timeout, &num, &descs);
+ if(status != APR_SUCCESS)
+ return;
+
+ if(num>0)
+ {
+ int i;
+
+ /* We have data to read */
+ for(i=0; i< num; i++)
+ {
+ apr_socket_t *client, *server;
+ apr_sockaddr_t *remotesa = NULL;
+ char *protocol, remoteip[256];
+ apr_ipsubnet_t *ipsub;
+ char buf[max_udp_message_len];
+ apr_size_t len = max_udp_message_len;
+ apr_pool_t *client_context = NULL;
+
+ server = descs[i].desc.s;
+ /* We could also use the apr_socket_data_get/set() functions
+ * to have per socket user data .. see APR docs */
+ protocol = descs[i].client_data;
+
+ /* Create a context for the client connection */
+ apr_pool_create(&client_context, global_context);
+
+ /* Accept the connection */
+ status = apr_accept(&client, server, client_context);
+ if(status != APR_SUCCESS)
+ {
+ goto close_accept_socket;
+ }
+
+ apr_socket_addr_get(&remotesa, APR_REMOTE, client);
+ /* This function is in ./lib/apr_net.c and not APR. The
+ * APR counterpart is apr_sockaddr_ip_get() but we don't
+ * want to malloc memory evertime we call this */
+ apr_sockaddr_ip_buffer_get(remoteip, 256, remotesa);
+
+ /* Check the ACL (we can make this better later) */
+ ipsub = ((apr_ipsubnet_t **)(tcp_accept_acl_array->elts))[i];
+ if(ipsub)
+ {
+ if(!apr_ipsubnet_test( ipsub, remotesa))
+ {
+ debug_msg("Ignoring connection from %s\n", remoteip);
+ goto close_accept_socket;
+ }
+ }
+
+ /* At this point send data over the socket */
+ if(!strcasecmp(protocol, "xml"))
+ {
+ apr_status_t status;
+ apr_hash_index_t *hi, *metric_hi;
+ void *val;
+
+ /* Print the DTD, GANGLIA_XML and CLUSTER tags */
+ status = print_xml_header(client);
+ if(status != APR_SUCCESS)
+ goto close_accept_socket;
+
+ /* Walk the host hash */
+ for(hi = apr_hash_first(client_context, hosts);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ apr_hash_this(hi, NULL, NULL, &val);
+ status = print_host_start(client, (Ganglia_host_data *)val);
+ if(status != APR_SUCCESS)
+ {
+ goto close_accept_socket;
+ }
+
+ /* Send the metric info for this particular host */
+ for(metric_hi = apr_hash_first(client_context, ((Ganglia_host_data *)val)->metrics);
+ metric_hi;
+ metric_hi = apr_hash_next(metric_hi))
+ {
+ void *metric;
+ apr_hash_this(metric_hi, NULL, NULL, &metric);
+
+
+ }
+
+ /* Close the host tag */
+ status = print_host_end(client);
+ if(status != APR_SUCCESS)
+ {
+ goto close_accept_socket;
+ }
+ }
+
+ /* Close the CLUSTER and GANGLIA_XML tags */
+ print_xml_footer(client);
+ }
+
+ /* Close down the accepted socket */
+ close_accept_socket:
+ apr_shutdown(client, APR_SHUTDOWN_READ);
+ apr_socket_close(client);
+ apr_pool_destroy(client_context);
+ }
+ }
+}
+
/* This function will send a datagram to every udp_send_channel specified */
static int
udp_send_message( char *buf, int len )
@@ -540,6 +911,12 @@ udp_send_message( char *buf, int len )
}
return num_errors;
}
+
+static int
+tcp_send_message( char *buf, int len )
+{
+ return 0;
+}
int
process_collection_groups( void )
@@ -608,6 +985,7 @@ main ( int argc, char *argv[] )
if(!deaf)
{
setup_udp_recv_pollset();
+ setup_tcp_accept_pollset();
}
if(!mute)
@@ -618,20 +996,18 @@ main ( int argc, char *argv[] )
/* Create the host hash table */
hosts = apr_hash_make( global_context );
- udp_send_message("This is a test remove me later", 15);
-
next_collection = 0;
for(;;)
{
now = apr_time_now();
stop = now + (next_collection* APR_USEC_PER_SEC);
/* Read data until we need to collect/write data */
- for(; now < stop ; )
+ for(; now < stop ;)
{
if(!deaf)
{
+ poll_tcp_accept_channels(0);
poll_udp_recv_channels(stop - now);
- /* accept_tcp_connections... */
}
now = apr_time_now();
}
View
1 monitor-core/gmond/gmond.conf
@@ -3,6 +3,7 @@ behavior {
user = nobody
}
udp_send_channel {
+ ip = 239.2.11.71
port = 8649
}
udp_recv_channel {
View
2 monitor-core/lib/apr_net.c
@@ -151,7 +151,7 @@ create_udp_server(apr_pool_t *context, apr_port_t port, char *bind)
}
apr_socket_t *
-create_tcp_server(apr_pool_t *context, apr_port_t port, char *bind)
+create_tcp_server(apr_pool_t *context, apr_port_t port, char *bind, char *interface)
{
apr_socket_t *sock = create_net_server(context, SOCK_STREAM, port, bind);
if(!sock)
View
3 monitor-core/lib/apr_net.h
@@ -16,5 +16,8 @@ apr_sockaddr_ip_buffer_get(char *addr, int len, apr_sockaddr_t *sockaddr);
apr_socket_t *
create_mcast_server(apr_pool_t *context, char *mcast_ip, apr_port_t port, char *bind, char *interface);
+apr_socket_t *
+create_tcp_server(apr_pool_t *context, apr_port_t port, char *bind, char *interface);
+
#endif
View
28 monitor-core/lib/protocol.x
@@ -2,7 +2,7 @@ enum Ganglia_value_types {
GANGLIA_VALUE_UNKNOWN,
GANGLIA_VALUE_STRING,
GANGLIA_VALUE_UNSIGNED_SHORT,
- GANGLIA_VALUE_SIGNED_SHORT,
+ GANGLIA_VALUE_SHORT,
GANGLIA_VALUE_UNSIGNED_INT,
GANGLIA_VALUE_INT,
GANGLIA_VALUE_FLOAT,
@@ -12,10 +12,18 @@ enum Ganglia_value_types {
typedef string varstring<>;
union Ganglia_value switch(Ganglia_value_types type) {
+ case GANGLIA_VALUE_UNKNOWN:
+ void;
case GANGLIA_VALUE_STRING:
string str<>;
+ case GANGLIA_VALUE_UNSIGNED_SHORT:
+ unsigned short u_short;
+ case GANGLIA_VALUE_SHORT:
+ short s_short;
+ case GANGLIA_VALUE_UNSIGNED_INT:
+ unsigned int u_int;
case GANGLIA_VALUE_INT:
- int i;
+ int s_int;
case GANGLIA_VALUE_FLOAT:
float f;
case GANGLIA_VALUE_DOUBLE:
@@ -50,12 +58,12 @@ enum Ganglia_data_state {
GANGLIA_METRIC_UNKNOWN_OLD_FORMAT
};
-struct Ganglia_message_header {
+struct Ganglia_message_header_26 {
Ganglia_hostinfo *host;
Ganglia_msginfo *msg;
};
-struct Ganglia_message_body {
+struct Ganglia_message_body_26 {
unsigned int source_instance;
Ganglia_data_state state;
unsigned int age;
@@ -64,9 +72,9 @@ struct Ganglia_message_body {
Ganglia_metric metrics<>;
};
-struct Ganglia_format_1 {
- Ganglia_message_header *hdr;
- Ganglia_message_body *bdy;
+struct Ganglia_format_26 {
+ Ganglia_message_header_26 *hdr;
+ Ganglia_message_body_26 *bdy;
};
/* 2.5.x compatibility..... */
@@ -119,16 +127,16 @@ enum Ganglia_message_formats {
metric_part_max_used,
GANGLIA_NUM_OLD_METRICS, /* this should always directly follow the last metric_* */
- GANGLIA_FORMAT_1 = 2874789, /* give a little space for old metrics in case they are modified */
+ GANGLIA_FORMAT_26 = 2874789, /* give a little space for old metrics in case they are modified */
/* insert new formats here. */
GANGLIA_NUM_FORMATS /* this should always be the last entry */
};
union Ganglia_message switch (Ganglia_message_formats format) {
- case GANGLIA_FORMAT_1:
- Ganglia_format_1 *format_1;
+ case GANGLIA_FORMAT_26:
+ Ganglia_format_26 *format_26;
/* 2.5.x sources... */
case metric_user_defined:
View
3 monitor-core/srclib/libmetrics/libmetrics.h
@@ -133,6 +133,8 @@ typedef union {
#ifdef OSF
#endif
+#if 0
+/* THIS IS NOT NECESSARY ANYMORE */
enum {
user_defined,
/*
@@ -215,5 +217,6 @@ enum {
#endif
num_key_metrics
} key_metrics;
+#endif
#endif /* LIBMETRICS_H */

0 comments on commit 55e39e4

Please sign in to comment.
Something went wrong with that request. Please try again.