lib/update_servers.go (94 lines of code) (raw):

/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ package dhcplb import ( "time" "github.com/golang/glog" ) func (s *Server) startUpdatingServerList() { glog.Infof("Starting to update server list...") go s.updateServersContinuous() } func (s *Server) updateServersContinuous() { for { config := s.GetConfig() stable, err := config.HostSourcer.GetStableServers() if err != nil { glog.Error(err) } else { glog.Infof("Adding %d servers to the stable servers list", len(stable)) if len(stable) > 0 { s.handleUpdatedList(s.stableServers, stable) err = config.Algorithm.UpdateStableServerList(stable) if err != nil { glog.Errorf("Error updating stable server list: %s", err) } else { s.stableServers = stable } } } rc, err := config.HostSourcer.GetRCServers() if err != nil { glog.Error(err) } else { glog.Infof("Adding %d servers to the list of RC servers", len(rc)) if len(rc) > 0 { s.handleUpdatedList(s.rcServers, rc) err = config.Algorithm.UpdateRCServerList(rc) if err != nil { glog.Errorf("Error updating RC server list: %s", err) } else { s.rcServers = rc } } } <-time.NewTimer(config.ServerUpdateInterval).C } } func (s *Server) handleUpdatedList(old, new []*DHCPServer) { added, removed := diffServersList(old, new) if len(added) > 0 || len(removed) > 0 { glog.Info("Server list updated") } } type serverKey struct { // have to store address as string otherwise serverKey can't be used as map key Address string Port int } func diffServersList(original, updated []*DHCPServer) (added, removed []*DHCPServer) { added = make([]*DHCPServer, 0) removed = make([]*DHCPServer, 0) // find servers that were not in original list originalMap := make(map[serverKey]bool) for _, s := range original { key := serverKey{ s.Address.String(), s.Port, } originalMap[key] = true } for _, new := range updated { key := serverKey{ new.Address.String(), new.Port, } if _, ok := originalMap[key]; !ok { added = append(added, new) } } // find servers that are no longer in the new list newMap := make(map[serverKey]bool) for _, s := range updated { key := serverKey{ s.Address.String(), s.Port, } newMap[key] = true } for _, old := range original { key := serverKey{ old.Address.String(), old.Port, } if _, ok := newMap[key]; !ok { removed = append(removed, old) } } return added, removed }