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

  1. Use artifact names exactly as they appear in the manifest (same casing, no extra path elements).
  2. Regenerate or refresh the retrieval server's manifest so it matches the artifacts the client requests.
  3. 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

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


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)