Merge branch 'collectd-5.5'
[collectd.git] / src / disk.c
index f319c9c..b60fefa 100644 (file)
@@ -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;
@@ -727,7 +681,6 @@ static int disk_read (void)
        {
                char *disk_name;
                char *output_name;
-               char *alt_name;
 
                numfields = strsplit (buffer, fields, 32);
 
@@ -887,13 +840,10 @@ static int disk_read (void)
                output_name = disk_name;
 
 #if HAVE_LIBUDEV
-               alt_name = disk_udev_attr_name (handle_udev, disk_name,
-                               conf_udev_name_attr);
-#else
-               alt_name = NULL;
-#endif
+               char *alt_name = disk_udev_attr_name (handle_udev, disk_name, conf_udev_name_attr);
                if (alt_name != NULL)
                        output_name = alt_name;
+#endif
 
                if ((ds->read_bytes != 0) || (ds->write_bytes != 0))
                        disk_submit (output_name, "disk_octets",
@@ -915,8 +865,10 @@ static int disk_read (void)
                        submit_io_time (output_name, io_time, weighted_time);
                } /* if (is_disk) */
 
+#if HAVE_LIBUDEV
                /* release udev-based alternate name, if allocated */
-               free(alt_name);
+               sfree (alt_name);
+#endif
        } /* while (fgets (buffer, sizeof (buffer), fh) != NULL) */
 
 #if HAVE_LIBUDEV