From: Colin Patrick McCabe <cmcc...@alumni.cmu.edu>

The CSV plugin uses a relatively small output buffer. If you have a large
dataset, you'll always get error -1 because the line length will be too
long.

This patch allocates a larger buffer.

Signed-off-by: Colin McCabe <colin.mcc...@dreamhost.com>
---
 src/csv.c |   31 +++++++++++++++++++------------
 1 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/src/csv.c b/src/csv.c
index 87a7b4e..f626fa7 100644
--- a/src/csv.c
+++ b/src/csv.c
@@ -259,12 +259,14 @@ static int csv_config (const char *key, const char *value)
        return (0);
 } /* int csv_config */
 
+#define CSV_BUF_LEN 4096
+
 static int csv_write (const data_set_t *ds, const value_list_t *vl,
                user_data_t __attribute__((unused)) *user_data)
 {
        struct stat  statbuf;
        char         filename[512];
-       char         values[512];
+       char         *values = NULL;
        FILE        *csv;
        int          csv_fd;
        struct flock fl;
@@ -272,16 +274,17 @@ static int csv_write (const data_set_t *ds, const 
value_list_t *vl,
 
        if (0 != strcmp (ds->type, vl->type)) {
                ERROR ("csv plugin: DS type does not match value list type");
-               return -1;
+               goto fail;
        }
 
        if (value_list_to_filename (filename, sizeof (filename), ds, vl) != 0)
-               return (-1);
+               goto fail;
 
        DEBUG ("csv plugin: csv_write: filename = %s;", filename);
 
-       if (value_list_to_string (values, sizeof (values), ds, vl) != 0)
-               return (-1);
+       values = malloc(CSV_BUF_LEN);
+       if (value_list_to_string (values, CSV_BUF_LEN, ds, vl) != 0)
+               goto fail;
 
        if (use_stdio)
        {
@@ -290,7 +293,7 @@ static int csv_write (const data_set_t *ds, const 
value_list_t *vl,
                escape_string (filename, sizeof (filename));
 
                /* Replace commas by colons for PUTVAL compatible output. */
-               for (i = 0; i < sizeof (values); i++)
+               for (i = 0; i < CSV_BUF_LEN; i++)
                {
                        if (values[i] == 0)
                                break;
@@ -303,6 +306,7 @@ static int csv_write (const data_set_t *ds, const 
value_list_t *vl,
                         filename,
                         CDTIME_T_TO_DOUBLE (vl->interval),
                         values);
+               sfree(values);
                return (0);
        }
 
@@ -311,7 +315,7 @@ static int csv_write (const data_set_t *ds, const 
value_list_t *vl,
                if (errno == ENOENT)
                {
                        if (csv_create_file (filename, ds))
-                               return (-1);
+                               goto fail;
                }
                else
                {
@@ -319,14 +323,14 @@ static int csv_write (const data_set_t *ds, const 
value_list_t *vl,
                        ERROR ("stat(%s) failed: %s", filename,
                                        sstrerror (errno, errbuf,
                                                sizeof (errbuf)));
-                       return (-1);
+                       goto fail;
                }
        }
        else if (!S_ISREG (statbuf.st_mode))
        {
                ERROR ("stat(%s): Not a regular file!",
                                filename);
-               return (-1);
+               goto fail;
        }
 
        csv = fopen (filename, "a");
@@ -335,7 +339,7 @@ static int csv_write (const data_set_t *ds, const 
value_list_t *vl,
                char errbuf[1024];
                ERROR ("csv plugin: fopen (%s) failed: %s", filename,
                                sstrerror (errno, errbuf, sizeof (errbuf)));
-               return (-1);
+               goto fail;
        }
        csv_fd = fileno (csv);
 
@@ -353,7 +357,7 @@ static int csv_write (const data_set_t *ds, const 
value_list_t *vl,
                ERROR ("csv plugin: flock (%s) failed: %s", filename,
                                sstrerror (errno, errbuf, sizeof (errbuf)));
                fclose (csv);
-               return (-1);
+               goto fail;
        }
 
        fprintf (csv, "%s\n", values);
@@ -361,8 +365,11 @@ static int csv_write (const data_set_t *ds, const 
value_list_t *vl,
        /* The lock is implicitely released. I we don't release it explicitely
         * because the `FILE *' may need to flush a cache first */
        fclose (csv);
-
+       sfree(values);
        return (0);
+fail:
+       sfree(values);
+       return (-1);
 } /* int csv_write */
 
 void module_register (void)
-- 
1.7.2.5


_______________________________________________
collectd mailing list
collectd@verplant.org
http://mailman.verplant.org/listinfo/collectd

Reply via email to