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
- Verify BACKUP_GCS_BUCKET (or the override) names an existing, accessible bucket
- Re-authenticate / refresh service-account credentials
- Retry the backup after confirming 'gsutil ls gs://<bucket>' works
- 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
- Verify bucket accessibility before starting long backups
- Avoid renaming/deleting buckets during backup windows
- Rotate credentials outside backup schedules
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.