apache/beam · error

no artifact named for location

Error message

no artifact named %v for location %v

What it means

validate requires every Location entry in the ProxyManifest to reference an artifact Name present in the manifest's artifact list. This error means a location points at an artifact name that doesn't exist, so retrieval could never resolve it.

Solutions

  1. Ensure every location Name has a matching entry in Manifest.Artifact before committing the manifest.
  2. Regenerate the manifest through CommitManifest so artifacts and locations are built together.
  3. Validate the manifest with the same uniqueness/consistency checks before uploading it.
  4. If hand-editing, rename in both the artifact entry and its location entry.

Example fix

// before
loc := &jobpb.Location{Name: "worker.jar", Uri: "gs://bucket/blobs/xyz"}
// after: add the matching artifact first
manifest.Artifact = append(manifest.Artifact, &pipepb.Artifact{Name: "worker.jar"})
loc := &jobpb.Location{Name: "worker.jar", Uri: "gs://bucket/blobs/xyz"}
Defensive patterns

Strategy: validation

Validate before calling

func locationsReferenceArtifacts(md *jobpb.ProxyManifest) error {
	names := map[string]bool{}
	for _, a := range md.GetManifest().GetArtifact() {
		names[a.Name] = true
	}
	for _, l := range md.GetLocation() {
		if !names[l.Name] {
			return fmt.Errorf("location %v has no artifact", l.Name)
		}
	}
	return nil
}

Try / catch

if err := gcsproxy.NewRetrievalServer(manifestPath); err != nil {
	if strings.Contains(err.Error(), "no artifact named") {
		// regenerate the manifest so artifacts and locations stay in sync
	}
}

Prevention

When it happens

Trigger: NewRetrievalServer receives a ProxyManifest where md.GetLocation() contains an entry whose Name is absent from md.GetManifest().GetArtifact().

Common situations: Manifest artifact list and location list were built independently and drifted out of sync; artifact entries dropped by an upstream filter while locations were kept; hand-edited manifest JSON with a renamed artifact.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/2bb4d68a4150c10d. Report an issue: GitHub.

Appendix: source

Thrown at sdks/go/pkg/beam/artifact/gcsproxy/retrieval.go:133

		if err != nil {
			return errors.Wrapf(err, "failed to read from %v", blob)
		}
	}
	return nil
}

func validate(md *jobpb.ProxyManifest) error {
	keys := make(map[string]bool)
	for _, a := range md.GetManifest().GetArtifact() {
		if _, seen := keys[a.Name]; seen {
			return errors.Errorf("multiple artifact with name %v", a.Name)
		}
		keys[a.Name] = true
	}
	for _, l := range md.GetLocation() {
		fresh, seen := keys[l.Name]
		if !seen {
			return errors.Errorf("no artifact named %v for location %v", l.Name, l.Uri)
		}
		if !fresh {
			return errors.Errorf("multiple locations for %v:%v", l.Name, l.Uri)
		}
		keys[l.Name] = false
	}

	for key, fresh := range keys {
		if fresh {
			return errors.Errorf("no location for %v", key)
		}
	}
	return nil
}

func parseObject(blob string) (string, string) {
	bucket, object, err := gcsx.ParseObject(blob)
	if err != nil {

View on GitHub (pinned to 12126d8942)