package trans import ( "sync" "github.com/toolkits/pkg/container/list" "github.com/toolkits/pkg/logger" "github.com/toolkits/pkg/slice" ) type SafeJudgeQueue struct { sync.RWMutex Data map[string]*list.SafeListLimited QueueMaxSize int } var queues = NewJudgeQueue() func NewJudgeQueue() SafeJudgeQueue { return SafeJudgeQueue{ Data: make(map[string]*list.SafeListLimited), QueueMaxSize: 10240000, } } func (s *SafeJudgeQueue) Del(instance string) { s.Lock() delete(s.Data, instance) s.Unlock() } func (s *SafeJudgeQueue) Set(instance string, q *list.SafeListLimited) { s.Lock() s.Data[instance] = q s.Unlock() } func (s *SafeJudgeQueue) Get(instance string) (*list.SafeListLimited, bool) { s.RLock() defer s.RUnlock() q, exists := s.Data[instance] return q, exists } func (s *SafeJudgeQueue) Exists(instance string) bool { s.RLock() defer s.RUnlock() _, exists := s.Data[instance] return exists } func (s *SafeJudgeQueue) GetAll() map[string]*list.SafeListLimited { s.RLock() defer s.RUnlock() return s.Data } func (s *SafeJudgeQueue) Update(instances []string) { for _, instance := range instances { if !s.Exists(instance) { q := list.NewSafeListLimited(s.QueueMaxSize) s.Set(instance, q) go send2JudgeTask(q, instance) } } toDel := make(map[string]struct{}) all := s.GetAll() for key := range all { if !slice.ContainsString(instances, key) { toDel[key] = struct{}{} } } for key := range toDel { if queue, ok := s.Get(key); ok { queue.RemoveAll() } s.Del(key) logger.Infof("server instance %s dead, so remove from judge queues", key) } }