code: func (s *Scheduler) noSuitableNode(ctx context.Context, taskGroup map[string]*api.Task, schedulingDecisions map[string]schedulingDecision) {
  	explanation := s.pipeline.Explain()
  	for _, t := range taskGroup {
  		var service *api.Service
  		s.store.View(func(tx store.ReadTx) {
  			service = store.GetService(tx, t.ServiceID)
  		})
  		if service == nil {
  			log.G(ctx).WithField("task.id", t.ID).Debug("removing task from the scheduler")
  			continue
  		}
  
  		log.G(ctx).WithField("task.id", t.ID).Debug("no suitable node available for task")
  
  		newT := *t
  		newT.Status.Timestamp = ptypes.MustTimestampProto(time.Now())
  		if explanation != "" {
  			newT.Status.Err = "no suitable node (" + explanation + ")"
  		} else {
  			newT.Status.Err = "no suitable node"
  		}
  		s.allTasks[t.ID] = &newT
  		schedulingDecisions[t.ID] = schedulingDecision{old: t, new: &newT}
  
  		s.enqueue(&newT)
  	}
  }
docs: // noSuitableNode checks unassigned tasks and make sure they have an existing service in the store before
  // updating the task status and adding it back to: schedulingDecisions, unassignedTasks and allTasks