Skip to content

Commit d0ccbf8

Browse files
committed
pkg/cdi: don't crash if we fail to create fsnotify watch.
Don't crash in update() if we fail to create an fsnotify watch. This can happen if we have too many open files. In this case we now record a failure for all configured spec directories and in update we always trigger a refresh. If the process if ever able to create new file descriptors the cache becomes functional but in a 'always implicitly fully refreshed' mode instead of auto- refreshed. It's not entirely clear what is the best option to deal with a failed watch creation. Being out of file descriptors typically results in a cascading chain of errors which the process does not usually survive. This fix aims for minimal footprint. On failed watch creation it does not render the cache fully unusable. If the process is ever able to create new file descriptors again the cache also becomes functional, but instead of autorefreshed mode it will be in an 'always implicitly fully refreshed' mode. Signed-off-by: Krisztian Litkey <[email protected]>
1 parent 66aa9a8 commit d0ccbf8

File tree

1 file changed

+8
-0
lines changed

1 file changed

+8
-0
lines changed

pkg/cdi/cache.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,14 @@ func (w *watch) update(dirErrors map[string]error, removed ...string) bool {
564564
update bool
565565
)
566566

567+
// If we failed to create an fsnotify.Watcher we have a nil watcher here
568+
// (but with autoRefresh left on). One known case when this can happen is
569+
// if we have too many open files. In that case we always return true and
570+
// force a refresh.
571+
if w.watcher == nil {
572+
return true
573+
}
574+
567575
for dir, ok = range w.tracked {
568576
if ok {
569577
continue

0 commit comments

Comments
 (0)