Merge remote-tracking branch 'origin/collectd-4.10' into collectd-5.3
authorMarc Fournier <marc.fournier@camptocamp.com>
Thu, 23 Jan 2014 13:18:08 +0000 (14:18 +0100)
committerMarc Fournier <marc.fournier@camptocamp.com>
Thu, 23 Jan 2014 13:18:08 +0000 (14:18 +0100)
1  2 
src/apache.c
src/network.c

diff --combined src/apache.c
@@@ -1,6 -1,6 +1,6 @@@
  /**
   * collectd - src/apache.c
 - * Copyright (C) 2006-2009  Florian octo Forster
 + * Copyright (C) 2006-2010  Florian octo Forster
   * Copyright (C) 2007       Florent EppO Monbillard
   * Copyright (C) 2009       Amit Gupta
   *
@@@ -144,8 -144,6 +144,8 @@@ static size_t apache_header_callback (v
                st->server_type = APACHE;
        else if (strstr (buf, "lighttpd") != NULL)
                st->server_type = LIGHTTPD;
 +      else if (strstr (buf, "IBM_HTTP_Server") != NULL)
 +              st->server_type = APACHE;
        else
        {
                const char *hdr = buf;
@@@ -335,22 -333,57 +335,22 @@@ static int config (oconfig_item_t *ci
  {
        int status = 0;
        int i;
 -      oconfig_item_t *lci = NULL; /* legacy config */
  
        for (i = 0; i < ci->children_num; i++)
        {
                oconfig_item_t *child = ci->children + i;
  
 -              if (strcasecmp ("Instance", child->key) == 0 && child->children_num > 0)
 +              if (strcasecmp ("Instance", child->key) == 0)
                        config_add (child);
                else
 -              {
 -                      /* legacy mode - convert to <Instance ...> config */
 -                      if (lci == NULL)
 -                      {
 -                              lci = malloc (sizeof(*lci));
 -                              if (lci == NULL)
 -                              {
 -                                      ERROR ("apache plugin: malloc failed.");
 -                                      return (-1);
 -                              }
 -                              memset (lci, '\0', sizeof (*lci));
 -                      }
 -
 -                      lci->children_num++;
 -                      lci->children =
 -                              realloc (lci->children,
 -                                       lci->children_num * sizeof (*child));
 -                      if (lci->children == NULL)
 -                      {
 -                              ERROR ("apache plugin: realloc failed.");
 -                              return (-1);
 -                      }
 -                      memcpy (&lci->children[lci->children_num-1], child, sizeof (*child));
 -              }
 +                      WARNING ("apache plugin: The configuration option "
 +                                      "\"%s\" is not allowed here. Did you "
 +                                      "forget to add an <Instance /> block "
 +                                      "around the configuration?",
 +                                      child->key);
        } /* for (ci->children) */
  
 -      if (lci)
 -      {
 -              /* create a <Instance ""> entry */
 -              lci->key = "Instance";
 -              lci->values_num = 1;
 -              lci->values = (oconfig_value_t *) malloc (lci->values_num * sizeof (oconfig_value_t));
 -              lci->values[0].type = OCONFIG_TYPE_STRING;
 -              lci->values[0].value.string = "";
 -
 -              status = config_add (lci);
 -              sfree (lci->values);
 -              sfree (lci->children);
 -              sfree (lci);
 -      }
 -
 -      return status;
 +      return (status);
  } /* int config */
  
  /* initialize curl for each host */
@@@ -388,8 -421,6 +388,8 @@@ static int init_host (apache_t *st) /* 
                        st->server_type = APACHE;
                else if (strcasecmp(st->server, "lighttpd") == 0)
                        st->server_type = LIGHTTPD;
 +              else if (strcasecmp(st->server, "ibm_http_server") == 0)
 +                      st->server_type = APACHE;
                else
                        WARNING ("apache plugin: Unknown `Server' setting: %s",
                                        st->server);
@@@ -478,13 -509,13 +478,13 @@@ static void submit_value (const char *t
        plugin_dispatch_values (&vl);
  } /* void submit_value */
  
 -static void submit_counter (const char *type, const char *type_instance,
 -              counter_t c, apache_t *st)
 +static void submit_derive (const char *type, const char *type_instance,
 +              derive_t c, apache_t *st)
  {
        value_t v;
 -      v.counter = c;
 +      v.derive = c;
        submit_value (type, type_instance, v, st);
 -} /* void submit_counter */
 +} /* void submit_derive */
  
  static void submit_gauge (const char *type, const char *type_instance,
                gauge_t g, apache_t *st)
@@@ -646,11 -677,11 +646,11 @@@ static int apache_read_host (user_data_
                {
                        if ((strcmp (fields[0], "Total") == 0)
                                        && (strcmp (fields[1], "Accesses:") == 0))
 -                              submit_counter ("apache_requests", "",
 +                              submit_derive ("apache_requests", "",
                                                atoll (fields[2]), st);
                        else if ((strcmp (fields[0], "Total") == 0)
                                        && (strcmp (fields[1], "kBytes:") == 0))
 -                              submit_counter ("apache_bytes", "",
 +                              submit_derive ("apache_bytes", "",
                                                1024LL * atoll (fields[2]), st);
                }
                else if (fields_num == 2)
        return (0);
  } /* }}} int apache_read_host */
  
+ static int apache_init (void) /* {{{ */
+ {
+       /* Call this while collectd is still single-threaded to avoid
+        * initialization issues in libgcrypt. */
+       curl_global_init (CURL_GLOBAL_SSL);
+       return (0);
+ } /* }}} int apache_init */
  void module_register (void)
  {
        plugin_register_complex_config ("apache", config);
+       plugin_register_init ("apache", apache_init);
  } /* void module_register */
  
  /* vim: set sw=8 noet fdm=marker : */
diff --combined src/network.c
@@@ -276,8 -276,7 +276,8 @@@ typedef struct receive_list_entry_s rec
   * Private variables
   */
  static int network_config_ttl = 0;
 -static size_t network_config_packet_size = 1024;
 +/* Ethernet - (IPv6 + UDP) = 1500 - (40 + 8) = 1452 */
 +static size_t network_config_packet_size = 1452;
  static int network_config_forward = 0;
  static int network_config_stats = 0;
  
@@@ -314,14 -313,14 +314,14 @@@ static pthread_mutex_t  send_buffer_loc
   * 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 derive_t stats_octets_rx  = 0;
 +static derive_t stats_octets_tx  = 0;
 +static derive_t stats_packets_rx = 0;
 +static derive_t stats_packets_tx = 0;
 +static derive_t stats_values_dispatched = 0;
 +static derive_t stats_values_not_dispatched = 0;
 +static derive_t stats_values_sent = 0;
 +static derive_t stats_values_not_sent = 0;
  static pthread_mutex_t stats_lock = PTHREAD_MUTEX_INITIALIZER;
  
  /*
@@@ -338,30 -337,30 +338,30 @@@ static _Bool check_receive_okay (const 
    /* This is a value we already sent. Don't allow it to be received again in
     * order to avoid looping. */
    if ((status == 0) && (time_sent >= ((uint64_t) vl->time)))
 -    return (false);
 +    return (0);
  
 -  return (true);
 +  return (1);
  } /* }}} _Bool check_receive_okay */
  
  static _Bool check_send_okay (const value_list_t *vl) /* {{{ */
  {
 -  _Bool received = false;
 +  _Bool received = 0;
    int status;
  
    if (network_config_forward != 0)
 -    return (true);
 +    return (1);
  
    if (vl->meta == NULL)
 -    return (true);
 +    return (1);
  
    status = meta_data_get_boolean (vl->meta, "network:received", &received);
    if (status == -ENOENT)
 -    return (true);
 +    return (1);
    else if (status != 0)
    {
      ERROR ("network plugin: check_send_okay: meta_data_get_boolean failed "
        "with status %i.", status);
 -    return (true);
 +    return (1);
    }
  
    /* By default, only *send* value lists that were not *received* by the
@@@ -439,7 -438,7 +439,7 @@@ static int network_dispatch_values (val
      return (-ENOMEM);
    }
  
 -  status = meta_data_add_boolean (vl->meta, "network:received", true);
 +  status = meta_data_add_boolean (vl->meta, "network:received", 1);
    if (status != 0)
    {
      ERROR ("network plugin: meta_data_add_boolean failed.");
      }
    }
  
 -  plugin_dispatch_values_secure (vl);
 +  plugin_dispatch_values (vl);
    stats_values_dispatched++;
  
    meta_data_destroy (vl->meta);
@@@ -501,8 -500,15 +501,15 @@@ static void network_init_gcrypt (void) 
    if (gcry_control (GCRYCTL_ANY_INITIALIZATION_P))
      return;
  
-   gcry_check_version (NULL); /* before calling any other functions */
+  /* http://www.gnupg.org/documentation/manuals/gcrypt/Multi_002dThreading.html
+   * To ensure thread-safety, it's important to set GCRYCTL_SET_THREAD_CBS
+   * *before* initalizing Libgcrypt with gcry_check_version(), which itself must
+   * be called before any other gcry_* function. GCRYCTL_ANY_INITIALIZATION_P
+   * above doesn't count, as it doesn't implicitly initalize Libgcrypt.
+   *
+   * tl;dr: keep all these gry_* statements in this exact order please. */
    gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
+   gcry_check_version (NULL);
    gcry_control (GCRYCTL_INIT_SECMEM, 32768);
    gcry_control (GCRYCTL_INITIALIZATION_FINISHED);
  } /* }}} void network_init_gcrypt */
@@@ -1471,19 -1477,8 +1478,19 @@@ static int parse_packet (sockent_t *se
                                        &tmp);
                        if (status == 0)
                        {
 -                              vl.time = (time_t) tmp;
 -                              n.time = (time_t) tmp;
 +                              vl.time = TIME_T_TO_CDTIME_T (tmp);
 +                              n.time  = TIME_T_TO_CDTIME_T (tmp);
 +                      }
 +              }
 +              else if (pkg_type == TYPE_TIME_HR)
 +              {
 +                      uint64_t tmp = 0;
 +                      status = parse_part_number (&buffer, &buffer_size,
 +                                      &tmp);
 +                      if (status == 0)
 +                      {
 +                              vl.time = (cdtime_t) tmp;
 +                              n.time  = (cdtime_t) tmp;
                        }
                }
                else if (pkg_type == TYPE_INTERVAL)
                        status = parse_part_number (&buffer, &buffer_size,
                                        &tmp);
                        if (status == 0)
 -                              vl.interval = (int) tmp;
 +                              vl.interval = TIME_T_TO_CDTIME_T (tmp);
 +              }
 +              else if (pkg_type == TYPE_INTERVAL_HR)
 +              {
 +                      uint64_t tmp = 0;
 +                      status = parse_part_number (&buffer, &buffer_size,
 +                                      &tmp);
 +                      if (status == 0)
 +                              vl.interval = (cdtime_t) tmp;
                }
                else if (pkg_type == TYPE_HOST)
                {
@@@ -2705,7 -2692,7 +2712,7 @@@ static int add_to_buffer (char *buffer
  
        if (vl_def->time != vl->time)
        {
 -              if (write_part_number (&buffer, &buffer_size, TYPE_TIME,
 +              if (write_part_number (&buffer, &buffer_size, TYPE_TIME_HR,
                                        (uint64_t) vl->time))
                        return (-1);
                vl_def->time = vl->time;
  
        if (vl_def->interval != vl->interval)
        {
 -              if (write_part_number (&buffer, &buffer_size, TYPE_INTERVAL,
 +              if (write_part_number (&buffer, &buffer_size, TYPE_INTERVAL_HR,
                                        (uint64_t) vl->interval))
                        return (-1);
                vl_def->interval = vl->interval;
@@@ -3175,6 -3162,8 +3182,6 @@@ static int network_config (oconfig_item
        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
      {
        WARNING ("network plugin: Option `%s' is not allowed here.",
@@@ -3198,7 -3187,7 +3205,7 @@@ static int network_notification (const 
  
    memset (buffer, 0, sizeof (buffer));
  
 -  status = write_part_number (&buffer_ptr, &buffer_free, TYPE_TIME,
 +  status = write_part_number (&buffer_ptr, &buffer_free, TYPE_TIME_HR,
        (uint64_t) n->time);
    if (status != 0)
      return (-1);
@@@ -3303,15 -3292,15 +3310,15 @@@ static int network_shutdown (void
  
  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;
 +      derive_t copy_octets_rx;
 +      derive_t copy_octets_tx;
 +      derive_t copy_packets_rx;
 +      derive_t copy_packets_tx;
 +      derive_t copy_values_dispatched;
 +      derive_t copy_values_not_dispatched;
 +      derive_t copy_values_sent;
 +      derive_t copy_values_not_sent;
 +      derive_t copy_receive_list_length;
        value_list_t vl = VALUE_LIST_INIT;
        value_t values[2];
  
        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;
 +      vl.values[0].derive = (derive_t) copy_octets_rx;
 +      vl.values[1].derive = (derive_t) copy_octets_tx;
        sstrncpy (vl.type, "if_octets", sizeof (vl.type));
 -      plugin_dispatch_values_secure (&vl);
 +      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;
 +      vl.values[0].derive = (derive_t) copy_packets_rx;
 +      vl.values[1].derive = (derive_t) copy_packets_tx;
        sstrncpy (vl.type, "if_packets", sizeof (vl.type));
 -      plugin_dispatch_values_secure (&vl);
 +      plugin_dispatch_values (&vl);
  
        /* Values (not) dispatched and (not) send */
        sstrncpy (vl.type, "total_values", sizeof (vl.type));
        vl.values[0].derive = (derive_t) copy_values_dispatched;
        sstrncpy (vl.type_instance, "dispatch-accepted",
                        sizeof (vl.type_instance));
 -      plugin_dispatch_values_secure (&vl);
 +      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_secure (&vl);
 +      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_secure (&vl);
 +      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_secure (&vl);
 +      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_secure (&vl);
 +      plugin_dispatch_values (&vl);
  
        return (0);
  } /* }}} int network_stats_read */
  
  static int network_init (void)
  {
 -      static _Bool have_init = false;
 +      static _Bool have_init = 0;
  
        /* Check if we were already initialized. If so, just return - there's
         * nothing more to do (for now, that is). */
        if (have_init)
                return (0);
 -      have_init = true;
 +      have_init = 1;
  
  #if HAVE_LIBGCRYPT
        network_init_gcrypt ();
        if (dispatch_thread_running == 0)
        {
                int status;
 -              status = pthread_create (&dispatch_thread_id,
 +              status = plugin_thread_create (&dispatch_thread_id,
                                NULL /* no attributes */,
                                dispatch_thread,
                                NULL /* no argument */);
        if (receive_thread_running == 0)
        {
                int status;
 -              status = pthread_create (&receive_thread_id,
 +              status = plugin_thread_create (&receive_thread_id,
                                NULL /* no attributes */,
                                receive_thread,
                                NULL /* no argument */);
   * just send the buffer if `flush'  is called - if the requested value was in
   * there, good. If not, well, then there is nothing to flush.. -octo
   */
 -static int network_flush (int timeout,
 -              const char __attribute__((unused)) *identifier,
 -              user_data_t __attribute__((unused)) *user_data)
 +static int network_flush (__attribute__((unused)) cdtime_t timeout,
 +              __attribute__((unused)) const char *identifier,
 +              __attribute__((unused)) user_data_t *user_data)
  {
        pthread_mutex_lock (&send_buffer_lock);