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
- Ensure every location Name has a matching entry in Manifest.Artifact before committing the manifest.
- Regenerate the manifest through CommitManifest so artifacts and locations are built together.
- Validate the manifest with the same uniqueness/consistency checks before uploading it.
- 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
- Generate artifact entries and location entries from the same staging loop.
- Never filter artifacts from a manifest without filtering locations too.
- Run validate()-style checks before committing any manifest.
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
- multiple artifact with name
- multiple locations for
- no location for
- failed to marshal proxy manifest
- Given message schema
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)