apache/beam · error
artifact not found
Error message
artifact %v not found
What it means
GetArtifact looks up the requested artifact name in the retrieval server's in-memory map of manifest locations. This error is returned when the key is not present, i.e. no artifact with that name exists in the loaded manifest.
Solutions
- Use artifact names exactly as they appear in the manifest (same casing, no extra path elements).
- Regenerate or refresh the retrieval server's manifest so it matches the artifacts the client requests.
- Log the available keys in s.blobs (manifest locations) to compare against the requested name.
Example fix
// before (name invented client-side) req.GetName() = "artifact-0" // after: use the name from the manifest name := artifact.Metadata.GetName() // matches manifest location name
Defensive patterns
Strategy: try-catch
Validate before calling
// keep a client-side copy of the manifest names and check membership before requesting
names := map[string]bool{}
for _, l := range manifest.GetLocation() { names[l.GetName()] = true }
if !names[want] { return fmt.Errorf("artifact %q not in manifest", want) } Try / catch
err := streamArtifact(ctx, name)
if err != nil && strings.Contains(err.Error(), "not found") { return fmt.Errorf("artifact %q missing from manifest; refresh manifest", name) } Prevention
- Request artifacts by names taken directly from the manifest, not hardcoded strings.
- Keep client and server manifests in sync (same source/version).
When it happens
Trigger: Calling GetArtifact (LegacyGetArtifact) with a name that does not match any ArtifactMetadata name in the manifest the server was built from.
Common situations: Client and server built from different manifest versions, name mismatch due to casing or path-like names, or stale manifests after re-staging the pipeline.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- Job does not exist
- _not_found_err_message(self.feature_store_id…
- _not_found_err_message(self.feature_store_name…
- A dataSourceConfiguration or dataSourceProviderFn has…
- A list of URNs for overriding transforms was provided but…
AI-assisted analysis of apache/beam@12126d8942 (2026-09-13).
Data as JSON: /api/errors/57c39f8bc5a369ae.
Report an issue: GitHub.
Appendix: source
Thrown at sdks/go/pkg/beam/artifact/gcsproxy/retrieval.go:86
if _, _, err := gcsx.ParseObject(l.GetUri()); err != nil {
return nil, errors.Wrapf(err, "location %v is not a GCS object", l.GetUri())
}
blobs[l.GetName()] = l.GetUri()
}
return &RetrievalServer{md: md.GetManifest(), blobs: blobs}, nil
}
// GetManifest returns the manifest for all artifacts.
func (s *RetrievalServer) GetManifest(ctx context.Context, req *jobpb.GetManifestRequest) (*jobpb.GetManifestResponse, error) {
return &jobpb.GetManifestResponse{Manifest: s.md}, nil
}
// GetArtifact returns a given artifact.
func (s *RetrievalServer) GetArtifact(req *jobpb.LegacyGetArtifactRequest, stream jobpb.LegacyArtifactRetrievalService_GetArtifactServer) error {
key := req.GetName()
blob, ok := s.blobs[key]
if !ok {
return errors.Errorf("artifact %v not found", key)
}
bucket, object := parseObject(blob)
ctx := stream.Context()
client, err := gcsx.NewClient(ctx, storage.ScopeReadOnly)
if err != nil {
return errors.Wrapf(err, "Failed to create client for %v", key)
}
// Stream artifact in up to 1MB chunks.
r, err := client.Bucket(bucket).Object(object).NewReader(ctx)
if err != nil {
return errors.Wrapf(err, "Failed to read object for %v", key)
}
defer r.Close()
data := make([]byte, 1<<20)View on GitHub (pinned to 12126d8942)