{"record":{"id":"58e71722f419f039","repo":"thanos-io/thanos","slug":"stat-s","errorCode":null,"errorMessage":"stat %s","messagePattern":"stat %s","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/block/block.go","lineNumber":210,"sourceCode":"\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)\n\tif err != nil {\n\t\treturn errors.Wrapf(err, \"stat %s\", metaFile)\n\t}\n\n\tif ok {\n\t\tif err := bkt.Delete(ctx, metaFile); err != nil {\n\t\t\treturn errors.Wrapf(err, \"delete %s\", metaFile)\n\t\t}\n\t\tlevel.Debug(logger).Log(\"msg\", \"deleted file\", \"file\", metaFile, \"bucket\", bkt.Name())\n\t}\n\n\t// Delete the block objects, but skip:\n\t// - The metaFile as we just deleted. This is required for eventual object storages (list after write).\n\t// - The deletionMarkFile as we'll delete it at last.\n\terr = deleteDirRec(ctx, logger, bkt, id.String(), func(name string) bool {\n\t\treturn name == metaFile || name == deletionMarkFile\n\t})\n\tif err != nil {\n\t\treturn err\n\t}","sourceCodeStart":192,"sourceCodeEnd":228,"githubUrl":"https://github.com/thanos-io/thanos/blob/35b8b991177def87ed52dcf10f9b6d87f07282c8/pkg/block/block.go#L192-L228","documentation":"Delete removes a block's objects from the bucket. Before deleting meta.json it calls bkt.Exists; this error wraps a failure of that Exists (stat) call, meaning the storage backend could not report whether <ULID>/meta.json is present.","triggerScenarios":"bkt.Exists on <ULID>/meta.json fails due to network errors, auth failures, throttling, or unsupported/buggy bucket client during block.Delete.","commonSituations":"Expired object-store credentials; S3/GCS API outages; rate limiting; misconfigured bucket name; context deadline exceeded.","solutions":["Check object store connectivity, credentials, and bucket configuration","Inspect the wrapped backend error for the root cause (auth vs network vs throttling)","Retry with backoff; delete is resumable since it re-stats each file"],"exampleFix":"// before\nif err := block.Delete(ctx, logger, bkt, id); err != nil { return err }\n// after\nerr := block.Delete(ctx, logger, bkt, id)\nif err != nil && strings.Contains(err.Error(), \"stat \") {\n    time.Sleep(backoff)\n    err = block.Delete(ctx, logger, bkt, id)\n}","handlingStrategy":"retry","validationCode":"if err := bkt.Iter(ctx, \"\", func(string) error { return nil }); err != nil {\n    return fmt.Errorf(\"bucket client unhealthy: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"if err := block.Delete(ctx, logger, bkt, id); err != nil {\n    if strings.Contains(err.Error(), \"stat \") {\n        return backoff.Retry(func() error { return block.Delete(ctx, logger, bkt, id) })\n    }\n    return err\n}","preventionTips":["Check object-store credentials and connectivity before bulk deletes","Watch for rate limiting and add client-side throttling","Keep context deadlines generous enough for slow backends"],"tags":["object-storage","network","exists-check"],"backgroundTag":"http-request-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"}