X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fdisk.c;h=8f8f370240ba2f99c48dcfdf2d0efe4b77d05521;hb=0d9a0eb065fda6f89fc597e760ae56edd47337d9;hp=f319c9c6da408808b08c80870c4aad72e712ac7c;hpb=1d7fbcf1832d4a9887a0bc7dca1896564adeca67;p=collectd.git diff --git a/src/disk.c b/src/disk.c index f319c9c6..8f8f3702 100644 --- a/src/disk.c +++ b/src/disk.c @@ -112,8 +112,6 @@ typedef struct diskstats static diskstats_t *disklist; /* #endif KERNEL_LINUX */ #elif KERNEL_FREEBSD -static void *snap_previous; -static struct timespec tsnap_previous; static struct gmesh geom_tree; /* #endif KERNEL_FREEBSD */ @@ -244,12 +242,6 @@ static int disk_init (void) ERROR ("geom_stats_open() failed, returned %d", rv); return (-1); } - snap_previous = geom_stats_snapshot_get(); - if (snap_previous == NULL) { - ERROR ("geom_stats_snapshot_get() failed"); - return (-1); - } - geom_stats_snapshot_timestamp(snap_previous, &tsnap_previous); /* #endif KERNEL_FREEBSD */ #elif HAVE_LIBKSTAT @@ -538,47 +530,42 @@ static int disk_read (void) #elif KERNEL_FREEBSD int retry, dirty; - void *snap_present = NULL; - struct devstat *snap_present_iter, *snap_previous_iter; - struct timespec tsnap_present; + void *snap = NULL; + struct devstat *snap_iter; struct gident *geom_id; - double timedelta; - long double ld[11]; const char *disk_name; - derive_t read_bytes, write_bytes; - derive_t read_ops, write_ops; - derive_t read_time, write_time; + long double read_time, write_time; for (retry = 0, dirty = 1; retry < 5 && dirty == 1; retry++) { - if (snap_present != NULL) - geom_stats_snapshot_free(snap_present); + if (snap != NULL) + geom_stats_snapshot_free(snap); /* Get a fresh copy of stats snapshot */ - snap_present = geom_stats_snapshot_get(); - if (snap_present == NULL) { + 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_present); - while ((snap_present_iter = geom_stats_snapshot_next(snap_present)) != NULL) { - if (snap_present_iter->id == NULL) + 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_present_iter->id); + 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_present); + geom_stats_snapshot_free(snap); return (-1); } - geom_id = geom_lookupid(&geom_tree, snap_present_iter->id); + geom_id = geom_lookupid(&geom_tree, snap_iter->id); } /* * This should be rare: the device come right before we take the @@ -597,34 +584,23 @@ static int disk_read (void) continue; /* Check if this is a dirty read quit for another try */ - if (snap_present_iter->sequence0 != snap_present_iter->sequence1) { + if (snap_iter->sequence0 != snap_iter->sequence1) { dirty = 1; break; } } } - /* - * Now we have a snapshot that is either clean, or still dirty after 5 - * reads. - */ - geom_stats_snapshot_timestamp(snap_present, &tsnap_present); - timedelta = tsnap_present.tv_sec - tsnap_previous.tv_sec; - timedelta += (tsnap_present.tv_nsec - tsnap_previous.tv_nsec) * 1e-9; - tsnap_previous = tsnap_present; - - /* Reset iterators for both snapshots */ - geom_stats_snapshot_reset(snap_present); - geom_stats_snapshot_reset(snap_previous); + /* Reset iterator */ + geom_stats_snapshot_reset(snap); for (;;) { - snap_present_iter = geom_stats_snapshot_next(snap_present); - snap_previous_iter = geom_stats_snapshot_next(snap_previous); - if (snap_present_iter == NULL || snap_previous_iter == NULL) + snap_iter = geom_stats_snapshot_next(snap); + if (snap_iter == NULL) break; - if (snap_present_iter->id == NULL) + if (snap_iter->id == NULL) continue; - geom_id = geom_lookupid(&geom_tree, snap_present_iter->id); + geom_id = geom_lookupid(&geom_tree, snap_iter->id); if (geom_id == NULL) continue; if (geom_id->lg_what != ISPROVIDER) @@ -632,53 +608,31 @@ static int disk_read (void) if (((struct gprovider *)(geom_id->lg_ptr))->lg_geom->lg_rank != 1) continue; /* Skip dirty reads, if present */ - if (dirty && (snap_present_iter->sequence0 != snap_present_iter->sequence1)) + if (dirty && (snap_iter->sequence0 != snap_iter->sequence1)) continue; - devstat_compute_statistics(snap_present_iter, snap_previous_iter, timedelta, - DSM_TRANSFERS_PER_SECOND, &ld[0], - - DSM_TRANSFERS_PER_SECOND_READ, &ld[1], - DSM_MB_PER_SECOND_READ, &ld[2], - DSM_MS_PER_TRANSACTION_READ, &ld[3], - - DSM_TRANSFERS_PER_SECOND_WRITE, &ld[4], - DSM_MB_PER_SECOND_WRITE, &ld[5], - DSM_MS_PER_TRANSACTION_WRITE, &ld[6], - - DSM_BUSY_PCT, &ld[7], - - DSM_TRANSFERS_PER_SECOND_FREE, &ld[8], - DSM_MB_PER_SECOND_FREE, &ld[9], - DSM_MS_PER_TRANSACTION_FREE, &ld[10], - DSM_NONE); - *snap_previous_iter = *snap_present_iter; - - /* Derive data to be submitted */ - read_ops = (derive_t)ld[1]; - write_ops = (derive_t)ld[4]; - read_bytes = (derive_t)(ld[2] * 1048576LL); - write_bytes = (derive_t)(ld[5] * 1048576LL); - read_time = (derive_t)ld[3]; - write_time = (derive_t)ld[6]; - disk_name = ((struct gprovider *)geom_id->lg_ptr)->lg_name; - if ((read_bytes != 0) || (write_bytes != 0)) + if ((snap_iter->bytes[DEVSTAT_READ] != 0) || (snap_iter->bytes[DEVSTAT_WRITE] != 0)) { disk_submit(disk_name, "disk_octets", - read_bytes, write_bytes); + (derive_t)snap_iter->bytes[DEVSTAT_READ], + (derive_t)snap_iter->bytes[DEVSTAT_WRITE]); + } - if ((read_ops != 0) || (write_ops != 0)) + if ((snap_iter->operations[DEVSTAT_READ] != 0) || (snap_iter->operations[DEVSTAT_WRITE] != 0)) { disk_submit(disk_name, "disk_ops", - read_ops, write_ops); + (derive_t)snap_iter->operations[DEVSTAT_READ], + (derive_t)snap_iter->operations[DEVSTAT_WRITE]); + } - if ((read_time != 0) || (write_time != 0)) + 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", - read_time, write_time); - - /* TODO: TRIM statistics collected but not reported. */ + (derive_t)(read_time*1000), (derive_t)(write_time*1000)); + } } - geom_stats_snapshot_free(snap_present); + geom_stats_snapshot_free(snap); #elif KERNEL_LINUX FILE *fh;