summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Göttsche <cgzones@googlemail.com>2020-11-02 14:46:42 +0100
committerChristian Göttsche <cgzones@googlemail.com>2020-11-02 14:46:42 +0100
commit0c1908832b50886cd1fa4ea296aa2570625bfa15 (patch)
treeb9e97e2a305317292111fa1d43405553e4cadbef
parent15652e7b8102e86b3405254405d8ee5d2a239004 (diff)
Handle data wraparounds in IO Meters
If the current data is smaller than the previous one, either by a retrieve error or a device removal or a original data wraparound, sanitize the value to zero. Fixes: #299
-rw-r--r--DiskIOMeter.c19
-rw-r--r--NetworkIOMeter.c28
2 files changed, 37 insertions, 10 deletions
diff --git a/DiskIOMeter.c b/DiskIOMeter.c
index 21696a33..e2d02524 100644
--- a/DiskIOMeter.c
+++ b/DiskIOMeter.c
@@ -53,14 +53,25 @@ static void DiskIOMeter_updateValues(Meter* this, char* buffer, int len) {
return;
}
- cached_read_diff = (data.totalBytesRead - cached_read_total) / 1024; /* Meter_humanUnit() expects unit in kilo */
+ if (data.totalBytesRead > cached_read_total) {
+ cached_read_diff = (data.totalBytesRead - cached_read_total) / 1024; /* Meter_humanUnit() expects unit in kilo */
+ } else {
+ cached_read_diff = 0;
+ }
cached_read_total = data.totalBytesRead;
- cached_write_diff = (data.totalBytesWritten - cached_write_total) / 1024; /* Meter_humanUnit() expects unit in kilo */
+ if (data.totalBytesWritten > cached_write_total) {
+ cached_write_diff = (data.totalBytesWritten - cached_write_total) / 1024; /* Meter_humanUnit() expects unit in kilo */
+ } else {
+ cached_write_diff = 0;
+ }
cached_write_total = data.totalBytesWritten;
- cached_utilisation_diff = 100 * (double)(data.totalMsTimeSpend - cached_msTimeSpend_total) / passedTimeInMs;
-
+ if (data.totalMsTimeSpend > cached_msTimeSpend_total) {
+ cached_utilisation_diff = 100 * (double)(data.totalMsTimeSpend - cached_msTimeSpend_total) / passedTimeInMs;
+ } else {
+ cached_utilisation_diff = 0.0;
+ }
cached_msTimeSpend_total = data.totalMsTimeSpend;
}
diff --git a/NetworkIOMeter.c b/NetworkIOMeter.c
index 51d8d5ca..a13e3f1c 100644
--- a/NetworkIOMeter.c
+++ b/NetworkIOMeter.c
@@ -46,18 +46,34 @@ static void NetworkIOMeter_updateValues(ATTR_UNUSED Meter* this, char* buffer, i
return;
}
- cached_rxb_diff = (bytesReceived - cached_rxb_total) / 1024; /* Meter_humanUnit() expects unit in kilo */
- cached_rxb_diff = 1000.0 * cached_rxb_diff / passedTimeInMs; /* convert to per second */
+ if (bytesReceived > cached_rxb_total) {
+ cached_rxb_diff = (bytesReceived - cached_rxb_total) / 1024; /* Meter_humanUnit() expects unit in kilo */
+ cached_rxb_diff = 1000.0 * cached_rxb_diff / passedTimeInMs; /* convert to per second */
+ } else {
+ cached_rxb_diff = 0;
+ }
cached_rxb_total = bytesReceived;
- cached_rxp_diff = packetsReceived - cached_rxp_total;
+ if (packetsReceived > cached_rxp_total) {
+ cached_rxp_diff = packetsReceived - cached_rxp_total;
+ } else {
+ cached_rxp_diff = 0;
+ }
cached_rxp_total = packetsReceived;
- cached_txb_diff = (bytesTransmitted - cached_txb_total) / 1024; /* Meter_humanUnit() expects unit in kilo */
- cached_txb_diff = 1000.0 * cached_txb_diff / passedTimeInMs; /* convert to per second */
+ if (bytesTransmitted > cached_txb_total) {
+ cached_txb_diff = (bytesTransmitted - cached_txb_total) / 1024; /* Meter_humanUnit() expects unit in kilo */
+ cached_txb_diff = 1000.0 * cached_txb_diff / passedTimeInMs; /* convert to per second */
+ } else {
+ cached_txb_diff = 0;
+ }
cached_txb_total = bytesTransmitted;
- cached_txp_diff = packetsTransmitted - cached_txp_total;
+ if (packetsTransmitted > cached_txp_total) {
+ cached_txp_diff = packetsTransmitted - cached_txp_total;
+ } else {
+ cached_txp_diff = 0;
+ }
cached_txp_total = packetsTransmitted;
}

© 2014-2024 Faster IT GmbH | imprint | privacy policy