typedef void kstat_t;
#endif
-static long long get_zfs_value(void * dummy __unused, const char *kstat_value)
+static long long get_zfs_value(kstat_t *dummy __attribute__((unused)),
+ char const *name)
{
+ char buffer[256];
long long value;
size_t valuelen = sizeof(value);
int rv;
- char *key;
-
- key = ssnprintf_alloc("%s%s", zfs_arcstat, kstat_value);
- if (key != NULL) {
- if (strlen(key) > 0) {
- rv = sysctlbyname(key, (void *)&value, &valuelen, NULL, (size_t)0);
- free(key);
- if (rv == 0)
- return (value);
- } else
- free(key);
- }
+
+ ssnprintf (buffer, sizeof (buffer), "%s%s", zfs_arcstat, name);
+ rv = sysctlbyname (buffer, (void *) &value, &valuelen,
+ /* new value = */ NULL, /* new length = */ (size_t) 0);
+ if (rv == 0)
+ return (value);
return (-1);
}
tmp = get_zfs_value (ksp, (char *)kstat_value);
if (tmp == -1LL)
{
- ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
+ WARNING ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
return (-1);
}
tmp = get_zfs_value (ksp, (char *)kstat_value);
if (tmp == -1LL)
{
- ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
+ WARNING ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
return (-1);
}
/* Sizes */
za_read_gauge (ksp, "size", "cache_size", "arc");
- za_read_gauge (ksp, "l2_size", "cache_size", "L2");
- /* Operations */
- za_read_derive (ksp, "allocated","cache_operation", "allocated");
+ /* 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");
+#if __FreeBSD__
+ za_read_derive (ksp, "allocated","cache_operation", "allocated");
+#if defined(__FreeBSD_version) && (__FreeBSD_version < 1002501)
+ /* stolen removed from sysctl kstat.zfs.misc.arcstats on FreeBSD 10.2+ */
za_read_derive (ksp, "stolen", "cache_operation", "stolen");
+#endif
+#endif
- /* Issue indicators */
- za_read_derive (ksp, "mutex_miss", "mutex_operations", "miss");
+ /* Issue indicators */
+ za_read_derive (ksp, "mutex_miss", "mutex_operations", "miss");
za_read_derive (ksp, "hash_collisions", "hash_collisions", "");
- /* Evictions */
+ /* Evictions */
za_read_derive (ksp, "evict_l2_cached", "cache_eviction", "cached");
za_read_derive (ksp, "evict_l2_eligible", "cache_eviction", "eligible");
za_read_derive (ksp, "evict_l2_ineligible", "cache_eviction", "ineligible");