func()

in lib/persistedretry/writeback/executor.go [74:114]


func (e *Executor) upload(t *Task) error {
	start := time.Now()

	client, err := e.backends.GetClient(t.Namespace)
	if err != nil {
		if err == backend.ErrNamespaceNotFound {
			log.With(
				"namespace", t.Namespace,
				"name", t.Name).Info("Dropping writeback for unconfigured namespace")
			return nil
		}
		return fmt.Errorf("get client: %s", err)
	}

	if _, err := client.Stat(t.Namespace, t.Name); err == nil {
		// File already uploaded, no-op.
		return nil
	}

	f, err := e.fs.GetCacheFileReader(t.Name)
	if err != nil {
		if os.IsNotExist(err) {
			// Nothing we can do about this but make noise and drop the task.
			e.stats.Counter("missing_files").Inc(1)
			log.With("name", t.Name).Error("Invariant violation: writeback cache file missing")
			return nil
		}
		return fmt.Errorf("get file: %s", err)
	}
	defer f.Close()

	if err := client.Upload(t.Namespace, t.Name, f); err != nil {
		return fmt.Errorf("upload: %s", err)
	}

	// We don't want to time noops nor errors.
	e.stats.Timer("upload").Record(time.Since(start))
	e.stats.Timer("lifetime").Record(time.Since(t.CreatedAt))

	return nil
}