Merge pull request #1293 from mfournier/read-threads-timing
authorMarc Fournier <marc.fournier@camptocamp.com>
Wed, 2 Dec 2015 08:14:59 +0000 (09:14 +0100)
committerMarc Fournier <marc.fournier@camptocamp.com>
Wed, 2 Dec 2015 08:14:59 +0000 (09:14 +0100)
Read threads timing

1  2 
src/daemon/plugin.c
src/snmp.c

diff --combined src/daemon/plugin.c
@@@ -288,7 -288,7 +288,7 @@@ static int register_callback (llist_t *
                {
                        ERROR ("plugin: register_callback: "
                                        "llentry_create failed.");
 -                      free (key);
 +                      sfree (key);
                        destroy_callback (cf);
                        return (-1);
                }
@@@ -358,9 -358,9 +358,9 @@@ static void log_list_callbacks (llist_
                *str = '\0';
                strjoin(str, len, keys, n, "', '");
                INFO("%s ['%s']", comment, str);
 -              free(str);
 +              sfree (str);
        }
 -      free(keys);
 +      sfree (keys);
  } /* }}} void log_list_callbacks */
  
  static int create_register_callback (llist_t **list, /* {{{ */
@@@ -483,7 -483,9 +483,9 @@@ static void *plugin_read_thread (void _
        {
                read_func_t *rf;
                plugin_ctx_t old_ctx;
+               cdtime_t start;
                cdtime_t now;
+               cdtime_t elapsed;
                int status;
                int rf_type;
                int rc;
  
                DEBUG ("plugin_read_thread: Handling `%s'.", rf->rf_name);
  
+               start = cdtime ();
                old_ctx = plugin_set_ctx (rf->rf_ctx);
  
                if (rf_type == RF_SIMPLE)
                /* update the ``next read due'' field */
                now = cdtime ();
  
+               /* calculate the time spent in the read function */
+               elapsed = (now - start);
+               if (elapsed > rf->rf_effective_interval)
+                       WARNING ("plugin_read_thread: read-function of the `%s' plugin took %.3f "
+                               "seconds, which is above its read interval (%.3f seconds). You might "
+                               "want to adjust the `Interval' or `ReadThreads' settings.",
+                               rf->rf_name, CDTIME_T_TO_DOUBLE(elapsed),
+                               CDTIME_T_TO_DOUBLE(rf->rf_effective_interval));
+               DEBUG ("plugin_read_thread: read-function of the `%s' plugin took "
+                               "%.6f seconds.",
+                               rf->rf_name, CDTIME_T_TO_DOUBLE(elapsed));
                DEBUG ("plugin_read_thread: Effective interval of the "
-                               "%s plugin is %.3f seconds.",
+                               "`%s' plugin is %.3f seconds.",
                                rf->rf_name,
                                CDTIME_T_TO_DOUBLE (rf->rf_effective_interval));
  
                        rf->rf_next_read = now;
                }
  
-               DEBUG ("plugin_read_thread: Next read of the %s plugin at %.3f.",
+               DEBUG ("plugin_read_thread: Next read of the `%s' plugin at %.3f.",
                                rf->rf_name,
                                CDTIME_T_TO_DOUBLE (rf->rf_next_read));
  
@@@ -941,17 -959,17 +959,17 @@@ static void stop_write_threads (void) /
   */
  void plugin_set_dir (const char *dir)
  {
 -      if (plugindir != NULL)
 -              free (plugindir);
 +      sfree (plugindir);
  
        if (dir == NULL)
 -              plugindir = NULL;
 -      else if ((plugindir = strdup (dir)) == NULL)
        {
 -              char errbuf[1024];
 -              ERROR ("strdup failed: %s",
 -                              sstrerror (errno, errbuf, sizeof (errbuf)));
 +              plugindir = NULL;
 +              return;
        }
 +
 +      plugindir = strdup (dir);
 +      if (plugindir == NULL)
 +              ERROR ("plugin_set_dir: strdup(\"%s\") failed", dir);
  }
  
  static _Bool plugin_is_loaded (char const *name)
@@@ -1319,8 -1337,8 +1337,8 @@@ static void plugin_flush_timeout_callba
  
        if (cb == NULL) return;
  
 -      sfree(cb->name);
 -      sfree(cb);
 +      sfree (cb->name);
 +      sfree (cb);
  } /* static void plugin_flush_callback_free */
  
  static char *plugin_flush_callback_name (const char *name)
@@@ -1371,7 -1389,7 +1389,7 @@@ int plugin_register_flush (const char *
                if (cb == NULL)
                {
                        ERROR ("plugin_register_flush: malloc failed.");
 -                      sfree(flush_name);
 +                      sfree (flush_name);
                        return (-1);
                }
  
                if (cb->name == NULL)
                {
                        ERROR ("plugin_register_flush: strdup failed.");
 -                      sfree(cb);
 -                      sfree(flush_name);
 +                      sfree (cb);
 +                      sfree (flush_name);
                        return (-1);
                }
                cb->timeout = ctx.flush_timeout;
                        /* interval  = */ ctx.flush_interval,
                        /* user data = */ &ud);
  
 -              sfree(flush_name);
 +              sfree (flush_name);
                if (status != 0)
                {
 -                      sfree(cb->name);
 -                      sfree(cb);
 +                      sfree (cb->name);
 +                      sfree (cb);
                        return status;
                }
        }
@@@ -1469,7 -1487,7 +1487,7 @@@ int plugin_register_data_set (const dat
                        * ds->ds_num);
        if (ds_copy->ds == NULL)
        {
 -              free (ds_copy);
 +              sfree (ds_copy);
                return (-1);
        }
  
@@@ -1633,7 -1651,7 +1651,7 @@@ int plugin_unregister_flush (const cha
                if (flush_name != NULL)
                {
                        plugin_unregister_read(flush_name);
 -                      sfree(flush_name);
 +                      sfree (flush_name);
                }
        }
  
@@@ -1725,6 -1743,8 +1743,6 @@@ void plugin_init_all (void
                write_threads_num = 5;
        }
  
 -      start_write_threads ((size_t) write_threads_num);
 -
        if ((list_init == NULL) && (read_heap == NULL))
                return;
  
                le = le->next;
        }
  
 +      start_write_threads ((size_t) write_threads_num);
 +
        max_read_interval = global_option_get_time ("MaxReadInterval",
                        DEFAULT_MAX_READ_INTERVAL);
  
@@@ -2197,7 -2215,7 +2215,7 @@@ static int plugin_dispatch_values_inter
                         * don't get confused.. */
                        if (saved_values != NULL)
                        {
 -                              free (vl->values);
 +                              sfree (vl->values);
                                vl->values     = saved_values;
                                vl->values_len = saved_values_len;
                        }
         * confused.. */
        if (saved_values != NULL)
        {
 -              free (vl->values);
 +              sfree (vl->values);
                vl->values     = saved_values;
                vl->values_len = saved_values_len;
        }
@@@ -2712,11 -2730,7 +2730,11 @@@ int plugin_notification_meta_free (noti
  
      if (this->type == NM_TYPE_STRING)
      {
 -      free ((char *)this->nm_value.nm_string);
 +      /* Assign to a temporary variable to work around nm_string's const
 +       * modifier. */
 +      void *tmp = (void *) this->nm_value.nm_string;
 +
 +      sfree (tmp);
        this->nm_value.nm_string = NULL;
      }
      sfree (this);
@@@ -2823,7 -2837,7 +2841,7 @@@ static void *plugin_thread_start (void 
  
        plugin_set_ctx (plugin_thread->ctx);
  
 -      free (plugin_thread);
 +      sfree (plugin_thread);
  
        return start_routine (plugin_arg);
  } /* void *plugin_thread_start */
diff --combined src/snmp.c
@@@ -655,10 -655,7 +655,10 @@@ static int csnmp_config_add_host (oconf
  
    status = cf_util_get_string(ci, &hd->name);
    if (status != 0)
 +  {
 +    sfree (hd);
      return status;
 +  }
  
    hd->sess_handle = NULL;
    hd->interval = 0;
@@@ -927,7 -924,8 +927,7 @@@ static value_t csnmp_value_list_to_valu
      tmp_unsigned = (uint32_t) *vl->val.integer;
      tmp_signed = (int32_t) *vl->val.integer;
  
 -    if ((vl->type == ASN_INTEGER)
 -        || (vl->type == ASN_GAUGE))
 +    if (vl->type == ASN_INTEGER)
        prefer_signed = 1;
  
      DEBUG ("snmp plugin: Parsed int32 value is %"PRIu64".", tmp_unsigned);
@@@ -1783,8 -1781,6 +1783,6 @@@ static int csnmp_read_value (host_defin
  static int csnmp_read_host (user_data_t *ud)
  {
    host_definition_t *host;
-   cdtime_t time_start;
-   cdtime_t time_end;
    int status;
    int success;
    int i;
    if (host->interval == 0)
      host->interval = plugin_get_interval ();
  
-   time_start = cdtime ();
    if (host->sess_handle == NULL)
      csnmp_host_open_session (host);
  
        success++;
    }
  
-   time_end = cdtime ();
-   if ((time_end - time_start) > host->interval)
-   {
-     WARNING ("snmp plugin: Host `%s' should be queried every %.3f "
-         "seconds, but reading all values takes %.3f seconds.",
-         host->name,
-         CDTIME_T_TO_DOUBLE (host->interval),
-         CDTIME_T_TO_DOUBLE (time_end - time_start));
-   }
    if (success == 0)
      return (-1);