Merge branch 'collectd-4.8' into collectd-4.9
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Fri, 18 Dec 2009 10:26:20 +0000 (11:26 +0100)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Fri, 18 Dec 2009 10:26:20 +0000 (11:26 +0100)
Conflicts:
ChangeLog

1  2 
ChangeLog
src/network.c
version-gen.sh

diff --combined ChangeLog
+++ b/ChangeLog
@@@ -1,42 -1,22 +1,61 @@@
 +2009-12-21, Version 4.9.0
 +      * contextswitch plugin: The new ContextSwitch plugin gathers the
 +        number of context switches done by the CPU. Thanks to Patrik
 +        Weiskircher for the patch.
 +      * cpu plugin: Support for SMP (multiple processors) under FreeBSD has
 +        been added. Thanks to Doug MacEachern for the patch.
 +      * curl plugin: The “MeasureResponseTime” option has been added. Thanks
 +        to Aman Gupta for the patch.
 +      * df plugin: Collecting the inode count and reserved space has been
 +        added. Thanks to Patrik Weiskircher for the patch.
 +      * exec plugin: The environment variables “COLLECTD_INTERVAL” and
 +        “COLLECTD_HOSTNAME” are now set before executing the application.
 +      * Monitorus plugin: This Perl-based plugin to query statistics from
 +        mon.itor.us has been added. Thanks to Jeff Green for the patch.
 +      * netapp plugin: New plugin to collect statistics from NetApp filers.
 +        Thanks to Sven Trenkel of the noris network AG for the patch.
 +      * network plugin: Statistics collection about the plugin itself has
 +        been implemented.
 +      * openvpn plugin: Add support for more versions of the “status file”.
 +        Thanks to Marco Chiappero for the patch.
 +      * OpenVZ plugin: This Perl-based plugin to gather OpenVZ statistics
 +        has been added. Thanks to Jonathan Kolb for the patch.
 +      * ping plugin: The config options "SourceAddress" and "Device"
 +        have been added. Thanks to Sebastian Harl for the patch.
 +      * processes plugin: Collection of IO-metrics has been added. Thanks to
 +        Andrés J. Díaz for the patch.
 +      * python plugin: The new Python plugin integrates a Python interpreter
 +        into collectd and allows to execute plugins written in the scripting
 +        language. Thanks to Sven Trenkel for his work.
 +      * routeros plugin: The new RouterOS plugin queries interface and
 +        wireless registration statistics from RouterOS.
 +      * Various plugins: AIX support has been added to the cpu, disk,
 +        interface, load, memory, processes, and swap plugins. Thanks to
 +        Manuel Sanmartin for his patches.
 +      * hashed match: This match for simple load balancing and redundant
 +        storage has been added.
 +      * scale target: This target to scale (multiply) values by an arbitrary
 +        value has been added.
 +
+ 2009-12-18, Version 4.8.2
+       * Build system, java plugin: Don't use “find -L” to search for Java
+         headers, because it's a GNU extension.
+       * Build system: Support for parallel builds has been improved. Thanks
+         Sebastian Harl and Stefan Völkel for looking into this.
+       * collectd: Print error messages to STDERR if no log plugin has been
+         loaded.
+       * genericjmx plugin: Close and re-open the connection upon I/O-errors.
+       * gmond plugin: Fix typos which caused syntax errors.
+       * memory plugin: Handling of >4 Gbyte of memory has been fixed.
+       * network plugin: The license has been changed to LGPL 2.1.
+       * oracle plugin: Reconnect to the database if the connection dies.
+       * rrdcached plugin: Work-around for a bug in RRDtool 1.4rc2 has been
+         added.
+       * snmp plugin: Handling of negative values has been fixed. Strings
+         containing control characters are now interpreted as hex-strings.
+       * unixsock plugin: A memory leak in the LISTVAL command has been
+         fixed. Thanks to Ben Knight for his patch.
  2009-10-04, Version 4.8.1
        * Build system: Issues when building the iptables plugin have been
          fixed.
          lists, where at least one data source is of type COUNTER and the
          counter value of all counter data sources is zero.
  
+ 2009-12-18, Version 4.7.5
+       * Build system, java plugin: Don't use “find -L” to search for Java
+         headers, because it's a GNU extension.
+       * Build system: Support for parallel builds has been improved. Thanks
+         Sebastian Harl and Stefan Völkel for looking into this.
+       * collectd: Print error messages to STDERR if no log plugin has been
+         loaded.
+       * memory plugin: Handling of >4 Gbyte of memory has been fixed.
+       * network plugin: The license has been changed to LGPL 2.1.
+       * oracle plugin: Reconnect to the database if the connection dies.
+       * rrdcached plugin: Work-around for a bug in RRDtool 1.4rc2 has been
+         added.
+       * snmp plugin: Handling of negative values has been fixed. Strings
+         containing control characters are now interpreted as hex-strings.
+       * unixsock plugin: A memory leak in the LISTVAL command has been
+         fixed. Thanks to Ben Knight for his patch.
  2009-10-03, Version 4.7.4
        * Build system: Issues when building the iptables plugin have been
          fixed.
diff --combined src/network.c
@@@ -4,17 -4,18 +4,18 @@@
   * Copyright (C) 2009       Aman Gupta
   *
   * This program is free software; you can redistribute it and/or modify it
-  * under the terms of the GNU General Public License as published by the
-  * Free Software Foundation; only version 2 of the License is applicable.
+  * under the terms of the GNU Lesser General Public License as published by
+  * the Free Software Foundation; only version 2.1 of the License is
+  * applicable.
   *
   * This program is distributed in the hope that it will be useful, but
   * WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  * General Public License for more details.
+  * Lesser General Public License for more details.
   *
-  * You should have received a copy of the GNU General Public License along
-  * with this program; if not, write to the Free Software Foundation, Inc.,
-  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+  * You should have received a copy of the GNU Lesser General Public License
+  * along with this program; if not, write to the Free Software Foundation,
+  * Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
   *
   * Authors:
   *   Florian octo Forster <octo at verplant.org>
@@@ -255,7 -256,6 +256,7 @@@ typedef struct receive_list_entry_s rec
  static int network_config_ttl = 0;
  static size_t network_config_packet_size = 1024;
  static int network_config_forward = 0;
 +static int network_config_stats = 0;
  
  static sockent_t *sending_sockets = NULL;
  
@@@ -263,7 -263,6 +264,7 @@@ static receive_list_entry_t *receive_li
  static receive_list_entry_t *receive_list_tail = NULL;
  static pthread_mutex_t       receive_list_lock = PTHREAD_MUTEX_INITIALIZER;
  static pthread_cond_t        receive_list_cond = PTHREAD_COND_INITIALIZER;
 +static uint64_t              receive_list_length = 0;
  
  static sockent_t     *listen_sockets = NULL;
  static struct pollfd *listen_sockets_pollfd = NULL;
@@@ -284,22 -283,6 +285,22 @@@ static int              send_buffer_fil
  static value_list_t     send_buffer_vl = VALUE_LIST_STATIC;
  static pthread_mutex_t  send_buffer_lock = PTHREAD_MUTEX_INITIALIZER;
  
 +/* XXX: These counters are incremented from one place only. The spot in which
 + * the values are incremented is either only reachable by one thread (the
 + * dispatch thread, for example) or locked by some lock (send_buffer_lock for
 + * example). Only if neither is true, the stats_lock is acquired. The counters
 + * are always read without holding a lock in the hope that writing 8 bytes to
 + * memory is an atomic operation. */
 +static uint64_t stats_octets_rx  = 0;
 +static uint64_t stats_octets_tx  = 0;
 +static uint64_t stats_packets_rx = 0;
 +static uint64_t stats_packets_tx = 0;
 +static uint64_t stats_values_dispatched = 0;
 +static uint64_t stats_values_not_dispatched = 0;
 +static uint64_t stats_values_sent = 0;
 +static uint64_t stats_values_not_sent = 0;
 +static pthread_mutex_t stats_lock = PTHREAD_MUTEX_INITIALIZER;
 +
  /*
   * Private functions
   */
@@@ -358,13 -341,12 +359,13 @@@ static int network_dispatch_values (val
    if (!check_receive_okay (vl))
    {
  #if COLLECT_DEBUG
 -        char name[6*DATA_MAX_NAME_LEN];
 -        FORMAT_VL (name, sizeof (name), vl);
 -        name[sizeof (name) - 1] = 0;
 -        DEBUG ("network plugin: network_dispatch_values: "
 -            "NOT dispatching %s.", name);
 +    char name[6*DATA_MAX_NAME_LEN];
 +    FORMAT_VL (name, sizeof (name), vl);
 +    name[sizeof (name) - 1] = 0;
 +    DEBUG ("network plugin: network_dispatch_values: "
 +      "NOT dispatching %s.", name);
  #endif
 +    stats_values_not_dispatched++;
      return (0);
    }
  
    }
  
    plugin_dispatch_values (vl);
 +  stats_values_dispatched++;
  
    meta_data_destroy (vl->meta);
    vl->meta = NULL;
@@@ -1988,7 -1969,6 +1989,7 @@@ static void *dispatch_thread (void __at
      ent = receive_list_head;
      if (ent != NULL)
        receive_list_head = ent->next;
 +    receive_list_length--;
      pthread_mutex_unlock (&receive_list_lock);
  
      /* Check whether we are supposed to exit. We do NOT check `listen_loop'
@@@ -2040,13 -2020,11 +2041,13 @@@ static int network_receive (void) /* {{
  
        receive_list_entry_t *private_list_head;
        receive_list_entry_t *private_list_tail;
 +      uint64_t              private_list_length;
  
          assert (listen_sockets_num > 0);
  
        private_list_head = NULL;
        private_list_tail = NULL;
 +      private_list_length = 0;
  
        while (listen_loop == 0)
        {
                                return (-1);
                        }
  
 +                      stats_octets_rx += ((uint64_t) buffer_len);
 +                      stats_packets_rx++;
 +
                        /* TODO: Possible performance enhancement: Do not free
                         * these entries in the dispatch thread but put them in
                         * another list, so we don't have to allocate more and
                        ent->data = malloc (network_config_packet_size);
                        if (ent->data == NULL)
                        {
 +                              sfree (ent);
                                ERROR ("network plugin: malloc failed.");
                                return (-1);
                        }
                        else
                                private_list_tail->next = ent;
                        private_list_tail = ent;
 +                      private_list_length++;
  
                        /* Do not block here. Blocking here has led to
                         * insufficient performance in the past. */
                        if (pthread_mutex_trylock (&receive_list_lock) == 0)
                        {
 +                              assert (((receive_list_head == NULL) && (receive_list_length == 0))
 +                                              || ((receive_list_head != NULL) && (receive_list_length != 0)));
 +
                                if (receive_list_head == NULL)
                                        receive_list_head = private_list_head;
                                else
                                        receive_list_tail->next = private_list_head;
                                receive_list_tail = private_list_tail;
 -
 -                              private_list_head = NULL;
 -                              private_list_tail = NULL;
 +                              receive_list_length += private_list_length;
  
                                pthread_cond_signal (&receive_list_cond);
                                pthread_mutex_unlock (&receive_list_lock);
 +
 +                              private_list_head = NULL;
 +                              private_list_tail = NULL;
 +                              private_list_length = 0;
                        }
                } /* for (listen_sockets_pollfd) */
        } /* while (listen_loop == 0) */
                else
                        receive_list_tail->next = private_list_head;
                receive_list_tail = private_list_tail;
 +              receive_list_length += private_list_length;
  
                private_list_head = NULL;
                private_list_tail = NULL;
 +              private_list_length = 0;
  
                pthread_cond_signal (&receive_list_cond);
                pthread_mutex_unlock (&receive_list_lock);
@@@ -2464,10 -2430,6 +2465,10 @@@ static void flush_buffer (void
                        send_buffer_fill);
  
        network_send_buffer (send_buffer, (size_t) send_buffer_fill);
 +
 +      stats_octets_tx += ((uint64_t) send_buffer_fill);
 +      stats_packets_tx++;
 +
        network_init_buffer ();
  }
  
@@@ -2485,11 -2447,6 +2486,11 @@@ static int network_write (const data_se
          DEBUG ("network plugin: network_write: "
              "NOT sending %s.", name);
  #endif
 +        /* Counter is not protected by another lock and may be reached by
 +         * multiple threads */
 +        pthread_mutex_lock (&stats_lock);
 +        stats_values_not_sent++;
 +        pthread_mutex_unlock (&stats_lock);
          return (0);
        }
  
                /* status == bytes added to the buffer */
                send_buffer_fill += status;
                send_buffer_ptr  += status;
 +
 +              stats_values_sent++;
        }
        else
        {
                {
                        send_buffer_fill += status;
                        send_buffer_ptr  += status;
 +
 +                      stats_values_sent++;
                }
        }
  
@@@ -2566,9 -2519,13 +2567,9 @@@ static int network_config_set_boolean (
    {
      char *str = ci->values[0].value.string;
  
 -    if ((strcasecmp ("true", str) == 0)
 -        || (strcasecmp ("yes", str) == 0)
 -        || (strcasecmp ("on", str) == 0))
 +    if (IS_TRUE (str))
        *retval = 1;
 -    else if ((strcasecmp ("false", str) == 0)
 -        || (strcasecmp ("no", str) == 0)
 -        || (strcasecmp ("off", str) == 0))
 +    else if (IS_FALSE (str))
        *retval = 0;
      else
      {
@@@ -2845,8 -2802,6 +2846,8 @@@ static int network_config (oconfig_item
        network_config_set_buffer_size (child);
      else if (strcasecmp ("Forward", child->key) == 0)
        network_config_set_boolean (child, &network_config_forward);
 +    else if (strcasecmp ("ReportStats", child->key) == 0)
 +      network_config_set_boolean (child, &network_config_stats);
      else if (strcasecmp ("CacheFlush", child->key) == 0)
        /* no op for backwards compatibility only */;
      else
@@@ -2973,83 -2928,6 +2974,83 @@@ static int network_shutdown (void
        return (0);
  } /* int network_shutdown */
  
 +static int network_stats_read (void) /* {{{ */
 +{
 +      uint64_t copy_octets_rx;
 +      uint64_t copy_octets_tx;
 +      uint64_t copy_packets_rx;
 +      uint64_t copy_packets_tx;
 +      uint64_t copy_values_dispatched;
 +      uint64_t copy_values_not_dispatched;
 +      uint64_t copy_values_sent;
 +      uint64_t copy_values_not_sent;
 +      uint64_t copy_receive_list_length;
 +      value_list_t vl = VALUE_LIST_INIT;
 +      value_t values[2];
 +
 +      copy_octets_rx = stats_octets_rx;
 +      copy_octets_tx = stats_octets_tx;
 +      copy_packets_rx = stats_packets_rx;
 +      copy_packets_tx = stats_packets_tx;
 +      copy_values_dispatched = stats_values_dispatched;
 +      copy_values_not_dispatched = stats_values_not_dispatched;
 +      copy_values_sent = stats_values_sent;
 +      copy_values_not_sent = stats_values_not_sent;
 +      copy_receive_list_length = receive_list_length;
 +
 +      /* Initialize `vl' */
 +      vl.values = values;
 +      vl.values_len = 2;
 +      vl.time = 0;
 +      vl.interval = interval_g;
 +      sstrncpy (vl.host, hostname_g, sizeof (vl.host));
 +      sstrncpy (vl.plugin, "network", sizeof (vl.plugin));
 +
 +      /* Octets received / sent */
 +      vl.values[0].counter = (counter_t) copy_octets_rx;
 +      vl.values[1].counter = (counter_t) copy_octets_tx;
 +      sstrncpy (vl.type, "if_octets", sizeof (vl.type));
 +      plugin_dispatch_values (&vl);
 +
 +      /* Packets received / send */
 +      vl.values[0].counter = (counter_t) copy_packets_rx;
 +      vl.values[1].counter = (counter_t) copy_packets_tx;
 +      sstrncpy (vl.type, "if_packets", sizeof (vl.type));
 +      plugin_dispatch_values (&vl);
 +
 +      /* Values (not) dispatched and (not) send */
 +      sstrncpy (vl.type, "total_values", sizeof (vl.type));
 +      vl.values_len = 1;
 +
 +      vl.values[0].derive = (derive_t) copy_values_dispatched;
 +      sstrncpy (vl.type_instance, "dispatch-accepted",
 +                      sizeof (vl.type_instance));
 +      plugin_dispatch_values (&vl);
 +
 +      vl.values[0].derive = (derive_t) copy_values_not_dispatched;
 +      sstrncpy (vl.type_instance, "dispatch-rejected",
 +                      sizeof (vl.type_instance));
 +      plugin_dispatch_values (&vl);
 +
 +      vl.values[0].derive = (derive_t) copy_values_sent;
 +      sstrncpy (vl.type_instance, "send-accepted",
 +                      sizeof (vl.type_instance));
 +      plugin_dispatch_values (&vl);
 +
 +      vl.values[0].derive = (derive_t) copy_values_not_sent;
 +      sstrncpy (vl.type_instance, "send-rejected",
 +                      sizeof (vl.type_instance));
 +      plugin_dispatch_values (&vl);
 +
 +      /* Receive queue length */
 +      vl.values[0].gauge = (gauge_t) copy_receive_list_length;
 +      sstrncpy (vl.type, "queue_length", sizeof (vl.type));
 +      vl.type_instance[0] = 0;
 +      plugin_dispatch_values (&vl);
 +
 +      return (0);
 +} /* }}} int network_stats_read */
 +
  static int network_init (void)
  {
        static _Bool have_init = false;
        gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
  #endif
  
 +      if (network_config_stats != 0)
 +              plugin_register_read ("network", network_stats_read);
 +
        plugin_register_shutdown ("network", network_shutdown);
  
        send_buffer = malloc (network_config_packet_size);
diff --combined version-gen.sh
@@@ -1,6 -1,6 +1,6 @@@
  #!/bin/sh
  
- DEFAULT_VERSION="4.8.1.git"
+ DEFAULT_VERSION="4.8.2.git"
  
  VERSION="`git describe 2> /dev/null | sed -e 's/^collectd-//'`"
  
@@@ -10,8 -10,4 +10,8 @@@ f
  
  VERSION="`echo \"$VERSION\" | sed -e 's/-/./g'`"
  
 -echo -n "$VERSION"
 +if test "x`uname -s`" = "xAIX" ; then 
 +      echo "$VERSION\c"
 +else 
 +      echo -n "$VERSION"
 +fi