diff options
author | Beech Rintoul <beech@FreeBSD.org> | 2013-03-12 18:29:33 +0000 |
---|---|---|
committer | Beech Rintoul <beech@FreeBSD.org> | 2013-03-12 18:29:33 +0000 |
commit | ec78422e8b228db43a222dacfce8bfd29612645e (patch) | |
tree | 3a733ae51b6aea65775074b8123b9b850792bb95 /net-mgmt/collectd5/files/patch-src__zfs_arc.c | |
parent | - Update to 1.055 [1] (diff) |
- Update to 5.2.1
- Fix build with clang
PR: ports/176691
Submitted by: William Grzybowski <william88@gmail.com>
Approved by: Krzysztof Stryjek <ports@bsdserwis.com> (maintainer)
Notes
Notes:
svn path=/head/; revision=313994
Diffstat (limited to 'net-mgmt/collectd5/files/patch-src__zfs_arc.c')
-rw-r--r-- | net-mgmt/collectd5/files/patch-src__zfs_arc.c | 391 |
1 files changed, 198 insertions, 193 deletions
diff --git a/net-mgmt/collectd5/files/patch-src__zfs_arc.c b/net-mgmt/collectd5/files/patch-src__zfs_arc.c index 0de69f716df5..c8af7b8774e2 100644 --- a/net-mgmt/collectd5/files/patch-src__zfs_arc.c +++ b/net-mgmt/collectd5/files/patch-src__zfs_arc.c @@ -1,232 +1,237 @@ ---- src/zfs_arc.c.orig 2012-04-02 08:04:58.000000000 +0000 -+++ src/zfs_arc.c 2012-11-24 17:54:21.715129054 +0000 -@@ -25,11 +25,57 @@ - #include "common.h" - #include "plugin.h" - -+#if !defined(HAVE_LIBKSTAT) && defined(HAVE_SYSCTLBYNAME) -+#include <sys/sysctl.h> -+#endif +diff --git configure.in configure.in +index 4660787..54fd9d8 100644 +--- configure.in ++++ configure.in +@@ -4843,6 +4843,12 @@ then + plugin_users="yes" + fi + ++# FreeBSD ++if test "x$have_struct_kinfo_proc_freebsd" = "xyes" ++then ++ plugin_zfs_arc="yes" ++fi + - /* + m4_divert_once([HELP_ENABLE], [ + collectd plugins:]) + +diff --git src/zfs_arc.c src/zfs_arc.c +index aa90019..17e8513 100644 +--- src/zfs_arc.c ++++ src/zfs_arc.c +@@ -19,6 +19,8 @@ + * Authors: + * Anthony Dewhurst <dewhurst at gmail> + * Aurelien Rougemont <beorn at gandi.net> ++ * Brad Davis <brd at FreeBSD.org> ++ * William Grzybowski <william88 at gmail> + **/ + + #include "collectd.h" +@@ -29,7 +31,14 @@ * Global variables */ --static kstat_t *ksp; + +#if defined(HAVE_LIBKSTAT) ++static kstat_t *ksp; extern kstat_ctl_t *kc; -+#endif -+ -+/* -+ * Context -+ */ -+struct za_context { -+#if defined(HAVE_LIBKSTAT) -+ kstat_t *ksp; -+#endif -+}; ++#elif defined(HAVE_SYSCTLBYNAME) ++ typedef void kstat_t; ++# include <sys/types.h> ++# include <sys/sysctl.h> ++#endif /* HAVE_SYSCTLBYNAME */ + + static void za_submit (const char* type, const char* type_instance, value_t* values, int values_len) + { +@@ -57,37 +66,56 @@ static void za_submit_gauge (const char* type, const char* type_instance, gauge_ + static int za_read_derive (kstat_t *ksp, const char *kstat_value, + const char *type, const char *type_instance) + { +- long long tmp; +- value_t v; +- +- tmp = get_kstat_value (ksp, (char *)kstat_value); +- if (tmp == -1LL) +- { +- ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); +- return (-1); +- } +- +- v.derive = (derive_t) tmp; +- za_submit (type, type_instance, /* values = */ &v, /* values_num = */ 1); +- return (0); ++ long long tmp; ++ value_t v; + -+static int za_init_context(struct za_context *ctx) -+{ +#if defined(HAVE_LIBKSTAT) -+ get_kstat (&ctx->ksp, "zfs", 0, "arcstats"); -+ if (ctx->ksp == NULL) ++ tmp = get_kstat_value (ksp, (char *)kstat_value); ++ if (tmp == -1LL) + { -+ ERROR ("zfs_arc plugin: Cannot find zfs:0:arcstats kstat."); ++ ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); + return (-1); + } -+#endif -+ return 0; -+} -+ -+static long long za_get_value(struct za_context *ctx, const char* name) -+{ -+#if defined(HAVE_LIBKSTAT) -+ return get_kstat_value(ctx->ksp, name); +#elif defined(HAVE_SYSCTLBYNAME) -+ // kstat values are available on FreeBSD through sysctl -+ char fullname[512]; -+ long long result = 0; -+ size_t size = sizeof(result); -+ ssnprintf(fullname, sizeof(fullname), "kstat.zfs.misc.arcstats.%s", name); -+ if (sysctlbyname(fullname, &result, &size, NULL, 0) != 0 || size != sizeof(result)) -+ { -+ ERROR ("zfs_arc plugin: Cannot find stats using sysctl"); -+ result = 0; ++ size_t size; ++ size = sizeof(tmp); ++ if (sysctlbyname(kstat_value, &tmp, &size, NULL, 0) < 0) { ++ ERROR ("zfs_arc plugin: Reading sysctl \"%s\" failed.", kstat_value); ++ return (-1); + } -+ return result; -+#endif -+} - - static void za_submit (const char* type, const char* type_instance, value_t* values, int values_len) - { -@@ -54,13 +100,13 @@ - za_submit (type, type_instance, &vv, 1); - } - --static int za_read_derive (kstat_t *ksp, const char *kstat_value, -+static int za_read_derive (struct za_context *ctx, const char *kstat_value, - const char *type, const char *type_instance) - { - long long tmp; - value_t v; - -- tmp = get_kstat_value (ksp, kstat_value); -+ tmp = za_get_value (ctx, (char *)kstat_value); - if (tmp == -1LL) - { - ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); -@@ -69,15 +115,16 @@ - - v.derive = (derive_t) tmp; - za_submit (type, type_instance, /* values = */ &v, /* values_num = */ 1); -+ return (0); ++#endif /* HAVE_LIBKSTAT */ ++ ++ v.derive = (derive_t) tmp; ++ za_submit (type, type_instance, /* values = */ &v, /* values_num = */ 1); ++ return (0); } --static int za_read_gauge (kstat_t *ksp, const char *kstat_value, -+static int za_read_gauge (struct za_context *ctx, const char *kstat_value, + static int za_read_gauge (kstat_t *ksp, const char *kstat_value, const char *type, const char *type_instance) { - long long tmp; - value_t v; - -- tmp = get_kstat_value (ksp, kstat_value); -+ tmp = za_get_value (ctx, (char *)kstat_value); - if (tmp == -1LL) - { - ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); -@@ -86,18 +133,14 @@ - - v.gauge = (gauge_t) tmp; - za_submit (type, type_instance, /* values = */ &v, /* values_num = */ 1); -+ return (0); - } - --static void za_submit_ratio (const char* type_instance, gauge_t hits, gauge_t misses) -+static void za_submit_ratio (const char* type_instance, long long hits, long long misses) - { - gauge_t ratio = NAN; - -- if (!isfinite (hits) || (hits < 0.0)) -- hits = 0.0; -- if (!isfinite (misses) || (misses < 0.0)) -- misses = 0.0; +- long long tmp; +- value_t v; +- +- tmp = get_kstat_value (ksp, (char *)kstat_value); +- if (tmp == -1LL) +- { +- ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); +- return (-1); +- } - -- if ((hits != 0.0) || (misses != 0.0)) -+ if ((hits > 0) || (misses > 0)) - ratio = hits / (hits + misses); +- v.gauge = (gauge_t) tmp; +- za_submit (type, type_instance, /* values = */ &v, /* values_num = */ 1); +- return (0); ++ long long tmp; ++ value_t v; ++ ++#if defined(HAVE_LIBKSTAT) ++ tmp = get_kstat_value (ksp, (char *)kstat_value); ++ if (tmp == -1LL) ++ { ++ ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); ++ return (-1); ++ } ++ ++#elif defined(HAVE_SYSCTLBYNAME) ++ size_t size; ++ size = sizeof(tmp); ++ if (sysctlbyname(kstat_value, &tmp, &size, NULL, 0) < 0) { ++ ERROR ("zfs_arc plugin: Reading sysctl \"%s\" failed.", kstat_value); ++ return (-1); ++ } ++#endif /* HAVE_LIBKSTAT */ ++ ++ v.gauge = (gauge_t) tmp; ++ za_submit (type, type_instance, /* values = */ &v, /* values_num = */ 1); ++ return (0); + } + static void za_submit_ratio (const char* type_instance, gauge_t hits, gauge_t misses) +@@ -105,11 +133,67 @@ static void za_submit_ratio (const char* type_instance, gauge_t hits, gauge_t mi za_submit_gauge ("cache_ratio", type_instance, ratio); -@@ -105,56 +148,55 @@ - - static int za_read (void) - { -- gauge_t arc_hits, arc_misses, l2_hits, l2_misses; -+ long long arc_hits, arc_misses, l2_hits, l2_misses; - value_t l2_io[2]; -+ struct za_context ctx; - -- get_kstat (&ksp, "zfs", 0, "arcstats"); -- if (ksp == NULL) -+ if (za_init_context (&ctx) < 0) - { -- ERROR ("zfs_arc plugin: Cannot find zfs:0:arcstats kstat."); - return (-1); - } - - /* Sizes */ -- za_read_gauge (ksp, "size", "cache_size", "arc"); -- za_read_gauge (ksp, "l2_size", "cache_size", "L2"); -+ za_read_gauge (&ctx, "size", "cache_size", "arc"); -+ za_read_gauge (&ctx, "l2_size", "cache_size", "L2"); + } -- /* Operations */ -- za_read_derive (ksp, "allocated","cache_operation", "allocated"); -- za_read_derive (ksp, "deleted", "cache_operation", "deleted"); -- za_read_derive (ksp, "stolen", "cache_operation", "stolen"); -- -- /* Issue indicators */ -- za_read_derive (ksp, "mutex_miss", "mutex_operation", "miss"); -- za_read_derive (ksp, "hash_collisions", "hash_collisions", ""); +-static int za_read (void) ++#if defined(HAVE_SYSCTLBYNAME) ++static int za_read_freebsd (void) ++{ ++ // Sizes ++ za_read_gauge (NULL, "kstat.zfs.misc.arcstats.size", "cache_size", "arc"); ++ za_read_gauge (NULL, "kstat.zfs.misc.arcstats.l2_size", "cache_size", "L2"); ++ + /* Operations */ -+ za_read_derive (&ctx, "allocated","cache_operation", "allocated"); -+ za_read_derive (&ctx, "deleted", "cache_operation", "deleted"); -+ za_read_derive (&ctx, "stolen", "cache_operation", "stolen"); ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.allocated", "cache_operation", "allocated"); ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.deleted", "cache_operation", "deleted"); ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.stolen", "cache_operation", "stolen"); + + /* Issue indicators */ -+ za_read_derive (&ctx, "mutex_miss", "mutex_operation", "miss"); -+ za_read_derive (&ctx, "hash_collisions", "hash_collisions", ""); - -- /* 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"); ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.mutex_miss", "mutex_operation", "miss"); ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.hash_collisions", "hash_collisions", ""); ++ + /* Evictions */ -+ za_read_derive (&ctx, "evict_l2_cached", "cache_eviction", "cached"); -+ za_read_derive (&ctx, "evict_l2_eligible", "cache_eviction", "eligible"); -+ za_read_derive (&ctx, "evict_l2_ineligible", "cache_eviction", "ineligible"); - - /* Hits / misses */ -- za_read_derive (ksp, "demand_data_hits", "cache_result", "demand_data-hit"); -- za_read_derive (ksp, "demand_metadata_hits", "cache_result", "demand_metadata-hit"); -- za_read_derive (ksp, "prefetch_data_hits", "cache_result", "prefetch_data-hit"); -- za_read_derive (ksp, "prefetch_metadata_hits", "cache_result", "prefetch_metadata-hit"); -- za_read_derive (ksp, "demand_data_misses", "cache_result", "demand_data-miss"); -- za_read_derive (ksp, "demand_metadata_misses", "cache_result", "demand_metadata-miss"); -- za_read_derive (ksp, "prefetch_data_misses", "cache_result", "prefetch_data-miss"); -- za_read_derive (ksp, "prefetch_metadata_misses", "cache_result", "prefetch_metadata-miss"); -+ za_read_derive (&ctx, "demand_data_hits", "cache_result", "demand_data-hit"); -+ za_read_derive (&ctx, "demand_metadata_hits", "cache_result", "demand_metadata-hit"); -+ za_read_derive (&ctx, "prefetch_data_hits", "cache_result", "prefetch_data-hit"); -+ za_read_derive (&ctx, "prefetch_metadata_hits", "cache_result", "prefetch_metadata-hit"); -+ za_read_derive (&ctx, "demand_data_misses", "cache_result", "demand_data-miss"); -+ za_read_derive (&ctx, "demand_metadata_misses", "cache_result", "demand_metadata-miss"); -+ za_read_derive (&ctx, "prefetch_data_misses", "cache_result", "prefetch_data-miss"); -+ za_read_derive (&ctx, "prefetch_metadata_misses", "cache_result", "prefetch_metadata-miss"); - - /* Ratios */ -- arc_hits = (gauge_t) get_kstat_value(ksp, "hits"); -- arc_misses = (gauge_t) get_kstat_value(ksp, "misses"); -- l2_hits = (gauge_t) get_kstat_value(ksp, "l2_hits"); -- l2_misses = (gauge_t) get_kstat_value(ksp, "l2_misses"); -+ arc_hits = za_get_value (&ctx, "hits"); -+ arc_misses = za_get_value (&ctx, "misses"); -+ l2_hits = za_get_value (&ctx, "l2_hits"); -+ l2_misses = za_get_value (&ctx, "l2_misses"); - - za_submit_ratio ("arc", arc_hits, arc_misses); - za_submit_ratio ("L2", l2_hits, l2_misses); - - /* I/O */ -- l2_io[0].derive = get_kstat_value(ksp, "l2_read_bytes"); -- l2_io[1].derive = get_kstat_value(ksp, "l2_write_bytes"); -+ l2_io[0].derive = za_get_value (&ctx, "l2_read_bytes"); -+ l2_io[1].derive = za_get_value (&ctx, "l2_write_bytes"); ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.evict_l2_cached", "cache_eviction", "cached"); ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.evict_l2_eligible", "cache_eviction", "eligible"); ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.evict_l2_ineligible", "cache_eviction", "ineligible"); ++ ++ /* Hits / misses */ ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.demand_data_hits", "cache_result", "demand_data-hit"); ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.demand_metadata_hits", "cache_result", "demand_metadata-hit"); ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.prefetch_data_hits", "cache_result", "prefetch_data-hit"); ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.prefetch_metadata_hits", "cache_result", "prefetch_metadata-hit"); ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.demand_data_misses", "cache_result", "demand_data-miss"); ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.demand_metadata_misses", "cache_result", "demand_metadata-miss"); ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.prefetch_data_misses", "cache_result", "prefetch_data-miss"); ++ za_read_derive (NULL, "kstat.zfs.misc.arcstats.prefetch_metadata_misses", "cache_result", "prefetch_metadata-miss"); ++ ++ /* Ratios */ ++ gauge_t arc_hits; ++ gauge_t arc_misses; ++ gauge_t l2_hits; ++ gauge_t l2_misses; ++ value_t l2_io[2]; ++ ++ size_t size; ++ size = sizeof(arc_hits); ++ sysctlbyname("kstat.zfs.misc.arcstats.hits", &arc_hits, &size, NULL, 0); ++ sysctlbyname("kstat.zfs.misc.arcstats.misses", &arc_misses, &size, NULL, 0); ++ sysctlbyname("kstat.zfs.misc.arcstats.l2_hits", &l2_hits, &size, NULL, 0); ++ sysctlbyname("kstat.zfs.misc.arcstats.l2_misses", &l2_misses, &size, NULL, 0); ++ ++ za_submit_ratio ("arc", arc_hits, arc_misses); ++ za_submit_ratio ("L2", l2_hits, l2_misses); ++ ++ /* I/O */ ++ sysctlbyname("kstat.zfs.misc.arcstats.l2_read_bytes", &l2_io[0].derive, &size, NULL, 0); ++ sysctlbyname("kstat.zfs.misc.arcstats.l2_write_bytes", &l2_io[1].derive, &size, NULL, 0); ++ ++ za_submit ("io_octets", "L2", l2_io, /* num values = */ 2); ++ ++ return (0); ++} ++#elif defined(HAVE_LIBKSTAT) ++static int za_read_solaris (void) + { + gauge_t arc_hits, arc_misses, l2_hits, l2_misses; + value_t l2_io[2]; +- kstat_t *ksp = NULL; - za_submit ("io_octets", "L2", l2_io, /* num values = */ 2); + get_kstat (&ksp, "zfs", 0, "arcstats"); + if (ksp == NULL) +@@ -163,15 +247,20 @@ static int za_read (void) -@@ -163,14 +205,23 @@ + return (0); + } /* int za_read */ ++#endif static int za_init (void) /* {{{ */ { -- ksp = NULL; -- +#if defined(HAVE_LIBKSTAT) ++ ksp = NULL; ++ /* kstats chain already opened by update_kstat (using *kc), verify everything went fine. */ if (kc == NULL) { ERROR ("zfs_arc plugin: kstat chain control structure not available."); return (-1); } -+#elif defined(HAVE_SYSCTLBYNAME) -+ /* make sure ARC is available (arc_size is not null) */ -+ unsigned long long arc_size; -+ size_t size = sizeof(arc_size); -+ if (sysctlbyname("kstat.zfs.misc.arcstats.size", &arc_size, &size, NULL, 0) != 0 || arc_size == 0) -+ { -+ ERROR ("zfs_arc plugin: could not get ARC size using sysctl, is ARC enabled?"); -+ return (-1); -+ } -+#endif ++#endif /* HAVE_LIBKSTAT */ return (0); } /* }}} int za_init */ +@@ -179,7 +268,16 @@ static int za_init (void) /* {{{ */ + void module_register (void) + { + plugin_register_init ("zfs_arc", za_init); +- plugin_register_read ("zfs_arc", za_read); ++ ++#if defined(HAVE_LIBKSTAT) ++ plugin_register_read ("zfs_arc", za_read_solaris); ++#elif defined(HAVE_SYSCTLBYNAME) ++ plugin_register_read ("zfs_arc", za_read_freebsd); ++#else ++ ERROR ("Unable to determine which OS we are on"); ++ return (-1); ++#endif /* HAVE_SYSCTLBYNAME */ ++ + } /* void module_register */ + + /* vmi: set sw=8 noexpandtab fdm=marker : */ |