{"record":{"id":"eefd02d71a85a37e","repo":"thanos-io/thanos","slug":"read-next-field-from-parquet-metadata-file-v","errorCode":null,"errorMessage":"read next field from parquet metadata file: %v","messagePattern":"read next field from parquet metadata file: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/block/fetcher.go","lineNumber":1244,"sourceCode":"\nfunc (f *IgnoreParquetConvertedBlocksFilter) readMigratedBlocksFromParquetMetadata(ctx context.Context, path string) (map[ulid.ULID]struct{}, error) {\n\tmigratedBlocks := make(map[ulid.ULID]struct{})\n\tr, err := f.bkt.Get(ctx, path)\n\tif err != nil {\n\t\treturn nil, errors.Wrapf(err, \"get parquet metadata file: %v\", path)\n\t}\n\tdefer runutil.CloseWithLogOnErr(f.logger, r, \"close bkt get\")\n\n\tcontent, err := io.ReadAll(r)\n\tif err != nil {\n\t\treturn nil, errors.Wrapf(err, \"read parquet metadata file: %v\", path)\n\t}\n\n\tvar fc easyproto.FieldContext\n\tfor len(content) > 0 {\n\t\tcontent, err = fc.NextField(content)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrapf(err, \"read next field from parquet metadata file: %v\", path)\n\t\t}\n\t\tswitch fc.FieldNum {\n\t\tcase 6:\n\t\t\tu, ok := fc.String()\n\t\t\tif !ok {\n\t\t\t\treturn nil, errors.Wrapf(err, \"read convertedFromBLIDs field from parquet metadata file: %v\", path)\n\t\t\t}\n\t\t\tid, err := ulid.Parse(u)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, errors.Wrapf(err, \"parse block ID %q from parquet metadata file: %v\", u, path)\n\t\t\t}\n\t\t\tmigratedBlocks[id] = struct{}{}\n\t\t}\n\t}\n\n\treturn migratedBlocks, nil\n}\n","sourceCodeStart":1226,"sourceCodeEnd":1262,"githubUrl":"https://github.com/thanos-io/thanos/blob/35b8b991177def87ed52dcf10f9b6d87f07282c8/pkg/block/fetcher.go#L1226-L1262","documentation":"Wraps easyproto FieldContext.NextField while sequentially decoding the parquet conversion metadata protobuf: the byte stream is not a well-formed protobuf (truncated mid-field or corrupted framing), so block IDs of parquet-converted blocks cannot be enumerated.","triggerScenarios":"fc.NextField(content) returns an error in the decoding loop — the file content is truncated, corrupt, or not the expected protobuf format (e.g. written by a different/newer converter version).","commonSituations":"Interrupted parquet converter left a partial file; object store returned an empty/garbage body; version mismatch between the writer's proto schema and the reader's field expectations.","solutions":["Verify the object is a valid parquet metadata protobuf file","Re-generate or re-upload the metadata object","Skip/ignore corrupt metadata paths"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"meta, err := bkt.Get(ctx, path)\nif err == nil {\n    if n, _ := io.ReadAll(meta); len(n) == 0 {\n        return fmt.Errorf(\"parquet metadata %s is empty/corrupt\", path)\n    }\n}","typeGuard":null,"tryCatchPattern":"if err := decodeMeta(content); err != nil {\n    log.Printf(\"skipping corrupt parquet metadata %s: %v\", path, err)\n    // skip file instead of failing the whole scan\n}","preventionTips":["Verify the converter writes files atomically (write-then-rename semantics on the store)","Keep reader and converter proto schema versions in sync","Detect zero-length objects before decoding","Quarantine/delete corrupt files"],"tags":["protobuf","parquet","decode"],"backgroundTag":"protobuf-unmarshal-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"}