func()

in pkg/metrics/collector/pod_ip_metrics.go [385:439]


func (c *podIPMetricsCollector) setupDirectoryWatcher(dir string) error {
	if err := c.listIPAddresses(dir); err != nil {
		return err
	}
	watcher, err := fsnotify.NewWatcher()
	if err != nil {
		glog.Errorf("NewWatcher failed: %v", err)
		return err
	}

	c.reuseIPs.min = uint64(math.Inf(+1))
	c.reuseIPs.buckets = make(map[float64]uint64)
	for _, bound := range bucketKeys {
		c.reuseIPs.buckets[bound] = 0
	}
	c.reuseMap = make(map[string]*ipReuse)

	go func() {
		defer func() {
			watcher.Close()
			c.podIPMetricsWatcherIsInitialized = false
		}()

		for {
			select {
			case e, ok := <-watcher.Events:
				if !ok {
					glog.Error("watcher is not ok")
					return
				}
				if err := c.listIPAddresses(dir); err != nil { //nolint:govet
					return
				}
				// Only update the ip reuse mininum, average and histogram for IPv4.
				ok, f := getIPv4(e.Name)
				if ok {
					c.updateReuseIPStats(e, f)
				}

			case err, ok := <-watcher.Errors: //nolint:govet
				glog.Errorf("Received error from watcher %v, ok: %t", err, ok)
				if !ok {
					return
				}
			}
		}
	}()

	err = watcher.Add(dir)
	if err != nil {
		glog.Errorf("Failed to add watcher for directory %s: %v", dir, err)
	}
	c.podIPMetricsWatcherIsInitialized = true
	return nil
}