{"record":{"id":"7bebc814ea70711d","repo":"thanos-io/thanos","slug":"parse-block-id-q-from-parquet-metadata-file-v","errorCode":null,"errorMessage":"parse block ID %q from parquet metadata file: %v","messagePattern":"parse block ID %q from parquet metadata file: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/block/fetcher.go","lineNumber":1254,"sourceCode":"\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\n// IgnoreDeletionMarkFilter is a filter that filters out the blocks that are marked for deletion after a given delay.\n// The delay duration is to make sure that the replacement block can be fetched before we filter out the old block.\n// Delay is not considered when computing DeletionMarkBlocks map.\n// Not go-routine safe.\ntype IgnoreDeletionMarkFilter struct {\n\tlogger      log.Logger\n\tdelay       time.Duration\n\tconcurrency int\n\tbkt         objstore.InstrumentedBucketReader\n","sourceCodeStart":1236,"sourceCodeEnd":1272,"githubUrl":"https://github.com/thanos-io/thanos/blob/35b8b991177def87ed52dcf10f9b6d87f07282c8/pkg/block/fetcher.go#L1236-L1272","documentation":"Wraps ulid.Parse on a string field (field 6, convertedFromBLIDs) inside the parquet conversion metadata protobuf: the recorded block ID is not a valid ULID, meaning the migration metadata itself is corrupt. The bad string and file path are included.","triggerScenarios":"ulid.Parse(u) fails inside the field-6 handler — the stored string is not a valid 26-character canonical ULID (empty, truncated, wrong encoding, or binary garbage).","commonSituations":"Corrupt or partially written parquet metadata; a writer that stored non-canonical ULIDs (lowercase or non-standard encoding) or a different ID format due to version skew.","solutions":["Re-generate the parquet metadata with a correct converter","Verify ULID formatting in metadata","Skip the offending metadata file"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"if _, err := ulid.Parse(storedID); err != nil {\n    return fmt.Errorf(\"metadata %s holds invalid block id %q\", path, storedID)\n}","typeGuard":null,"tryCatchPattern":"id, err := ulid.Parse(u)\nif err != nil {\n    log.Printf(\"skipping %s: bad ULID %q\", path, u)\n    continue // or delete/regenerate the file\n}","preventionTips":["Emit canonical 26-char uppercase ULIDs in the converter","Round-trip test IDs on write","Keep writer/reader versions aligned","Log and quarantine files with unparseable IDs"],"tags":["ulid","parquet","parse"],"backgroundTag":"invalid-identifier-format","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"}