From d33d18e5355f0443f7cce31e7c8b34e13254e88a Mon Sep 17 00:00:00 2001 From: Andreas Fuchs Date: Thu, 4 Aug 2022 21:09:55 -0400 Subject: [PATCH] Return the cached value if it's not time to scan again yet (#18) * Return the cached value if it's not time to scan again yet This should ensure that if we have a valid value cached (which ought to be every time after the first scan), we return it as metrics. This fixes the crashes that would happen if queries happened earlier than the re-scan interval allowed. * Address review feedback: Shorten the time-to-scan logic We can express this in a single if statement, so it takes fewer lines to do the "should we check again" check. --- readjson.go | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/readjson.go b/readjson.go index a11a452..e256399 100644 --- a/readjson.go +++ b/readjson.go @@ -76,14 +76,7 @@ func readData(device string) (gjson.Result, error) { if _, err := os.Stat(device); err == nil { cacheValue, cacheOk := jsonCache[device] - timeToScan := false - if cacheOk { - timeToScan = time.Now().After(cacheValue.LastCollect.Add(options.SMARTctl.CollectPeriodDuration)) - } else { - timeToScan = true - } - - if timeToScan { + if !cacheOk || time.Now().After(cacheValue.LastCollect.Add(options.SMARTctl.CollectPeriodDuration)) { json, ok := readSMARTctl(device) if ok { jsonCache[device] = JSONCache{JSON: json, LastCollect: time.Now()} @@ -91,7 +84,7 @@ func readData(device string) (gjson.Result, error) { } return gjson.Parse("{}"), fmt.Errorf("smartctl returned bad data for device %s", device) } - return gjson.Parse("{}"), fmt.Errorf("Too early collect called for device %s", device) + return cacheValue.JSON, nil } return gjson.Parse("{}"), fmt.Errorf("Device %s unavialable", device) }