{"record":{"id":"ac41f65715910910","repo":"hyperledger/fabric","slug":"block-numbers-not-maintained-in-index","errorCode":null,"errorMessage":"block numbers not maintained in index","messagePattern":"block numbers not maintained in index","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"common/ledger/blkstorage/blockindex.go","lineNumber":174,"sourceCode":"\t\treturn nil, errors.New(\"block hashes not maintained in index\")\n\t}\n\tb, err := index.db.Get(constructBlockHashKey(blockHash))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif b == nil {\n\t\treturn nil, errors.Errorf(\"no such block hash [%x] in index\", blockHash)\n\t}\n\tblkLoc := &fileLocPointer{}\n\tif err := blkLoc.unmarshal(b); err != nil {\n\t\treturn nil, err\n\t}\n\treturn blkLoc, nil\n}\n\nfunc (index *blockIndex) getBlockLocByBlockNum(blockNum uint64) (*fileLocPointer, error) {\n\tif !index.isAttributeIndexed(IndexableAttrBlockNum) {\n\t\treturn nil, errors.New(\"block numbers not maintained in index\")\n\t}\n\tb, err := index.db.Get(constructBlockNumKey(blockNum))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif b == nil {\n\t\treturn nil, errors.Errorf(\"no such block number [%d] in index\", blockNum)\n\t}\n\tblkLoc := &fileLocPointer{}\n\tif err := blkLoc.unmarshal(b); err != nil {\n\t\treturn nil, err\n\t}\n\treturn blkLoc, nil\n}\n\nfunc (index *blockIndex) getTxLoc(txID string) (*fileLocPointer, error) {\n\tv, _, err := index.getTxIDVal(txID)\n\tif err != nil {","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/common/ledger/blkstorage/blockindex.go#L156-L192","documentation":"Duplicate slot for the family of 'block numbers not maintained in index': raised by blockIndex.getBlockLocByBlockNum when IndexableAttrBlockNum is absent from the index configuration. The operation is unsupported for this store's index settings.","triggerScenarios":"Any by-block-number retrieval (GetBlockByNumber/GetBlockHeaderByNumber), index range deletion, or syncIndex on a store configured without blockNum indexing.","commonSituations":"Custom minimal indexAttrs configs, mis-copied core.yaml, or programmatic blkstorage.Open with a restricted IndexConfig.","solutions":["Include blkstorage.IndexableAttrBlockNum in the index attrs config","Restore default (full) indexing configuration","Recreate/rebuild index DB after config change"],"exampleFix":"// before\nattrs: []blkstorage.IndexableAttr{blkstorage.IndexableAttrBlockHash}\n// after\nattrs: []blkstorage.IndexableAttr{blkstorage.IndexableAttrBlockHash, blkstorage.IndexableAttrBlockNum}","handlingStrategy":"validation","validationCode":"func ensureBlockNumIndexed(cfg *blkstorage.IndexConfig) error {\n    for _, a := range cfg.Attrs {\n        if a == blkstorage.IndexableAttrBlockNum { return nil }\n    }\n    return errors.New(\"blockNum indexing disabled: by-number lookups unavailable\")\n}","typeGuard":"func blockNumIndexed(attrs []blkstorage.IndexableAttr) bool {\n    for _, a := range attrs { if a == blkstorage.IndexableAttrBlockNum { return true } }\n    return false\n}","tryCatchPattern":"blk, err := store.RetrieveBlockByNumber(n)\nif err != nil {\n    if strings.Contains(err.Error(), \"not maintained in index\") {\n        return iterateToBlock(n) // fallback: sequential iterator\n    }\n    return err\n}","preventionTips":["Keep default full indexing config unless storage constraints are critical","Document which index attributes a deployment uses and guard by-number APIs on it","Recreate the index DB after changing indexAttrs"],"tags":["hyperledger-fabric","blockchain","configuration","ledger-index"],"backgroundTag":"index-attribute-not-enabled","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}