{"record":{"id":"5ca29f80ea9a4346","repo":"thanos-io/thanos","slug":"get-meta-file-v","errorCode":null,"errorMessage":"get meta file: %v","messagePattern":"get meta file: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/block/fetcher.go","lineNumber":484,"sourceCode":"\t\tif err == nil {\n\t\t\treturn m, nil\n\t\t}\n\n\t\tif !errors.Is(err, os.ErrNotExist) {\n\t\t\tlevel.Warn(f.logger).Log(\"msg\", \"best effort read of the local meta.json failed; removing cached block dir\", \"dir\", cachedBlockDir, \"err\", err)\n\t\t\tif err := os.RemoveAll(cachedBlockDir); err != nil {\n\t\t\t\tlevel.Warn(f.logger).Log(\"msg\", \"best effort remove of cached dir failed; ignoring\", \"dir\", cachedBlockDir, \"err\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\tr, err := f.bkt.ReaderWithExpectedErrs(f.bkt.IsObjNotFoundErr).Get(ctx, metaFile)\n\tif f.bkt.IsObjNotFoundErr(err) {\n\t\t// Meta.json was deleted between bkt.Exists and here.\n\t\treturn nil, errors.Wrapf(ErrorSyncMetaNotFound, \"%v\", err)\n\t}\n\tif err != nil {\n\t\treturn nil, errors.Wrapf(err, \"get meta file: %v\", metaFile)\n\t}\n\n\tdefer runutil.CloseWithLogOnErr(f.logger, r, \"close bkt meta get\")\n\n\tmetaContent, err := io.ReadAll(r)\n\tif err != nil {\n\t\treturn nil, errors.Wrapf(err, \"read meta file: %v\", metaFile)\n\t}\n\n\tm := &metadata.Meta{}\n\tif err := json.Unmarshal(metaContent, m); err != nil {\n\t\treturn nil, errors.Wrapf(ErrorSyncMetaCorrupted, \"meta.json %v unmarshal: %v\", metaFile, err)\n\t}\n\n\tif m.Version != metadata.TSDBVersion1 {\n\t\treturn nil, errors.Errorf(\"unexpected meta file: %s version: %d\", metaFile, m.Version)\n\t}\n","sourceCodeStart":466,"sourceCodeEnd":502,"githubUrl":"https://github.com/thanos-io/thanos/blob/35b8b991177def87ed52dcf10f9b6d87f07282c8/pkg/block/fetcher.go#L466-L502","documentation":"loadMeta wraps any non-not-found error from fetching meta.json as errors.Wrapf(err, \"get meta file: %v\", metaFile). Unlike ErrorSyncMetaNotFound, this is a genuine storage failure (network, permissions, throttling, client errors) — the object still exists but the Get call failed. The original error is preserved as the cause, and the block metadata read fails.","triggerScenarios":"loadMeta: ReaderWithExpectedErrs(...).Get(ctx, metaFile) returns an error that is NOT an object-not-found error (IsObjNotFoundErr false); it is wrapped with 'get meta file: <path>'. Causes include S3/GCS API errors, network timeouts, IAM/permission denials, rate limiting.","commonSituations":"S3 throttling (SlowDown) during large bucket syncs; expired or missing object-store credentials; network partition between Thanos and the object store; misconfigured bucket endpoint or region; GCS per-request rate limits.","solutions":["Inspect the wrapped cause error to identify the storage-layer failure (auth, throttling, network).","Retry the sync — transient network/throttle failures usually resolve; bucket fetchers retry on subsequent syncs.","Fix object-store credentials/permissions if the cause is access denied.","Enable request retries/rate limiting in the objstore client config (e.g. S3 max_retries, GCS backoff) for large buckets."],"exampleFix":"// before: no retry/backoff configured\n// s3:\n//   endpoint: s3.amazonaws.com\n\n// after: enable retries for transient Get failures\n// s3:\n//   endpoint: s3.amazonaws.com\n//   max_retries: 5\n// http_config:\n//   backoff: ...","handlingStrategy":"retry","validationCode":"// pre-flight: verify credentials and bucket reachability before sync\nif _, err := bkt.Iter(ctx, \"\", nil); err != nil {\n    return fmt.Errorf(\"bucket not reachable/authorized: %w\", err)\n}","typeGuard":"func isGetMetaFailure(err error) bool {\n    return err != nil && !errors.Is(err, block.ErrorSyncMetaNotFound) &&\n        strings.Contains(err.Error(), \"get meta file:\")\n}","tryCatchPattern":"err := retry(ctx, 3, func() error {\n    _, ferr := loadMetaFn(ctx)\n    if ferr != nil && !errors.Is(ferr, block.ErrorSyncMetaNotFound) {\n        return ferr // transient Get failure: retry with backoff\n    }\n    return nil\n})","preventionTips":["Configure objstore client retries/backoff (S3 max_retries, GCS retry policy)","Rotate and validate object-store credentials before they expire","Respect rate limits; throttle concurrent syncs on very large buckets","Alert on sustained 'get meta file' failures — they indicate real storage outages"],"tags":["object-storage","network","thanos","error-wrapping","retryable"],"backgroundTag":"api-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"}