rrdtool plugin: Added a flush callback.
[collectd.git] / src / collectd.c
index 70223b7..4c9aafc 100644 (file)
 #include <sys/socket.h>
 #include <netdb.h>
 
+#include <pthread.h>
+
 #include "plugin.h"
 #include "configfile.h"
-#include "types_list.h"
 
 /*
  * Global variables
@@ -42,6 +43,15 @@ kstat_ctl_t *kc;
 
 static int loop = 0;
 
+static void *do_flush (void *arg)
+{
+       INFO ("Flushing all data.");
+       plugin_flush_all (-1);
+       INFO ("Finished flushing all data.");
+       pthread_exit (NULL);
+       return NULL;
+}
+
 static void sigIntHandler (int signal)
 {
        loop++;
@@ -52,6 +62,18 @@ static void sigTermHandler (int signal)
        loop++;
 }
 
+static void sigUsr1Handler (int signal)
+{
+       pthread_t      thread;
+       pthread_attr_t attr;
+
+       /* flushing the data might take a while,
+        * so it should be done asynchronously */
+       pthread_attr_init (&attr);
+       pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
+       pthread_create (&thread, &attr, do_flush, NULL);
+}
+
 static int init_hostname (void)
 {
        const char *str;
@@ -88,7 +110,11 @@ static int init_hostname (void)
        status = getaddrinfo (hostname_g, NULL, &ai_hints, &ai_list);
        if (status != 0)
        {
-               ERROR ("getaddrinfo failed.");
+               ERROR ("Looking up \"%s\" failed. You have set the "
+                               "\"FQDNLookup\" option, but I cannot resolve "
+                               "my hostname to a fully qualified domain "
+                               "name. Please fix you network "
+                               "configuration.", hostname_g);
                return (-1);
        }
 
@@ -216,7 +242,7 @@ static void update_kstat (void)
 /* TODO
  * Remove all settings but `-f' and `-C'
  */
-static void exit_usage (char *name)
+static void exit_usage (void)
 {
        printf ("Usage: "PACKAGE" [OPTIONS]\n\n"
                        
@@ -260,7 +286,6 @@ static int do_init (void)
        }
 #endif
 
-       read_types_list ();
        plugin_init_all ();
 
        return (0);
@@ -290,7 +315,7 @@ static int do_loop (void)
 #endif
 
                /* Issue all plugins */
-               plugin_read_all (&loop);
+               plugin_read_all ();
 
                if (gettimeofday (&tv_now, NULL) < 0)
                {
@@ -365,6 +390,7 @@ int main (int argc, char **argv)
 {
        struct sigaction sigIntAction;
        struct sigaction sigTermAction;
+       struct sigaction sigUsr1Action;
        char *configfile = CONFIGFILE;
        int test_config  = 0;
        const char *basedir;
@@ -406,7 +432,7 @@ int main (int argc, char **argv)
 #endif /* COLLECT_DAEMON */
                        case 'h':
                        default:
-                               exit_usage (argv[0]);
+                               exit_usage ();
                } /* switch (c) */
        } /* while (1) */
 
@@ -517,6 +543,10 @@ int main (int argc, char **argv)
        sigTermAction.sa_handler = sigTermHandler;
        sigaction (SIGTERM, &sigTermAction, NULL);
 
+       memset (&sigUsr1Action, '\0', sizeof (sigUsr1Action));
+       sigUsr1Action.sa_handler = sigUsr1Handler;
+       sigaction (SIGUSR1, &sigUsr1Action, NULL);
+
        /*
         * run the actual loops
         */