diff --git a/core/core.go b/core/core.go index 59841715..e9fd3882 100644 --- a/core/core.go +++ b/core/core.go @@ -34,7 +34,7 @@ type PluginRepos types.PluginRepos type Core struct { *types.Core - services []*Service + services map[int64]*Service } var ( @@ -51,8 +51,8 @@ func init() { func NewCore() *Core { CoreApp = &Core{Core: &types.Core{ Started: time.Now().UTC(), - }, - } + }} + CoreApp.services = make(map[int64]*Service) return CoreApp } @@ -204,9 +204,17 @@ func GetLocalIP() string { } // ServiceOrder will reorder the services based on 'order_id' (Order) -type ServiceOrder []*Service +type ServiceOrder map[int64]*Service // Sort interface for resroting the Services in order -func (c ServiceOrder) Len() int { return len(c) } -func (c ServiceOrder) Swap(i, j int) { c[i], c[j] = c[j], c[i] } -func (c ServiceOrder) Less(i, j int) bool { return c[i].Order < c[j].Order } +func (c ServiceOrder) Len() int { return len(c) } +func (c ServiceOrder) Swap(i, j int) { c[int64(i)], c[int64(j)] = c[int64(j)], c[int64(i)] } +func (c ServiceOrder) Less(i, j int) bool { + if c[int64(i)] == nil { + return false + } + if c[int64(j)] == nil { + return false + } + return c[int64(i)].Order < c[int64(j)].Order +} diff --git a/core/services.go b/core/services.go index ed177fe4..7fda60de 100644 --- a/core/services.go +++ b/core/services.go @@ -28,17 +28,15 @@ type Service struct { *database.ServiceObj } -func Services() []*Service { +func Services() map[int64]*Service { return CoreApp.services } // SelectService returns a *core.Service from in memory func SelectService(id int64) *Service { - for _, s := range Services() { - if s.Id == id { - s.UpdateStats() - return s - } + service := CoreApp.services[id] + if service != nil { + return service } return nil } @@ -57,8 +55,8 @@ func CheckinProcess(s database.Servicer) { // SelectAllServices returns a slice of *core.Service to be store on []*core.Services // should only be called once on startup. -func SelectAllServices(start bool) ([]*Service, error) { - var coreServices []*Service +func SelectAllServices(start bool) (map[int64]*Service, error) { + services := make(map[int64]*Service) if len(CoreApp.services) > 0 { return CoreApp.services, nil } @@ -78,13 +76,14 @@ func SelectAllServices(start bool) ([]*Service, error) { // collect initial service stats s.UpdateStats() - coreServices = append(coreServices, &Service{s}) + + services[s.Id] = &Service{s} } - CoreApp.services = coreServices + CoreApp.services = services reorderServices() - return coreServices, nil + return services, nil } func wrapFailures(f []*types.Failure) []*Failure { @@ -97,35 +96,24 @@ func wrapFailures(f []*types.Failure) []*Failure { // reorderServices will sort the services based on 'order_id' func reorderServices() { + fmt.Println("sorting: ", len(CoreApp.services)) sort.Sort(ServiceOrder(CoreApp.services)) } -// index returns a services index int for updating the []*core.Services slice -func index(s int64) int { - for k, service := range CoreApp.services { - if s == service.Id { - return k - } - } - return 0 -} - // updateService will update a service in the []*core.Services slice func updateService(s *Service) { - CoreApp.services[index(s.Id)] = s + CoreApp.services[s.Id] = s } // Delete will remove a service from the database, it will also end the service checking go routine func (s *Service) Delete() error { - i := index(s.Id) err := database.Delete(s) if err != nil { log.Errorln(fmt.Sprintf("Failed to delete service %v. %v", s.Name, err)) return err } s.Close() - slice := CoreApp.services - CoreApp.services = append(slice[:i], slice[i+1:]...) + CoreApp.services[s.Id] = nil reorderServices() notifier.OnDeletedService(s.Service) return err @@ -168,7 +156,7 @@ func Create(srv database.Servicer, check bool) (int64, error) { } service := &Service{s} s.Start() - CoreApp.services = append(CoreApp.services, service) + CoreApp.services[service.Id] = service go ServiceCheckQueue(service, check) reorderServices() notifier.OnNewService(s.Service) diff --git a/handlers/services.go b/handlers/services.go index f24bb4ba..3f50e795 100644 --- a/handlers/services.go +++ b/handlers/services.go @@ -206,7 +206,7 @@ func apiAllServicesHandler(r *http.Request) interface{} { return joinServices(services) } -func joinServices(srvs []*core.Service) []*types.Service { +func joinServices(srvs map[int64]*core.Service) []*types.Service { var services []*types.Service for _, v := range srvs { v.UpdateStats()