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.
This commit is contained in:
Andreas Fuchs 2022-08-04 21:09:55 -04:00 committed by GitHub
parent 1625848c5d
commit d33d18e535
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -76,14 +76,7 @@ func readData(device string) (gjson.Result, error) {
if _, err := os.Stat(device); err == nil { if _, err := os.Stat(device); err == nil {
cacheValue, cacheOk := jsonCache[device] cacheValue, cacheOk := jsonCache[device]
timeToScan := false if !cacheOk || time.Now().After(cacheValue.LastCollect.Add(options.SMARTctl.CollectPeriodDuration)) {
if cacheOk {
timeToScan = time.Now().After(cacheValue.LastCollect.Add(options.SMARTctl.CollectPeriodDuration))
} else {
timeToScan = true
}
if timeToScan {
json, ok := readSMARTctl(device) json, ok := readSMARTctl(device)
if ok { if ok {
jsonCache[device] = JSONCache{JSON: json, LastCollect: time.Now()} 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("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) return gjson.Parse("{}"), fmt.Errorf("Device %s unavialable", device)
} }