src/data_provider.c: Call lcc_flush() before querying the data.
authorFlorian Forster <octo@noris.net>
Tue, 18 Jan 2011 15:49:40 +0000 (16:49 +0100)
committerFlorian Forster <octo@noris.net>
Tue, 18 Jan 2011 15:49:40 +0000 (16:49 +0100)
src/data_provider.c
src/graph_ident.c

index 0236443..73630f2 100644 (file)
@@ -1,6 +1,7 @@
 /**
  * collection4 - data_provider.c
  * Copyright (C) 2010  Florian octo Forster
+ * Copyright (C) 2011  noris network AG
  * 
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  **/
 
 #include <stdlib.h>
+#include <string.h>
 #include <errno.h>
+#include <assert.h>
 
 #include "data_provider.h"
 #include "dp_rrdtool.h"
+#include "graph_ident.h"
 
 #include <fcgiapp.h>
 #include <fcgi_stdio.h>
 
+#include <collectd/client.h>
+
 /* TODO: Turn this into an array for multiple data providers. */
 static data_provider_t *data_provider = NULL;
 
+static lcc_connection_t *collectd_connection = NULL;
+
+static int data_provider_ident_flush (const graph_ident_t *ident) /* {{{ */
+{
+  char *ident_str;
+  lcc_identifier_t ident_lcc;
+  int status;
+
+  if (ident == NULL)
+    return (EINVAL);
+
+  ident_str = ident_to_string (ident);
+  if (ident_str == NULL)
+    return (ENOMEM);
+
+  if (collectd_connection == NULL)
+  {
+    /* TODO: Make socket path configurable */
+    status = lcc_connect (/* path = */ "/var/run/collectd-unixsock",
+                   &collectd_connection);
+    if (status != 0)
+    {
+      assert (collectd_connection == NULL);
+      fprintf (stderr, "data_provider_ident_flush: lcc_connect failed "
+          "with status %i.\n", status);
+      return (status);
+    }
+    assert (collectd_connection != NULL);
+  }
+
+  memset (&ident_lcc, 0, sizeof (ident_lcc));
+  status = lcc_string_to_identifier (collectd_connection,
+      &ident_lcc, ident_str);
+  if (status != 0)
+  {
+    fprintf (stderr, "data_provider_ident_flush: lcc_string_to_identifier "
+        "failed: %s (%i)\n",
+        lcc_strerror (collectd_connection), status);
+    free (ident_str);
+    return (status);
+  }
+
+  status = lcc_flush (collectd_connection,
+      /* write-plugin = */ NULL,
+      /* identifier   = */ &ident_lcc,
+      /* timeout      = */ -1);
+  if (status != 0)
+  {
+    fprintf (stderr, "data_provider_ident_flush: lcc_flush (\"%s\") failed: %s (%i)\n",
+        ident_str, lcc_strerror (collectd_connection), status);
+    free (ident_str);
+
+    lcc_disconnect (collectd_connection);
+    collectd_connection = NULL;
+
+    return (status);
+  }
+
+  /* fprintf (stderr, "data_provider_ident_flush: lcc_flush (\"%s\") succeeded.\n", ident_str); */
+  free (ident_str);
+  return (0);
+} /* }}} int data_provider_ident_flush */
+
 int data_provider_config (const oconfig_item_t *ci) /* {{{ */
 {
   /* FIXME: Actually determine which data provider to call. */
@@ -87,6 +156,8 @@ int data_provider_get_ident_data (graph_ident_t *ident, /* {{{ */
   if (data_provider == NULL)
     return (EINVAL);
 
+  data_provider_ident_flush (ident);
+
   return (data_provider->get_ident_data (data_provider->private_data,
         ident, ds_name, begin, end, callback, user_data));
 } /* }}} int data_provider_get_ident_data */
index abf396d..5c513ec 100644 (file)
@@ -456,6 +456,9 @@ char *ident_to_string (const graph_ident_t *ident) /* {{{ */
 {
   char buffer[PATH_MAX];
 
+  if (ident == NULL)
+    return (NULL);
+
   buffer[0] = 0;
 
   strlcat (buffer, ident->host, sizeof (buffer));