func (s *Server) handleTopoEvent() { for { select { case r := <-s.reqCh: if s.slots[r.slotIdx].slotInfo.State.Status == models.SLOT_STATUS_PRE_MIGRATE { s.bufferedReq.PushBack(r) continue } for e := s.bufferedReq.Front(); e != nil; { next := e.Next() if s.dispatch(e.Value.(*PipelineRequest)) { s.bufferedReq.Remove(e) } e = next } if !s.dispatch(r) { log.Fatalf("should never happend, %+v, %+v", r, s.slots[r.slotIdx].slotInfo) } case e := <-s.evtbus: switch e.(type) { case *killEvent: s.handleMarkOffline() e.(*killEvent).done <- nil default: if s.top.IsSessionExpiredEvent(e) { log.Fatalf("session expired: %+v", e) } evtPath := GetEventPath(e) log.Infof("got event %s, %v, lastActionSeq %d", s.pi.ID, e, s.lastActionSeq) if strings.Index(evtPath, models.GetActionResponsePath(s.conf.ProductName)) == 0 { seq, err := strconv.Atoi(path.Base(evtPath)) if err != nil { log.Warning(err) } else { if seq < s.lastActionSeq { log.Infof("ignore, lastActionSeq %d, seq %d", s.lastActionSeq, seq) continue } } } s.processAction(e) } } } }
func (top *Topology) GetActionResponsePath(seq int) string { return path.Join(models.GetActionResponsePath(top.ProductName), top.coordConn.Seq2Str(int64(seq))) }