Plugin process: in Linux read the number of threads from
[collectd.git] / src / zfs_arc.c
index e32e829..f0d2323 100644 (file)
@@ -53,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
@@ -208,7 +208,7 @@ static int za_read (void)
                {
                        llentry_t *e;
                        llvalues = malloc(sizeof(long long int) * i);
-                       i = 0;
+                       int j = 0;
 
                        pnl = file_contents;
                        while (pnl != NULL)
@@ -220,9 +220,9 @@ static int za_read (void)
                                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.");
@@ -231,6 +231,7 @@ static int za_read (void)
                                        {
                                                llist_append (ksp, e);
                                        }
+                                       j++;
                                }
                                pnl = pnnl;
                                if (pnl != NULL)
@@ -250,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");