{"record":{"id":"c7f5f6a96ccce508","repo":"thanos-io/thanos","slug":"meta-json-bkt-get-for-s","errorCode":null,"errorMessage":"meta.json bkt get for %s","messagePattern":"meta\\.json bkt get for (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/block/block.go","lineNumber":283,"sourceCode":"\t\t\treturn deleteDirRec(ctx, logger, bkt, name, keep)\n\t\t}\n\t\tif keep(name) {\n\t\t\treturn nil\n\t\t}\n\t\tif err := bkt.Delete(ctx, name); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tlevel.Debug(logger).Log(\"msg\", \"deleted file\", \"file\", name, \"bucket\", bkt.Name())\n\t\treturn nil\n\t})\n}\n\n// DownloadMeta downloads only meta file from bucket by block ID.\n// TODO(bwplotka): Differentiate between network error & partial upload.\nfunc DownloadMeta(ctx context.Context, logger log.Logger, bkt objstore.Bucket, id ulid.ULID) (metadata.Meta, error) {\n\trc, err := bkt.Get(ctx, path.Join(id.String(), MetaFilename))\n\tif err != nil {\n\t\treturn metadata.Meta{}, errors.Wrapf(err, \"meta.json bkt get for %s\", id.String())\n\t}\n\tdefer runutil.CloseWithLogOnErr(logger, rc, \"download meta bucket client\")\n\n\tvar m metadata.Meta\n\n\tobj, err := io.ReadAll(rc)\n\tif err != nil {\n\t\treturn metadata.Meta{}, errors.Wrapf(err, \"read meta.json for block %s\", id.String())\n\t}\n\n\tif err = json.Unmarshal(obj, &m); err != nil {\n\t\treturn metadata.Meta{}, errors.Wrapf(err, \"unmarshal meta.json for block %s\", id.String())\n\t}\n\n\treturn m, nil\n}\n\nfunc IsBlockMetaFile(path string) bool {","sourceCodeStart":265,"sourceCodeEnd":301,"githubUrl":"https://github.com/thanos-io/thanos/blob/35b8b991177def87ed52dcf10f9b6d87f07282c8/pkg/block/block.go#L265-L301","documentation":"Wraps bkt.Get in DownloadMeta when fetching a block's meta.json from object storage. It fires on bucket access errors (auth, network, missing object) while reading the block's metadata; partial uploads are not yet distinguished from network errors at this site.","triggerScenarios":"Calling block.DownloadMeta for a ULID whose meta.json is not in the bucket (partial upload, GC'd block, wrong ULID) or when the object-store Get request fails (auth/network/throttling).","commonSituations":"Store gateway or tooling resolving a block ID that was garbage-collected; listing race during compaction; typo'd or stale ULID; object store credentials/bucket misconfiguration.","solutions":["Check object storage connectivity and permissions","If not found, the block may be partial — let cleanup handle it","Retry after transient errors"],"exampleFix":"// before\nmeta, err := block.DownloadMeta(ctx, logger, bkt, id)\nif err != nil { return err }\n// after\nmeta, err := block.DownloadMeta(ctx, logger, bkt, id)\nif err != nil {\n    if bkt.IsObjNotFoundErr(errors.Unwrap(err)) {\n        logger.Warn(\"block disappeared from bucket, skipping\", \"id\", id)\n        return nil\n    }\n    return err\n}","handlingStrategy":"try-catch","validationCode":"ok, err := bkt.Exists(ctx, path.Join(id.String(), block.MetaFilename))\nif err != nil { return err }\nif !ok { return fmt.Errorf(\"block %s not present in bucket\", id) }","typeGuard":null,"tryCatchPattern":"meta, err := block.DownloadMeta(ctx, logger, bkt, id)\nif err != nil {\n    if bkt.IsObjNotFoundErr(errors.Unwrap(err)) { return errSkipMissingBlock }\n    return err\n}","preventionTips":["Use bkt.IsObjNotFoundErr to distinguish missing blocks from real failures","Skip/re-list blocks that vanished during GC rather than failing hard","Confirm ULIDs come from a fresh bucket listing, not stale caches"],"tags":["object-storage","metadata","not-found"],"backgroundTag":"resource-not-found","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"}