code: func (worker *Worker) taskRetry(signature *tasks.Signature) error {
  	// Update task state to RETRY
  	if err := worker.server.GetBackend().SetStateRetry(signature); err != nil {
  		return fmt.Errorf("Set state to 'retry' for task %s returned error: %s", signature.UUID, err)
  	}
  
  	// Decrement the retry counter, when it reaches 0, we won't retry again
  	signature.RetryCount--
  
  	// Increase retry timeout
  	signature.RetryTimeout = retry.FibonacciNext(signature.RetryTimeout)
  
  	// Delay task by signature.RetryTimeout seconds
  	eta := time.Now().UTC().Add(time.Second * time.Duration(signature.RetryTimeout))
  	signature.ETA = &eta
  
  	log.WARNING.Printf("Task %s failed. Going to retry in %d seconds.", signature.UUID, signature.RetryTimeout)
  
  	// Send the task back to the queue
  	_, err := worker.server.SendTask(signature)
  	return err
  }
docs: // retryTask decrements RetryCount counter and republishes the task to the queue