X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fgmond.c;h=67e0406cd675644148cf3099b3c6cec379ca956d;hb=354f9991530248e45207d236eb74c1cc3d5238ef;hp=c778d48dceb9a1ff4848c72571107d8f87c63471;hpb=40aabf444e124f40603021821e98bcc40c4aaa0e;p=collectd.git diff --git a/src/gmond.c b/src/gmond.c index c778d48d..67e0406c 100644 --- a/src/gmond.c +++ b/src/gmond.c @@ -1,6 +1,6 @@ /** * collectd - src/gmond.c - * Copyright (C) 2009,2010 Florian octo Forster + * Copyright (C) 2009-2015 Florian octo Forster * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -288,8 +288,14 @@ static int create_sockets (socket_entry_t **ret_sockets, /* {{{ */ { int yes = 1; - setsockopt (sockets[sockets_num].fd, SOL_SOCKET, SO_REUSEADDR, + status = setsockopt (sockets[sockets_num].fd, SOL_SOCKET, SO_REUSEADDR, (void *) &yes, sizeof (yes)); + if (status != 0) + { + char errbuf[1024]; + WARNING ("gmond plugin: setsockopt(2) failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + } } status = bind (sockets[sockets_num].fd, ai_ptr->ai_addr, ai_ptr->ai_addrlen); @@ -317,14 +323,27 @@ static int create_sockets (socket_entry_t **ret_sockets, /* {{{ */ } loop = 1; - setsockopt (sockets[sockets_num].fd, IPPROTO_IP, IP_MULTICAST_LOOP, + status = setsockopt (sockets[sockets_num].fd, IPPROTO_IP, IP_MULTICAST_LOOP, (void *) &loop, sizeof (loop)); + if (status != 0) + { + char errbuf[1024]; + WARNING ("gmond plugin: setsockopt(2) failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + } memset (&mreq, 0, sizeof (mreq)); mreq.imr_multiaddr.s_addr = addr->sin_addr.s_addr; mreq.imr_interface.s_addr = htonl (INADDR_ANY); - setsockopt (sockets[sockets_num].fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, + + status = setsockopt (sockets[sockets_num].fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *) &mreq, sizeof (mreq)); + if (status != 0) + { + char errbuf[1024]; + WARNING ("gmond plugin: setsockopt(2) failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + } } /* if (ai_ptr->ai_family == AF_INET) */ else if (ai_ptr->ai_family == AF_INET6) { @@ -341,15 +360,27 @@ static int create_sockets (socket_entry_t **ret_sockets, /* {{{ */ } loop = 1; - setsockopt (sockets[sockets_num].fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, + status = setsockopt (sockets[sockets_num].fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (void *) &loop, sizeof (loop)); + if (status != 0) + { + char errbuf[1024]; + WARNING ("gmond plugin: setsockopt(2) failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + } memset (&mreq, 0, sizeof (mreq)); memcpy (&mreq.ipv6mr_multiaddr, &addr->sin6_addr, sizeof (addr->sin6_addr)); mreq.ipv6mr_interface = 0; /* any */ - setsockopt (sockets[sockets_num].fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, + status = setsockopt (sockets[sockets_num].fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (void *) &mreq, sizeof (mreq)); + if (status != 0) + { + char errbuf[1024]; + WARNING ("gmond plugin: setsockopt(2) failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + } } /* if (ai_ptr->ai_family == AF_INET6) */ sockets_num++; @@ -407,10 +438,19 @@ static int request_meta_data (const char *host, const char *name) /* {{{ */ pthread_mutex_lock (&mc_send_sockets_lock); for (i = 0; i < mc_send_sockets_num; i++) - sendto (mc_send_sockets[i].fd, buffer, (size_t) buffer_size, + { + ssize_t status = sendto (mc_send_sockets[i].fd, buffer, (size_t) buffer_size, /* flags = */ 0, (struct sockaddr *) &mc_send_sockets[i].addr, mc_send_sockets[i].addrlen); + if (status == -1) + { + char errbuf[1024]; + ERROR ("gmond plugin: sendto(2) failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + continue; + } + } pthread_mutex_unlock (&mc_send_sockets_lock); sfree (msg.Ganglia_metadata_msg_u.grequest.metric_id.host); @@ -439,10 +479,9 @@ static staging_entry_t *staging_entry_get (const char *host, /* {{{ */ return (se); /* insert new entry */ - se = (staging_entry_t *) malloc (sizeof (*se)); + se = calloc (1, sizeof (*se)); if (se == NULL) return (NULL); - memset (se, 0, sizeof (*se)); sstrncpy (se->key, key, sizeof (se->key)); se->flags = 0; @@ -476,36 +515,6 @@ static staging_entry_t *staging_entry_get (const char *host, /* {{{ */ return (se); } /* }}} staging_entry_t *staging_entry_get */ -static int staging_entry_submit (const char *host, const char *name, /* {{{ */ - staging_entry_t *se) -{ - value_list_t vl; - value_t values[se->vl.values_len]; - - if (se->vl.interval == 0) - { - /* No meta data has been received for this metric yet. */ - se->flags = 0; - pthread_mutex_unlock (&staging_lock); - request_meta_data (host, name); - return (0); - } - - se->flags = 0; - - memcpy (values, se->vl.values, sizeof (values)); - memcpy (&vl, &se->vl, sizeof (vl)); - - /* Unlock before calling `plugin_dispatch_values'.. */ - pthread_mutex_unlock (&staging_lock); - - vl.values = values; - - plugin_dispatch_values (&vl); - - return (0); -} /* }}} int staging_entry_submit */ - static int staging_entry_update (const char *host, const char *name, /* {{{ */ const char *type, const char *type_instance, size_t ds_index, int ds_type, value_t value) @@ -555,17 +564,30 @@ static int staging_entry_update (const char *host, const char *name, /* {{{ */ se->flags |= (0x01 << ds_index); - /* Check if all values have been set and submit if so. */ - if (se->flags == ((0x01 << se->vl.values_len) - 1)) + /* Check if all data sources have been set. If not, return here. */ + if (se->flags != ((0x01 << se->vl.values_len) - 1)) { - /* `staging_lock' is unlocked in `staging_entry_submit'. */ - staging_entry_submit (host, name, se); + pthread_mutex_unlock (&staging_lock); + return (0); } - else + + /* Check if the interval of this metric is known. If not, request meta data + * and return. */ + if (se->vl.interval == 0) { + /* No meta data has been received for this metric yet. */ + se->flags = 0; pthread_mutex_unlock (&staging_lock); + + request_meta_data (host, name); + return (0); } + plugin_dispatch_values (&se->vl); + + se->flags = 0; + pthread_mutex_unlock (&staging_lock); + return (0); } /* }}} int staging_entry_update */ @@ -915,7 +937,7 @@ static int mc_receive_thread_stop (void) /* {{{ */ return (0); } /* }}} int mc_receive_thread_stop */ -/* +/* * Config: * *