summaryrefslogtreecommitdiff
path: root/net-mgmt
diff options
context:
space:
mode:
authorGuido Falsi <madpilot@FreeBSD.org>2016-02-09 10:31:16 +0000
committerGuido Falsi <madpilot@FreeBSD.org>2016-02-09 10:31:16 +0000
commita10f160bc424c43d8d8308b07f8ea3685c64f6bf (patch)
tree1ff20fa7ead4b1f59e2b4f524aaf3a65d5554d11 /net-mgmt
parentUpdate to 0.20.5 (diff)
Add back part of a patch removed by mistake.
Allows disk module to report all disk statistics again. PR: 207049 Submitted by: me Reported by: Pierre Guinoiseau <pierre at guinoiseau.eu> Approved by: Krzysztof <ports at bsdserwis.com>
Notes
Notes: svn path=/head/; revision=408548
Diffstat (limited to 'net-mgmt')
-rw-r--r--net-mgmt/collectd5/Makefile1
-rw-r--r--net-mgmt/collectd5/files/patch-src_disk.c115
2 files changed, 116 insertions, 0 deletions
diff --git a/net-mgmt/collectd5/Makefile b/net-mgmt/collectd5/Makefile
index 0eef499e9fe6..9a4dddefe43e 100644
--- a/net-mgmt/collectd5/Makefile
+++ b/net-mgmt/collectd5/Makefile
@@ -3,6 +3,7 @@
PORTNAME= collectd
PORTVERSION= 5.5.1
+PORTREVISION= 1
CATEGORIES= net-mgmt
MASTER_SITES= https://collectd.org/files/ \
http://collectd.org/files/
diff --git a/net-mgmt/collectd5/files/patch-src_disk.c b/net-mgmt/collectd5/files/patch-src_disk.c
index 7f2810b8718d..fd0525ffa622 100644
--- a/net-mgmt/collectd5/files/patch-src_disk.c
+++ b/net-mgmt/collectd5/files/patch-src_disk.c
@@ -43,3 +43,118 @@
#elif HAVE_LIBKSTAT
kstat_t *ksp_chain;
+@@ -505,6 +527,114 @@ static int disk_read (void)
+ IOObjectRelease (disk_list);
+ /* #endif HAVE_IOKIT_IOKITLIB_H */
+
++#elif KERNEL_FREEBSD
++ int retry, dirty;
++
++ void *snap = NULL;
++ struct devstat *snap_iter;
++
++ struct gident *geom_id;
++
++ const char *disk_name;
++ long double read_time, write_time;
++
++ for (retry = 0, dirty = 1; retry < 5 && dirty == 1; retry++) {
++ if (snap != NULL)
++ geom_stats_snapshot_free(snap);
++
++ /* Get a fresh copy of stats snapshot */
++ snap = geom_stats_snapshot_get();
++ if (snap == NULL) {
++ ERROR("disk plugin: geom_stats_snapshot_get() failed.");
++ return (-1);
++ }
++
++ /* Check if we have dirty read from this snapshot */
++ dirty = 0;
++ geom_stats_snapshot_reset(snap);
++ while ((snap_iter = geom_stats_snapshot_next(snap)) != NULL) {
++ if (snap_iter->id == NULL)
++ continue;
++ geom_id = geom_lookupid(&geom_tree, snap_iter->id);
++
++ /* New device? refresh GEOM tree */
++ if (geom_id == NULL) {
++ geom_deletetree(&geom_tree);
++ if (geom_gettree(&geom_tree) != 0) {
++ ERROR("disk plugin: geom_gettree() failed");
++ geom_stats_snapshot_free(snap);
++ return (-1);
++ }
++ geom_id = geom_lookupid(&geom_tree, snap_iter->id);
++ }
++ /*
++ * This should be rare: the device come right before we take the
++ * snapshot and went away right after it. We will handle this
++ * case later, so don't mark dirty but silently ignore it.
++ */
++ if (geom_id == NULL)
++ continue;
++
++ /* Only collect PROVIDER data */
++ if (geom_id->lg_what != ISPROVIDER)
++ continue;
++
++ /* Only collect data when rank is 1 (physical devices) */
++ if (((struct gprovider *)(geom_id->lg_ptr))->lg_geom->lg_rank != 1)
++ continue;
++
++ /* Check if this is a dirty read quit for another try */
++ if (snap_iter->sequence0 != snap_iter->sequence1) {
++ dirty = 1;
++ break;
++ }
++ }
++ }
++
++ /* Reset iterator */
++ geom_stats_snapshot_reset(snap);
++ for (;;) {
++ snap_iter = geom_stats_snapshot_next(snap);
++ if (snap_iter == NULL)
++ break;
++
++ if (snap_iter->id == NULL)
++ continue;
++ geom_id = geom_lookupid(&geom_tree, snap_iter->id);
++ if (geom_id == NULL)
++ continue;
++ if (geom_id->lg_what != ISPROVIDER)
++ continue;
++ if (((struct gprovider *)(geom_id->lg_ptr))->lg_geom->lg_rank != 1)
++ continue;
++ /* Skip dirty reads, if present */
++ if (dirty && (snap_iter->sequence0 != snap_iter->sequence1))
++ continue;
++
++ disk_name = ((struct gprovider *)geom_id->lg_ptr)->lg_name;
++
++ if ((snap_iter->bytes[1] != 0) || (snap_iter->bytes[2] != 0)) {
++ disk_submit(disk_name, "disk_octets",
++ (derive_t)snap_iter->bytes[1],
++ (derive_t)snap_iter->bytes[2]);
++ }
++
++ if ((snap_iter->operations[1] != 0) || (snap_iter->operations[2] != 0)) {
++ disk_submit(disk_name, "disk_ops",
++ (derive_t)snap_iter->operations[1],
++ (derive_t)snap_iter->operations[2]);
++ }
++
++ read_time = devstat_compute_etime(&snap_iter->duration[DEVSTAT_READ], NULL);
++ write_time = devstat_compute_etime(&snap_iter->duration[DEVSTAT_WRITE], NULL);
++ if ((read_time != 0) || (write_time != 0)) {
++ disk_submit (disk_name, "disk_time",
++ (derive_t)(read_time*1000), (derive_t)(write_time*1000));
++ }
++ }
++ geom_stats_snapshot_free(snap);
++/* #endif KERNEL_FREEBSD */
++
+ #elif KERNEL_LINUX
+ FILE *fh;
+ char buffer[1024];