diff options
author | madpilot <madpilot@FreeBSD.org> | 2016-02-09 18:31:16 +0800 |
---|---|---|
committer | madpilot <madpilot@FreeBSD.org> | 2016-02-09 18:31:16 +0800 |
commit | 87767c121eeba050f439f7f8044a48a460f44d5d (patch) | |
tree | 1ff20fa7ead4b1f59e2b4f524aaf3a65d5554d11 /net-mgmt | |
parent | 5cf555e8ea4fe6dfcc8b7ecdf178381ded07d41a (diff) | |
download | freebsd-ports-gnome-87767c121eeba050f439f7f8044a48a460f44d5d.tar.gz freebsd-ports-gnome-87767c121eeba050f439f7f8044a48a460f44d5d.tar.zst freebsd-ports-gnome-87767c121eeba050f439f7f8044a48a460f44d5d.zip |
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>
Diffstat (limited to 'net-mgmt')
-rw-r--r-- | net-mgmt/collectd5/Makefile | 1 | ||||
-rw-r--r-- | net-mgmt/collectd5/files/patch-src_disk.c | 115 |
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]; |