X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fdisk.c;h=2026580aad2797e6282b4ac67b95fa34cf4a0513;hb=8f6aa6970bf787e6a11e095322af3338ec781d78;hp=6675534d0cefac7d4087424ecebbb4afa71aea3f;hpb=a74c2568f9d56cbe947b266aade0352ba1939a66;p=collectd.git diff --git a/src/disk.c b/src/disk.c index 6675534d..2026580a 100644 --- a/src/disk.c +++ b/src/disk.c @@ -23,9 +23,9 @@ #include "collectd.h" -#include "common.h" #include "plugin.h" -#include "utils_ignorelist.h" +#include "utils/common/common.h" +#include "utils/ignorelist/ignorelist.h" #if HAVE_MACH_MACH_TYPES_H #include @@ -59,9 +59,6 @@ #include #endif -#if HAVE_LIMITS_H -#include -#endif #ifndef UINT_MAX #define UINT_MAX 4294967295U #endif @@ -493,10 +490,10 @@ static int disk_read(void) { sstrncpy(disk_name, props_disk_name_bsd, sizeof(disk_name)); else { ERROR("disk plugin: can't find bsd disk name."); - snprintf(disk_name, sizeof(disk_name), "%i-%i", disk_major, disk_minor); + ssnprintf(disk_name, sizeof(disk_name), "%i-%i", disk_major, disk_minor); } } else - snprintf(disk_name, sizeof(disk_name), "%i-%i", disk_major, disk_minor); + ssnprintf(disk_name, sizeof(disk_name), "%i-%i", disk_major, disk_minor); DEBUG("disk plugin: disk_name = \"%s\"", disk_name); @@ -662,7 +659,7 @@ static int disk_read(void) { char buffer[1024]; char *fields[32]; - static unsigned int local_poll_count = 0; + static unsigned int poll_count = 0; derive_t read_sectors = 0; derive_t write_sectors = 0; @@ -685,17 +682,15 @@ static int disk_read(void) { return -1; } + poll_count++; while (fgets(buffer, sizeof(buffer), fh) != NULL) { - char *disk_name; - char *output_name; - int numfields = strsplit(buffer, fields, 32); /* need either 7 fields (partition) or at least 14 fields */ if ((numfields != 7) && (numfields < 14)) continue; - disk_name = fields[2]; + char *disk_name = fields[2]; for (ds = disklist, pre_ds = disklist; ds != NULL; pre_ds = ds, ds = ds->next) @@ -703,7 +698,7 @@ static int disk_read(void) { break; if (ds == NULL) { - if ((ds = (diskstats_t *)calloc(1, sizeof(diskstats_t))) == NULL) + if ((ds = calloc(1, sizeof(*ds))) == NULL) continue; if ((ds->name = strdup(disk_name)) == NULL) { @@ -715,7 +710,6 @@ static int disk_read(void) { disklist = ds; else pre_ds->next = ds; - ds->poll_count = local_poll_count; } is_disk = 0; @@ -817,14 +811,13 @@ static int disk_read(void) { } /* if (is_disk) */ - /* Don't write to the RRDs if we've just started.. */ - ds->poll_count++; - if (ds->poll_count <= 2) { - DEBUG("disk plugin: (ds->poll_count = %i) <= " - "(min_poll_count = 2); => Not writing.", - ds->poll_count); + /* Skip first cycle for newly-added disk */ + if (ds->poll_count == 0) { + DEBUG("disk plugin: (ds->poll_count = 0) => Skipping."); + ds->poll_count = poll_count; continue; } + ds->poll_count = poll_count; if ((read_ops == 0) && (write_ops == 0)) { DEBUG("disk plugin: ((read_ops == 0) && " @@ -832,7 +825,7 @@ static int disk_read(void) { continue; } - output_name = disk_name; + char *output_name = disk_name; #if HAVE_LIBUDEV_H char *alt_name = NULL; @@ -877,26 +870,27 @@ static int disk_read(void) { #endif } /* while (fgets (buffer, sizeof (buffer), fh) != NULL) */ - local_poll_count++; + /* Remove disks that have disappeared from diskstats */ for (ds = disklist, pre_ds = disklist; ds != NULL;) { - /* test if we have seen the disk in diskstats */ - if (ds->poll_count != local_poll_count) { - diskstats_t *old_ds = ds; - /* free the ds */ - if (pre_ds == disklist) { - /* first element */ - disklist = ds->next; - ds = disklist; - pre_ds = ds; - } else { - pre_ds->next = ds->next; - ds = ds->next; - } - free(old_ds); - } else { - pre_ds = ds; - ds = ds->next; - } + /* Disk exists */ + if (ds->poll_count == poll_count) { + pre_ds = ds; + ds = ds->next; + continue; + } + + /* Disk is missing, remove it */ + diskstats_t *missing_ds = ds; + if (ds == disklist) { + pre_ds = disklist = ds->next; + } else { + pre_ds->next = ds->next; + } + ds = ds->next; + + DEBUG("disk plugin: Disk %s disappeared.", missing_ds->name); + free(missing_ds->name); + free(missing_ds); } fclose(fh); /* #endif defined(KERNEL_LINUX) */ @@ -992,9 +986,8 @@ static int disk_read(void) { } if (numdisk != pnumdisk || stat_disk == NULL) { - if (stat_disk != NULL) - free(stat_disk); - stat_disk = (perfstat_disk_t *)calloc(numdisk, sizeof(perfstat_disk_t)); + free(stat_disk); + stat_disk = calloc(numdisk, sizeof(*stat_disk)); } pnumdisk = numdisk;