code: func (ctx *workflowContext) rollback() {
  	defer recordDuration(time.Now(), "Rollback", ctx)
  
  	// Run each cleanup function concurrently.  If there's an error
  	// all we're going to do is log it as a warning, since at this
  	// point there's nothing to do...
  	ctx.logger.Info("Invoking rollback functions")
  	var wg sync.WaitGroup
  	wg.Add(len(ctx.transaction.rollbackFunctions))
  	rollbackErr := callRollbackHook(ctx, &wg)
  	if rollbackErr != nil {
  		ctx.logger.WithFields(logrus.Fields{
  			"Error": rollbackErr,
  		}).Warning("Rollback Hook failed to execute")
  	}
  	for _, eachCleanup := range ctx.transaction.rollbackFunctions {
  		go func(cleanupFunc spartaS3.RollbackFunction, goLogger *logrus.Logger) {
  			// Decrement the counter when the goroutine completes.
  			defer wg.Done()
  			// Fetch the URL.
  			err := cleanupFunc(goLogger)
  			if nil != err {
  				ctx.logger.WithFields(logrus.Fields{
  					"Error": err,
  				}).Warning("Failed to cleanup resource")
  			}
  		}(eachCleanup, ctx.logger)
  	}
  	wg.Wait()
  }
docs: // Run any provided rollback functions