// monitorReachability is a hostMonitoringFunc responsible for seeing if // hosts are reachable or not. returns a slice of any errors that occur func monitorReachability(settings *evergreen.Settings) []error { evergreen.Logger.Logf(slogger.INFO, "Running reachability checks...") // used to store any errors that occur var errors []error // fetch all hosts that have not been checked recently // (> 10 minutes ago) threshold := time.Now().Add(-ReachabilityCheckInterval) hosts, err := host.Find(host.ByNotMonitoredSince(threshold)) if err != nil { errors = append(errors, fmt.Errorf("error finding hosts not"+ " monitored recently: %v", err)) return errors } // check all of the hosts. continue on error so that other hosts can be // checked successfully for _, host := range hosts { if err := checkHostReachability(host, settings); err != nil { errors = append(errors, fmt.Errorf("error checking reachability"+ " for host %v: %v", host.Id, err)) continue } } evergreen.Logger.Logf(slogger.INFO, "Finished running host reachability checks") return errors }
// monitorReachability is a hostMonitoringFunc responsible for seeing if // hosts are reachable or not. returns a slice of any errors that occur func monitorReachability(settings *evergreen.Settings) []error { evergreen.Logger.Logf(slogger.INFO, "Running reachability checks...") // used to store any errors that occur var errors []error // fetch all hosts that have not been checked recently // (> 10 minutes ago) threshold := time.Now().Add(-ReachabilityCheckInterval) hosts, err := host.Find(host.ByNotMonitoredSince(threshold)) if err != nil { errors = append(errors, fmt.Errorf("error finding hosts not monitored recently: %v", err)) return errors } workers := NumReachabilityWorkers if len(hosts) < workers { workers = len(hosts) } wg := sync.WaitGroup{} wg.Add(workers) hostsChan := make(chan host.Host, workers) errChan := make(chan error, workers) for i := 0; i < workers; i++ { go func() { defer wg.Done() for host := range hostsChan { if err := checkHostReachability(host, settings); err != nil { errChan <- err } } }() } errDone := make(chan struct{}) go func() { defer close(errDone) for err := range errChan { errors = append(errors, fmt.Errorf("error checking reachability: %v", err)) } }() // check all of the hosts. continue on error so that other hosts can be // checked successfully for _, host := range hosts { hostsChan <- host } close(hostsChan) wg.Wait() close(errChan) <-errDone return errors }