After last update of collectd, collectd deamon cuses core dumps because of zfs_arc plugin (floating point). There is correct patch which does not make collectd to crash. Fix: I'm attaching patch file which should be attached by previous update ------------------------------- patch ------------------------------- ------------------------------- patch ---------------------------------8xrnJ3uVnvCOT8vo4q4KbEZsjXCYxlFPrUQYX57QYElDph13 Content-Type: text/plain; name="file.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="file.diff" diff -ruN collectd/Makefile collectd.new/Makefile --- collectd/Makefile 2013-02-24 05:20:27.000000000 +0100 +++ collectd.new/Makefile 2013-02-26 15:33:50.000000000 +0100 @@ -3,7 +3,7 @@ PORTNAME= collectd PORTVERSION= 4.10.8 -PORTREVISION= 2 +PORTREVISION= 3 CATEGORIES= net-mgmt MASTER_SITES= http://collectd.org/files/ diff -ruN collectd/files/patch-src__zfs_arc.c collectd.new/files/patch-src__zfs_arc.c --- collectd/files/patch-src__zfs_arc.c 2013-02-23 17:34:16.000000000 +0100 +++ collectd.new/files/patch-src__zfs_arc.c 2013-02-26 15:29:28.000000000 +0100 @@ -1,5 +1,5 @@ --- src/zfs_arc.c.orig 2012-11-11 11:43:05.000000000 +0100 -+++ src/zfs_arc.c 2012-12-31 00:59:33.000000000 +0100 ++++ src/zfs_arc.c 2013-02-26 15:29:15.297851681 +0100 @@ -23,11 +23,58 @@ #include "common.h" #include "plugin.h" @@ -60,7 +60,85 @@ static void za_submit (const char* type, const char* type_instance, value_t* values, int values_len) { -@@ -90,42 +137,40 @@ +@@ -46,112 +93,136 @@ + + static void za_submit_gauge (const char* type, const char* type_instance, gauge_t value) + { +- value_t values[1]; ++ value_t vv; + +- values[0].gauge = value; ++ vv.gauge = value; + +- za_submit (type, type_instance, values, STATIC_ARRAY_SIZE(values)); ++ za_submit (type, type_instance, &vv, 1); + } + +-static void za_submit_size (gauge_t size, gauge_t size_target, gauge_t limit_min, gauge_t limit_max) ++static int za_read_derive (struct za_context *ctx, const char *kstat_value, ++ const char *type, const char *type_instance) + { +- value_t values[4]; ++ long long tmp; ++ value_t v; + +- values[0].gauge = size; +- values[1].gauge = size_target; +- values[2].gauge = limit_min; +- values[3].gauge = limit_max; ++ tmp = za_get_value (ctx, (char *)kstat_value); ++ if (tmp == -1LL) ++ { ++ ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); ++ return (-1); ++ } + +- za_submit ("arc_size", "", values, STATIC_ARRAY_SIZE(values)); ++ v.derive = (derive_t) tmp; ++ za_submit (type, type_instance, /* values = */ &v, /* values_num = */ 1); ++ return (0); + } + +-static void za_submit_bytes (counter_t read, counter_t write) ++static int za_read_gauge (struct za_context *ctx, const char *kstat_value, ++ const char *type, const char *type_instance) + { +- value_t values[2]; ++ long long tmp; ++ value_t v; + +- values[0].counter = read; +- values[1].counter = write; ++ tmp = za_get_value (ctx, (char *)kstat_value); ++ if (tmp == -1LL) ++ { ++ ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); ++ return (-1); ++ } + +- za_submit ("arc_l2_bytes", "", values, STATIC_ARRAY_SIZE(values)); ++ v.gauge = (gauge_t) tmp; ++ za_submit (type, type_instance, /* values = */ &v, /* values_num = */ 1); ++ return (0); + } + +-static void za_submit_counts (char *type_instance, counter_t demand_data, counter_t demand_metadata, +- counter_t prefetch_data, counter_t prefetch_metadata) ++static void za_submit_ratio (const char* type_instance, long long hits, long long misses) + { +- value_t values[4]; ++ gauge_t ratio = NAN; + +- values[0].counter = demand_data; +- values[1].counter = demand_metadata; +- values[2].counter = prefetch_data; +- values[3].counter = prefetch_metadata; ++ if ((hits > 0) || (misses > 0)) ++ ratio = hits / (hits + misses); + +- za_submit ("arc_counts", type_instance, values, STATIC_ARRAY_SIZE(values)); ++ za_submit_gauge ("cache_ratio", type_instance, ratio); + } static int za_read (void) { @@ -69,10 +147,9 @@ - counter_t demand_data_misses, demand_metadata_misses, prefetch_data_misses, prefetch_metadata_misses; - counter_t l2_read_bytes, l2_write_bytes; - kstat_t *ksp = NULL; -+ long long arcsize, targetsize, minlimit, maxlimit, hits, misses, l2_size, l2_hits, l2_misses; -+ long long demand_data_hits, demand_metadata_hits, prefetch_data_hits, prefetch_metadata_hits; -+ long long demand_data_misses, demand_metadata_misses, prefetch_data_misses, prefetch_metadata_misses; + long long l2_read_bytes, l2_write_bytes; ++ 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"); @@ -106,33 +183,65 @@ - l2_write_bytes = get_kstat_value(ksp, "l2_write_bytes"); - l2_hits = get_kstat_value(ksp, "l2_hits"); - l2_misses = get_kstat_value(ksp, "l2_misses"); -+ arcsize = za_get_value(&ctx, "size"); -+ targetsize = za_get_value(&ctx, "c"); -+ minlimit = za_get_value(&ctx, "c_min"); -+ maxlimit = za_get_value(&ctx, "c_max"); -+ -+ demand_data_hits = za_get_value(&ctx, "demand_data_hits"); -+ demand_metadata_hits = za_get_value(&ctx, "demand_metadata_hits"); -+ prefetch_data_hits = za_get_value(&ctx, "prefetch_data_hits"); -+ prefetch_metadata_hits = za_get_value(&ctx, "prefetch_metadata_hits"); -+ -+ demand_data_misses = za_get_value(&ctx, "demand_data_misses"); -+ demand_metadata_misses = za_get_value(&ctx, "demand_metadata_misses"); -+ prefetch_data_misses = za_get_value(&ctx, "prefetch_data_misses"); -+ prefetch_metadata_misses = za_get_value(&ctx, "prefetch_metadata_misses"); -+ -+ hits = za_get_value(&ctx, "hits"); -+ misses = za_get_value(&ctx, "misses"); -+ -+ l2_size = za_get_value(&ctx, "l2_size"); -+ l2_read_bytes = za_get_value(&ctx, "l2_read_bytes"); -+ l2_write_bytes = za_get_value(&ctx, "l2_write_bytes"); -+ l2_hits = za_get_value(&ctx, "l2_hits"); -+ l2_misses = za_get_value(&ctx, "l2_misses"); +- +- +- za_submit_size (arcsize, targetsize, minlimit, maxlimit); +- za_submit_gauge ("arc_l2_size", "", l2_size); +- +- za_submit_counts ("hits", demand_data_hits, demand_metadata_hits, +- prefetch_data_hits, prefetch_metadata_hits); +- za_submit_counts ("misses", demand_data_misses, demand_metadata_misses, +- prefetch_data_misses, prefetch_metadata_misses); ++ /* Sizes */ ++ za_read_gauge (&ctx, "size", "cache_size", "arc"); ++ za_read_gauge (&ctx, "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"); ++ ++ /* Issue indicators */ ++ za_read_derive (&ctx, "mutex_miss", "mutex_operation", "miss"); ++ za_read_derive (&ctx, "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 (&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 = 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 = za_get_value (&ctx, "l2_read_bytes"); ++ l2_io[1].derive = za_get_value (&ctx, "l2_write_bytes"); +- za_submit_gauge ("arc_ratio", "L1", hits / (hits + misses)); +- za_submit_gauge ("arc_ratio", "L2", l2_hits / (l2_hits + l2_misses)); +- +- za_submit_bytes (l2_read_bytes, l2_write_bytes); ++ za_submit ("io_octets", "L2", l2_io, /* num values = */ 2); - za_submit_size (arcsize, targetsize, minlimit, maxlimit); -@@ -146,12 +191,23 @@ + return (0); +-} ++} /* int za_read */ static int za_init (void) /* {{{ */ { How-To-Repeat: Just build current net-mgmt/collectd port.
Author: pawel Date: Thu Feb 28 15:33:25 2013 New Revision: 313095 URL: http://svnweb.freebsd.org/changeset/ports/313095 Log: Fix segfautls in ZFS code PR: ports/176440 Submitted by: Krzysztof Stryjek <ports@bsdserwis.com> (maintainer) Modified: head/net-mgmt/collectd/Makefile head/net-mgmt/collectd/files/patch-src__zfs_arc.c Modified: head/net-mgmt/collectd/Makefile ============================================================================== --- head/net-mgmt/collectd/Makefile Thu Feb 28 15:19:55 2013 (r313094) +++ head/net-mgmt/collectd/Makefile Thu Feb 28 15:33:25 2013 (r313095) @@ -3,7 +3,7 @@ PORTNAME= collectd PORTVERSION= 4.10.8 -PORTREVISION= 2 +PORTREVISION= 3 CATEGORIES= net-mgmt MASTER_SITES= http://collectd.org/files/ Modified: head/net-mgmt/collectd/files/patch-src__zfs_arc.c ============================================================================== --- head/net-mgmt/collectd/files/patch-src__zfs_arc.c Thu Feb 28 15:19:55 2013 (r313094) +++ head/net-mgmt/collectd/files/patch-src__zfs_arc.c Thu Feb 28 15:33:25 2013 (r313095) @@ -1,5 +1,5 @@ --- src/zfs_arc.c.orig 2012-11-11 11:43:05.000000000 +0100 -+++ src/zfs_arc.c 2012-12-31 00:59:33.000000000 +0100 ++++ src/zfs_arc.c 2013-02-26 15:29:15.297851681 +0100 @@ -23,11 +23,58 @@ #include "common.h" #include "plugin.h" @@ -60,7 +60,85 @@ static void za_submit (const char* type, const char* type_instance, value_t* values, int values_len) { -@@ -90,42 +137,40 @@ +@@ -46,112 +93,136 @@ + + static void za_submit_gauge (const char* type, const char* type_instance, gauge_t value) + { +- value_t values[1]; ++ value_t vv; + +- values[0].gauge = value; ++ vv.gauge = value; + +- za_submit (type, type_instance, values, STATIC_ARRAY_SIZE(values)); ++ za_submit (type, type_instance, &vv, 1); + } + +-static void za_submit_size (gauge_t size, gauge_t size_target, gauge_t limit_min, gauge_t limit_max) ++static int za_read_derive (struct za_context *ctx, const char *kstat_value, ++ const char *type, const char *type_instance) + { +- value_t values[4]; ++ long long tmp; ++ value_t v; + +- values[0].gauge = size; +- values[1].gauge = size_target; +- values[2].gauge = limit_min; +- values[3].gauge = limit_max; ++ tmp = za_get_value (ctx, (char *)kstat_value); ++ if (tmp == -1LL) ++ { ++ ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); ++ return (-1); ++ } + +- za_submit ("arc_size", "", values, STATIC_ARRAY_SIZE(values)); ++ v.derive = (derive_t) tmp; ++ za_submit (type, type_instance, /* values = */ &v, /* values_num = */ 1); ++ return (0); + } + +-static void za_submit_bytes (counter_t read, counter_t write) ++static int za_read_gauge (struct za_context *ctx, const char *kstat_value, ++ const char *type, const char *type_instance) + { +- value_t values[2]; ++ long long tmp; ++ value_t v; + +- values[0].counter = read; +- values[1].counter = write; ++ tmp = za_get_value (ctx, (char *)kstat_value); ++ if (tmp == -1LL) ++ { ++ ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); ++ return (-1); ++ } + +- za_submit ("arc_l2_bytes", "", values, STATIC_ARRAY_SIZE(values)); ++ v.gauge = (gauge_t) tmp; ++ za_submit (type, type_instance, /* values = */ &v, /* values_num = */ 1); ++ return (0); + } + +-static void za_submit_counts (char *type_instance, counter_t demand_data, counter_t demand_metadata, +- counter_t prefetch_data, counter_t prefetch_metadata) ++static void za_submit_ratio (const char* type_instance, long long hits, long long misses) + { +- value_t values[4]; ++ gauge_t ratio = NAN; + +- values[0].counter = demand_data; +- values[1].counter = demand_metadata; +- values[2].counter = prefetch_data; +- values[3].counter = prefetch_metadata; ++ if ((hits > 0) || (misses > 0)) ++ ratio = hits / (hits + misses); + +- za_submit ("arc_counts", type_instance, values, STATIC_ARRAY_SIZE(values)); ++ za_submit_gauge ("cache_ratio", type_instance, ratio); + } static int za_read (void) { @@ -69,10 +147,9 @@ - counter_t demand_data_misses, demand_metadata_misses, prefetch_data_misses, prefetch_metadata_misses; - counter_t l2_read_bytes, l2_write_bytes; - kstat_t *ksp = NULL; -+ long long arcsize, targetsize, minlimit, maxlimit, hits, misses, l2_size, l2_hits, l2_misses; -+ long long demand_data_hits, demand_metadata_hits, prefetch_data_hits, prefetch_metadata_hits; -+ long long demand_data_misses, demand_metadata_misses, prefetch_data_misses, prefetch_metadata_misses; + long long l2_read_bytes, l2_write_bytes; ++ 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"); @@ -106,33 +183,65 @@ - l2_write_bytes = get_kstat_value(ksp, "l2_write_bytes"); - l2_hits = get_kstat_value(ksp, "l2_hits"); - l2_misses = get_kstat_value(ksp, "l2_misses"); -+ arcsize = za_get_value(&ctx, "size"); -+ targetsize = za_get_value(&ctx, "c"); -+ minlimit = za_get_value(&ctx, "c_min"); -+ maxlimit = za_get_value(&ctx, "c_max"); -+ -+ demand_data_hits = za_get_value(&ctx, "demand_data_hits"); -+ demand_metadata_hits = za_get_value(&ctx, "demand_metadata_hits"); -+ prefetch_data_hits = za_get_value(&ctx, "prefetch_data_hits"); -+ prefetch_metadata_hits = za_get_value(&ctx, "prefetch_metadata_hits"); -+ -+ demand_data_misses = za_get_value(&ctx, "demand_data_misses"); -+ demand_metadata_misses = za_get_value(&ctx, "demand_metadata_misses"); -+ prefetch_data_misses = za_get_value(&ctx, "prefetch_data_misses"); -+ prefetch_metadata_misses = za_get_value(&ctx, "prefetch_metadata_misses"); -+ -+ hits = za_get_value(&ctx, "hits"); -+ misses = za_get_value(&ctx, "misses"); -+ -+ l2_size = za_get_value(&ctx, "l2_size"); -+ l2_read_bytes = za_get_value(&ctx, "l2_read_bytes"); -+ l2_write_bytes = za_get_value(&ctx, "l2_write_bytes"); -+ l2_hits = za_get_value(&ctx, "l2_hits"); -+ l2_misses = za_get_value(&ctx, "l2_misses"); +- +- +- za_submit_size (arcsize, targetsize, minlimit, maxlimit); +- za_submit_gauge ("arc_l2_size", "", l2_size); +- +- za_submit_counts ("hits", demand_data_hits, demand_metadata_hits, +- prefetch_data_hits, prefetch_metadata_hits); +- za_submit_counts ("misses", demand_data_misses, demand_metadata_misses, +- prefetch_data_misses, prefetch_metadata_misses); ++ /* Sizes */ ++ za_read_gauge (&ctx, "size", "cache_size", "arc"); ++ za_read_gauge (&ctx, "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"); ++ ++ /* Issue indicators */ ++ za_read_derive (&ctx, "mutex_miss", "mutex_operation", "miss"); ++ za_read_derive (&ctx, "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 (&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 = 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 = za_get_value (&ctx, "l2_read_bytes"); ++ l2_io[1].derive = za_get_value (&ctx, "l2_write_bytes"); +- za_submit_gauge ("arc_ratio", "L1", hits / (hits + misses)); +- za_submit_gauge ("arc_ratio", "L2", l2_hits / (l2_hits + l2_misses)); +- +- za_submit_bytes (l2_read_bytes, l2_write_bytes); ++ za_submit ("io_octets", "L2", l2_io, /* num values = */ 2); - za_submit_size (arcsize, targetsize, minlimit, maxlimit); -@@ -146,12 +191,23 @@ + return (0); +-} ++} /* int za_read */ static int za_init (void) /* {{{ */ { _______________________________________________ svn-ports-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-ports-all To unsubscribe, send any mail to "svn-ports-all-unsubscribe@freebsd.org"
State Changed From-To: open->closed Committed. Thanks!