Let plugin_dispatch_values() set value_list.time in case of 'now'.
[collectd.git] / src / plugin.c
index 510f92b..cd7b108 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * collectd - src/plugin.c
- * Copyright (C) 2005-2008  Florian octo Forster
+ * Copyright (C) 2005-2009  Florian octo Forster
  *
  * 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
@@ -62,6 +62,9 @@ static llist_t *list_shutdown;
 static llist_t *list_log;
 static llist_t *list_notification;
 
+static fc_chain_t *pre_cache_chain = NULL;
+static fc_chain_t *post_cache_chain = NULL;
+
 static c_avl_tree_t *data_sets;
 
 static char *plugindir = NULL;
@@ -596,6 +599,7 @@ int plugin_unregister_notification (const char *name)
 
 void plugin_init_all (void)
 {
+       const char *chain_name;
        int (*callback) (void);
        llentry_t *le;
        int status;
@@ -603,6 +607,13 @@ void plugin_init_all (void)
        /* Init the value cache */
        uc_init ();
 
+       chain_name = global_option_get ("PreCacheChain");
+       pre_cache_chain = fc_chain_get_by_name (chain_name);
+
+       chain_name = global_option_get ("PostCacheChain");
+       post_cache_chain = fc_chain_get_by_name (chain_name);
+
+
        if ((list_init == NULL) && (list_read == NULL))
                return;
 
@@ -682,14 +693,19 @@ void plugin_read_all (void)
        pthread_mutex_unlock (&read_lock);
 } /* void plugin_read_all */
 
+/* Read function called when the `-T' command line argument is given. */
 int plugin_read_all_once (void)
 {
        llentry_t   *le;
        read_func_t *rf;
        int status;
+       int return_status = 0;
 
        if (list_read == NULL)
+       {
+               NOTICE ("No read-functions are registered.");
                return (0);
+       }
 
        for (le = llist_head (list_read);
             le != NULL;
@@ -701,12 +717,12 @@ int plugin_read_all_once (void)
                {
                        NOTICE ("read-function of plugin `%s' failed.",
                                le->key);
-                       return status;
+                       return_status = -1;
                }
        }
 
-       return (0);
-} /* void plugin_read_all_once */
+       return (return_status);
+} /* int plugin_read_all_once */
 
 int plugin_write (const char *plugin, /* {{{ */
                const data_set_t *ds, const value_list_t *vl)
@@ -828,6 +844,7 @@ void plugin_shutdown_all (void)
 
 int plugin_dispatch_values (value_list_t *vl)
 {
+       int status;
        static c_complain_t no_write_complaint = C_COMPLAIN_INIT_STATIC;
 
        data_set_t *ds;
@@ -857,6 +874,9 @@ int plugin_dispatch_values (value_list_t *vl)
                return (-1);
        }
 
+       if (vl->time == 0)
+               vl->time = time (NULL);
+
        DEBUG ("plugin_dispatch_values: time = %u; interval = %i; "
                        "host = %s; "
                        "plugin = %s; plugin_instance = %s; "
@@ -893,10 +913,36 @@ int plugin_dispatch_values (value_list_t *vl)
        escape_slashes (vl->type, sizeof (vl->type));
        escape_slashes (vl->type_instance, sizeof (vl->type_instance));
 
+       if (pre_cache_chain != NULL)
+       {
+               status = fc_process_chain (ds, vl, pre_cache_chain);
+               if (status < 0)
+               {
+                       WARNING ("plugin_dispatch_values: Running the "
+                                       "pre-cache chain failed with "
+                                       "status %i (%#x).",
+                                       status, status);
+               }
+               else if (status == FC_TARGET_STOP)
+                       return (0);
+       }
+
        /* Update the value cache */
        uc_update (ds, vl);
 
-       fc_process (ds, vl);
+       if (post_cache_chain != NULL)
+       {
+               status = fc_process_chain (ds, vl, post_cache_chain);
+               if (status < 0)
+               {
+                       WARNING ("plugin_dispatch_values: Running the "
+                                       "post-cache chain failed with "
+                                       "status %i (%#x).",
+                                       status, status);
+               }
+       }
+       else
+               fc_default_action (ds, vl);
 
        return (0);
 } /* int plugin_dispatch_values */