// stop stops the verification process func (vms *verifiedMasqueradeSet) stop() { log.Debug("Stop called") vms.stopCh <- nil log.Debug("Waiting for workers to finish") vms.wg.Wait() log.Debug("Stopped") }
func (vms *verifiedMasqueradeSet) feedCandidate(candidate *Masquerade) bool { select { case <-vms.stopCh: log.Debug("Received stop, not feeding any further") return false case vms.candidatesCh <- candidate: log.Debug("Fed candidate") return true } }
func (server *Server) startServingStatsIfNecessary() bool { if server.StatServer != nil { log.Debugf("Serving stats at address: %s", server.StatServer.Addr) go server.StatServer.ListenAndServe() return true } else { log.Debug("Not serving stats (no statsaddr specified)") return false } }
// On windows, make sure that flashlight stops running if its parent // process has stopped. This is necessary on Windows, where child processes // don't tend to get terminated it the parent process dies unexpectedly. func init() { go func() { if *parentPID == 0 { log.Errorf("No parent PID specified, not terminating when orphaned") } parent, _ := os.FindProcess(*parentPID) if parent == nil { log.Errorf("No parent, not terminating when orphaned") return } log.Debugf("Waiting for parent %d to terminate", *parentPID) parent.Wait() log.Debug("Parent no longer running, terminating") os.Exit(0) }() }
// Configure updates the client's configuration. Configure can be called // before or after ListenAndServe, and can be called multiple times. The // optional enproxyConfigs parameter allows explicitly specifying enproxy // configurations for the servers in ClientConfig in lieu of building them based // on the ServerInfo in ClientConfig (mostly useful for testing). func (client *Client) Configure(cfg *ClientConfig, enproxyConfigs []*enproxy.Config) { client.cfgMutex.Lock() defer client.cfgMutex.Unlock() log.Debug("Configure() called") if client.cfg != nil { if reflect.DeepEqual(client.cfg, cfg) { log.Debugf("Client configuration unchanged") return } else { log.Debugf("Client configuration changed") } } else { log.Debugf("Client configuration initialized") } client.cfg = cfg if client.verifiedSets != nil { // Stop old verifications for _, verifiedSet := range client.verifiedSets { go verifiedSet.stop() } } // Set up new verified masquerade sets client.verifiedSets = make(map[string]*verifiedMasqueradeSet) for key, masqueradeSet := range cfg.MasqueradeSets { testServer := cfg.highestQosServer(key) if testServer != nil { client.verifiedSets[key] = newVerifiedMasqueradeSet(testServer, masqueradeSet) } } // Close existing servers if client.servers != nil { for _, server := range client.servers { server.close() } } // Configure servers client.servers = make([]*server, len(cfg.Servers)) i := 0 for _, serverInfo := range cfg.Servers { var enproxyConfig *enproxy.Config if enproxyConfigs != nil { enproxyConfig = enproxyConfigs[i] } client.servers[i] = serverInfo.buildServer( cfg.DumpHeaders, client.verifiedSets[serverInfo.MasqueradeSet], enproxyConfig) i = i + 1 } // Calculate total server weights client.totalServerWeights = 0 for _, server := range client.servers { client.totalServerWeights = client.totalServerWeights + server.info.Weight } }