Merge remote-tracking branch 'origin/pr/651'
[collectd.git] / src / zfs_arc.c
index c3c9cf9..f0d2323 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 2012  Aurelien Rougemont
  * Copyright (C) 2013  Xin Li
  * Copyright (C) 2014  Marc Fournier
+ * Copyright (C) 2014  Wilfried Goesgens
  *
  * 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
@@ -23,6 +24,7 @@
  *   Aurelien Rougemont <beorn at gandi.net>
  *   Xin Li <delphij at FreeBSD.org>
  *   Marc Fournier <marc.fournier at camptocamp.com>
+ *   Wilfried Goesgens <dothebart at citadel.org>
  **/
 
 #include "collectd.h"
@@ -51,7 +53,7 @@ static long long get_zfs_value(kstat_t *zfs_stats  __attribute__((unused)),
                return (-1);
        }
 
-       return ((long long int)e->value);
+       return (*(long long int*)e->value);
 }
 
 #elif !defined(__FreeBSD__) // Solaris
@@ -172,7 +174,7 @@ static int za_read (void)
 
 #if KERNEL_LINUX
        long long int *llvalues = NULL;
-       char FileContents[1024 * 10];
+       char file_contents[1024 * 10];
        char *fields[3];
        int numfields;
        ssize_t len;
@@ -184,15 +186,15 @@ static int za_read (void)
                return (-1);
        }
 
-       len = read_file_contents (ZOL_ARCSTATS_FILE, FileContents, sizeof(FileContents));
+       len = read_file_contents (ZOL_ARCSTATS_FILE, file_contents, sizeof(file_contents));
        if (len > 1)
        {
 
                int i=0;
-               char *pnl = FileContents;
+               char *pnl = file_contents;
                char *pnnl;
 
-               FileContents[len] = '\0';
+               file_contents[len] = '\0';
 
                while (pnl != NULL)
                {
@@ -206,21 +208,21 @@ static int za_read (void)
                {
                        llentry_t *e;
                        llvalues = malloc(sizeof(long long int) * i);
-                       i = 0;
+                       int j = 0;
 
-                       pnl = FileContents;
+                       pnl = file_contents;
                        while (pnl != NULL)
                        {
                                pnnl = strchr(pnl, '\n');
                                if (pnnl != NULL)
                                        *pnnl = '\0';
-                               
+
                                numfields = strsplit (pnl, fields, 4);
                                if (numfields == 3)
                                {
-                                       llvalues[i] = atoll (fields[2]);
+                                       llvalues[j] = atoll (fields[2]);
 
-                                       e = llentry_create (fields[0], (void *)llvalues[i]);
+                                       e = llentry_create (fields[0], &llvalues[j]);
                                        if (e == NULL)
                                        {
                                                ERROR ("zfs_arc plugin: `llentry_create' failed.");
@@ -229,6 +231,7 @@ static int za_read (void)
                                        {
                                                llist_append (ksp, e);
                                        }
+                                       j++;
                                }
                                pnl = pnnl;
                                if (pnl != NULL)
@@ -248,7 +251,14 @@ static int za_read (void)
 
        /* Sizes */
        za_read_gauge (ksp, "size",    "cache_size", "arc");
-       za_read_gauge (ksp, "l2_size", "cache_size", "L2");
+
+       /* The "l2_size" value has disappeared from Solaris some time in
+        * early 2013, and has only reappeared recently in Solaris 11.2.
+        * Stop trying if we ever fail to read it, so we don't spam the log.
+        */
+       static int l2_size_avail = 1;
+       if (l2_size_avail && za_read_gauge (ksp, "l2_size", "cache_size", "L2") != 0)
+               l2_size_avail = 0;
 
        /* Operations */
        za_read_derive (ksp, "deleted",  "cache_operation", "deleted");
@@ -298,7 +308,6 @@ static int za_read (void)
        }
        if (ksp != NULL)
        {
-          
                llist_destroy (ksp);
        }
 #endif