Bug 176440 - net-mgmt/collectd: small modification for zfs statisticts
Summary: net-mgmt/collectd: small modification for zfs statisticts
Status: Closed FIXED
Alias: None
Product: Ports & Packages
Classification: Unclassified
Component: Individual Port(s) (show other bugs)
Version: Latest
Hardware: Any Any
: Normal Affects Only Me
Assignee: freebsd-ports-bugs (Nobody)
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-02-26 14:50 UTC by Krzysztof
Modified: 2013-02-28 15:40 UTC (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Krzysztof 2013-02-26 14:50:00 UTC
	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.
Comment 1 dfilter service freebsd_committer freebsd_triage 2013-02-28 15:33:35 UTC
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"
Comment 2 Pawel Pekala freebsd_committer freebsd_triage 2013-02-28 15:34:11 UTC
State Changed
From-To: open->closed

Committed. Thanks!