weaviate/weaviate · error

write: find bucket: %w

Error message

write: find bucket: %w

What it means

Write resolves the target bucket before uploading and wraps findBucket failures with 'write: find bucket: %w'. Since the writer is abandoned on error (CloseWithError), nothing is uploaded when the bucket cannot be resolved.

Source

Thrown at modules/backup-gcs/client.go:381

	objectName := g.makeObjectName(overridePath, []string{backupID, key})
	if err := bucket.Object(objectName).Delete(ctx); err != nil {
		return errors.Wrapf(err, "failed to remove access-check gcs backup module %v", objectName)
	}

	return nil
}

func (g *gcsClient) Write(ctx context.Context, backupID, key, overrideBucket, overridePath string, r backup.ReadCloserWithError) (written int64, err error) {
	// Close the reader when done. Use CloseWithError to signal any error to the
	// producer so it sees the actual error instead of "closed pipe".
	defer func() {
		r.CloseWithError(err)
	}()

	bucket, err := g.findBucket(ctx, overrideBucket)
	if err != nil {
		return 0, fmt.Errorf("write: find bucket: %w", err)
	}

	// create a new writer
	objectPath := g.makeObjectName(overridePath, []string{backupID, key})
	writeCtx, cancel := context.WithCancel(ctx)
	defer cancel()
	writer := newChunkWriter(writeCtx, bucket.Object(objectPath), backupID)

	// copy
	written, err = io.Copy(writer, r)
	if err != nil {
		// Cancelling abandons the upload. Closing the writer instead would finalize it,
		// storing the bytes copied so far as a complete object. Closing afterwards is
		// what ends the writer's trace span, and cannot revive the upload: the request
		// it would take needs the context that was just cancelled.
		cancel()
		writer.Close()
		return written, fmt.Errorf("io.copy for gcs write %q: %w", objectPath, err)

View on GitHub (pinned to 75aa4b6d11)

Solutions

  1. Verify BACKUP_GCS_BUCKET (or the override) names an existing, accessible bucket
  2. Re-authenticate / refresh service-account credentials
  3. Retry the backup after confirming 'gsutil ls gs://<bucket>' works
  4. Monitor for bucket policy changes if it worked previously

Example fix

// before
gcsClient.Write(ctx, backupID, key, r) // with empty BACKUP_GCS_BUCKET
// after
if err := os.Setenv("BACKUP_GCS_BUCKET", "my-weaviate-backups"); err != nil { ... }
gcsClient.Write(ctx, backupID, key, r)
Defensive patterns

Strategy: retry

Validate before calling

if os.Getenv("BACKUP_GCS_BUCKET") == "" { return errors.New("BACKUP_GCS_BUCKET unset") }
if _, err := gcsClient.Bucket(os.Getenv("BACKUP_GCS_BUCKET")).Attrs(ctx); err != nil {
    return fmt.Errorf("bucket unusable: %w", err)
}

Try / catch

n, err := g.Write(ctx, backupID, key, r)
if err != nil {
    if strings.Contains(err.Error(), "write: find bucket") {
        // bucket-level issue; verify bucket exists/IAM, then retry backup
    }
    return err // partial upload already abandoned via CloseWithError
}

Prevention

When it happens

Trigger: An object Write during a backup when the bucket name is empty or the bucket.Attrs check fails (missing bucket, no permission, network error) for the override/configured bucket.

Common situations: Bucket deleted or renamed mid-backup; per-request bucket override misspelled; credentials rotated/revoked during a long backup; transient GCS outage at write time.

Related errors


AI-assisted analysis of weaviate/weaviate@75aa4b6d11 (2026-09-04). Data as JSON: /api/errors/2d2fc1be3d8f4b4f. Report an issue: GitHub.