1
0
Fork 0
mirror of https://github.com/Luzifer/go_helpers.git synced 2024-10-18 06:14:21 +00:00

Fix logic bug in run loop, replace Stat with Lstat

in order to use a less expensive syscall when applied to symlinks like
in Kubernetes ConfigMap mounts

Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
Knut Ahlers 2023-03-18 15:26:18 +01:00
parent 39823d6cdd
commit d1f1007b33
Signed by: luzifer
GPG key ID: D91C3E91E4CAD6F5
2 changed files with 10 additions and 8 deletions

View file

@ -83,7 +83,7 @@ func newWatcher(filePath string, interval time.Duration, checks ...WatcherCheck)
stateCache: make(map[string]any),
}
// Initially run checks once
_, err := w.runStateChecks(true)
_, err := w.runStateChecks()
return w, errors.Wrap(err, "executing initial checks")
}
@ -108,7 +108,7 @@ func (w *Watcher) SetState(key string, value any) {
func (w *Watcher) loop() {
for {
evt, err := w.runStateChecks(false)
evt, err := w.runStateChecks()
if err != nil {
w.Err = err
break
@ -123,14 +123,16 @@ func (w *Watcher) loop() {
}
}
func (w *Watcher) runStateChecks(runAll bool) (WatcherEvent, error) {
func (w *Watcher) runStateChecks() (WatcherEvent, error) {
for _, c := range w.checks {
evt, err := c(w)
if err != nil {
return WatcherEventInvalid, errors.Wrap(err, "checking file state")
}
if evt == WatcherEventNoChange && !runAll {
if evt == WatcherEventNoChange {
// Watcher noticed no change, ask the next one. If one notices
// a change we will return that one.
continue
}

View file

@ -29,7 +29,7 @@ func WatcherCheckHash(hcf func() hash.Hash) WatcherCheck {
lastHash = v
}
if _, err := os.Stat(w.FilePath); errors.Is(err, fs.ErrNotExist) {
if _, err := os.Lstat(w.FilePath); errors.Is(err, fs.ErrNotExist) {
return WatcherEventInvalid, nil
}
@ -65,7 +65,7 @@ func WatcherCheckMtime(w *Watcher) (WatcherEvent, error) {
lastChange = v
}
s, err := os.Stat(w.FilePath)
s, err := os.Lstat(w.FilePath)
switch {
case err == nil:
// handle size change
@ -94,7 +94,7 @@ func WatcherCheckPresence(w *Watcher) (WatcherEvent, error) {
wasPresent = v
}
_, err := os.Stat(w.FilePath)
_, err := os.Lstat(w.FilePath)
if err != nil && !errors.Is(err, fs.ErrNotExist) {
// Some weird error occurred
return WatcherEventInvalid, errors.Wrap(err, "getting file stat")
@ -124,7 +124,7 @@ func WatcherCheckSize(w *Watcher) (WatcherEvent, error) {
knownSize = v
}
s, err := os.Stat(w.FilePath)
s, err := os.Lstat(w.FilePath)
switch {
case err == nil:
// handle size change