{"record":{"id":"2b4e92018c349a23","repo":"thanos-io/thanos","slug":"upload-file-s-to-bucket","errorCode":null,"errorMessage":"upload file %s to bucket","messagePattern":"upload file (.+?) to bucket","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/block/block.go","lineNumber":190,"sourceCode":"\t\treturn errors.Wrapf(err, \"check exists %s in bucket\", deletionMarkFile)\n\t}\n\tif deletionMarkExists {\n\t\tlevel.Warn(logger).Log(\"msg\", \"requested to mark for deletion, but file already exists; this should not happen; investigate\", \"err\", errors.Errorf(\"file %s already exists in bucket\", deletionMarkFile))\n\t\treturn nil\n\t}\n\n\tdeletionMark, err := json.Marshal(metadata.DeletionMark{\n\t\tID:           id,\n\t\tDeletionTime: time.Now().Unix(),\n\t\tVersion:      metadata.DeletionMarkVersion1,\n\t\tDetails:      details,\n\t})\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"json encode deletion mark\")\n\t}\n\n\tif err := bkt.Upload(ctx, deletionMarkFile, bytes.NewBuffer(deletionMark)); err != nil {\n\t\treturn errors.Wrapf(err, \"upload file %s to bucket\", deletionMarkFile)\n\t}\n\tmarkedForDeletion.Inc()\n\tlevel.Info(logger).Log(\"msg\", \"block has been marked for deletion\", \"block\", id)\n\treturn nil\n}\n\n// Delete removes directory that is meant to be block directory.\n// NOTE: Always prefer this method for deleting blocks.\n//   - We have to delete block's files in the certain order (meta.json first and deletion-mark.json last)\n//     to ensure we don't end up with malformed partial blocks. Thanos system handles well partial blocks\n//     only if they don't have meta.json. If meta.json is present Thanos assumes valid block.\n//   - This avoids deleting empty dir (whole bucket) by mistake.\nfunc Delete(ctx context.Context, logger log.Logger, bkt objstore.Bucket, id ulid.ULID) error {\n\tmetaFile := path.Join(id.String(), MetaFilename)\n\tdeletionMarkFile := path.Join(id.String(), metadata.DeletionMarkFilename)\n\n\t// Delete block meta file.\n\tok, err := bkt.Exists(ctx, metaFile)","sourceCodeStart":172,"sourceCodeEnd":208,"githubUrl":"https://github.com/thanos-io/thanos/blob/35b8b991177def87ed52dcf10f9b6d87f07282c8/pkg/block/block.go#L172-L208","documentation":"MarkForDeletion failed uploading deletion-mark.json to the block prefix in the bucket. Until this upload succeeds, garbage collection cannot remove the block, so the marking operation reports failure to callers like compactor repair/clean.","triggerScenarios":"bkt.Upload fails for <ULID>/deletion-mark.json due to network errors, missing bucket/permissions, throttling, or context cancellation during MarkForDeletion.","commonSituations":"Object store credentials lack put permission; bucket temporarily unavailable or rate-limited; network partition between the compactor and storage; context canceled by shutdown.","solutions":["Check object storage connectivity and upload permissions","Inspect the wrapped error for the bucket-level cause","Retry marking once storage is healthy"],"exampleFix":"// before\nif err := block.MarkForDeletion(ctx, logger, bkt, id, \"manual\"); err != nil { return err }\n// after\nerr := block.MarkForDeletion(ctx, logger, bkt, id, \"manual\")\nif err != nil {\n    if ctx.Err() != nil { return ctx.Err() }\n    logger.Warn(\"mark for deletion failed, retrying\", \"err\", err)\n    return retry(func() error { return block.MarkForDeletion(ctx, logger, bkt, id, \"manual\") })\n}","handlingStrategy":"retry","validationCode":"ok, err := bkt.Exists(ctx, path.Join(id.String(), \"deletion.mark\"))\n_ = ok // ensure bucket client is configured and reachable first","typeGuard":null,"tryCatchPattern":"err := block.MarkForDeletion(ctx, logger, bkt, id, details)\nif err != nil {\n    if errors.Is(err, context.Canceled) { return err }\n    return backoff.Retry(func() error { return block.MarkForDeletion(ctx, logger, bkt, id, details) })\n}","preventionTips":["Verify bucket write permissions before delete workflows","Prefer retry with backoff for transient object-store errors","Propagate context cancellation instead of retrying shutdowns"],"tags":["object-storage","network","upload"],"backgroundTag":"file-write-failed","analyzedSha":"35b8b991177def87ed52dcf10f9b6d87f07282c8","analyzedAt":"2026-09-07T01:49:59.689Z","contentChangedAt":"2026-09-07T01:49:59.689Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}