func (w *Worker) DoWork(rawEvent []byte, eventHandlers map[string]EventHandler, apiClient *client.RancherClient, workers chan *Worker) { defer func() { workers <- w }() event := &Event{} err := json.Unmarshal(rawEvent, &event) if err != nil { log.WithFields(log.Fields{ "err": err, }).Error("Error unmarshalling event") return } if event.Name != "ping" { log.WithFields(log.Fields{ "event": string(rawEvent[:]), }).Debug("Processing event.") } unlocker := locks.Lock(event.ResourceId) if unlocker == nil { log.WithFields(log.Fields{ "resourceId": event.ResourceId, }).Debug("Resource locked. Dropping event") return } defer unlocker.Unlock() if fn, ok := eventHandlers[event.Name]; ok { err = fn(event, apiClient) if err != nil { log.WithFields(log.Fields{ "eventName": event.Name, "eventId": event.Id, "resourceId": event.ResourceId, "err": err, }).Error("Error processing event") reply := &client.Publish{ Name: event.ReplyTo, PreviousIds: []string{event.Id}, Transitioning: "error", TransitioningMessage: err.Error(), } _, err := apiClient.Publish.Create(reply) if err != nil { log.WithFields(log.Fields{ "err": err, }).Error("Error sending error-reply") } } } else { log.WithFields(log.Fields{ "eventName": event.Name, }).Warn("No event handler registered for event") } }
func WithLock(f func(event *events.Event, apiClient *client.RancherClient) error) func(event *events.Event, apiClient *client.RancherClient) error { return func(event *events.Event, apiClient *client.RancherClient) error { lockKey := fmt.Sprintf("%s:%s", event.ResourceType, event.ResourceId) lock := locks.Lock(lockKey) if lock == nil { logrus.Infof("Busying processing %s", lockKey) return nil } defer lock.Unlock() err := f(event, apiClient) if err == ErrTimeout { logrus.Infof("Timeout processing %s", lockKey) return nil } return nil } }