googleapis/mcp-toolbox · warning

failed to get metadata for created bucket %q: %w

Error message

failed to get metadata for created bucket %q: %w

What it means

The bucket was created successfully, but the follow-up BucketHandle.Attrs call to fetch its metadata failed. The resource exists; only the read-back of attributes (wrapped error: IAM, transient network, or eventual consistency) failed.

Source

Thrown at internal/sources/cloudstorage/cloudstorage.go:333

	if err := s.validateBucket(bucket); err != nil {
		return nil, err
	}
	if project == "" {
		project = s.Project
	}
	attrs := &storage.BucketAttrs{Location: location}
	if uniformBucketLevelAccess {
		attrs.UniformBucketLevelAccess = storage.UniformBucketLevelAccess{Enabled: true}
	}

	bkt := s.client.Bucket(bucket)
	if err := bkt.Create(ctx, project, attrs); err != nil {
		return nil, fmt.Errorf("failed to create bucket %q in project %q: %w", bucket, project, err)
	}

	createdAttrs, err := bkt.Attrs(ctx)
	if err != nil {
		return nil, fmt.Errorf("failed to get metadata for created bucket %q: %w", bucket, err)
	}
	return map[string]any{
		"bucket":   bucket,
		"created":  true,
		"metadata": createdAttrs,
	}, nil
}

// GetBucketMetadata returns raw bucket metadata from the Cloud Storage client.
func (s *Source) GetBucketMetadata(ctx context.Context, bucket string) (*storage.BucketAttrs, error) {
	if err := s.validateBucket(bucket); err != nil {
		return nil, err
	}
	attrs, err := s.client.Bucket(bucket).Attrs(ctx)
	if err != nil {
		return nil, fmt.Errorf("failed to get metadata for bucket %q: %w", bucket, err)
	}
	return attrs, nil

View on GitHub (pinned to 8cc6e09de2)

Solutions

  1. Retry with backoff: the bucket exists, so re-fetch metadata via a separate Attrs/GetGoogleCloudbucket call.
  2. Grant the service account storage.buckets.get in addition to create if using a custom role.
  3. Extend the context timeout so the metadata read isn't cancelled immediately after creation.
  4. Treat the operation as partially successful: verify with gsutil/gcloud whether the bucket exists before re-creating.

Example fix

// before
created, err := source.CreateBucket(ctx, name, proj, nil, "US", "STANDARD", true) // attrs read failed
// after (recover)
if err != nil {
    time.Sleep(500 * time.Millisecond)
    created, err = source.CreateBucket(ctx, name, proj, nil, "US", "STANDARD", true) // or re-fetch attrs
}
Defensive patterns

Strategy: retry

Try / catch

for attempt := 0; attempt < 3; attempt++ {
    res, err := source.CreateBucket(ctx, name, proj, nil, loc, class, ula)
    if err == nil { break }
    time.Sleep(time.Duration(1<<attempt) * 200 * time.Millisecond) // bucket already exists; retry gets metadata
}

Prevention

When it happens

Trigger: CreateBucket succeeded, then bkt.Attrs(ctx) failed immediately after: transient 5xx/network blip, context cancelled, or the caller lacking storage.buckets.get despite having create rights, or replication lag on fresh buckets.

Common situations: Short client timeouts firing right after the create RPC; service accounts with create-but-not-get IAM splits (unusual custom roles); reading metadata of a bucket created milliseconds earlier.

Related errors


AI-assisted analysis of googleapis/mcp-toolbox@8cc6e09de2 (2026-09-05). Data as JSON: /api/errors/f53e8d44b16879df. Report an issue: GitHub.