hyperledger/fabric · warning
no such block number [%d] in index
Error message
no such block number [%d] in index
What it means
Returned by blockIndex.getBlockLocByBlockNum when a block-number index lookup succeeds at the levelDB layer but returns no value — the requested block number is simply not present in the index (e.g. beyond the ledger height or pruned).
Source
Thrown at common/ledger/blkstorage/blockindex.go:181
return nil, errors.Errorf("no such block hash [%x] in index", blockHash)
}
blkLoc := &fileLocPointer{}
if err := blkLoc.unmarshal(b); err != nil {
return nil, err
}
return blkLoc, nil
}
func (index *blockIndex) getBlockLocByBlockNum(blockNum uint64) (*fileLocPointer, error) {
if !index.isAttributeIndexed(IndexableAttrBlockNum) {
return nil, errors.New("block numbers not maintained in index")
}
b, err := index.db.Get(constructBlockNumKey(blockNum))
if err != nil {
return nil, err
}
if b == nil {
return nil, errors.Errorf("no such block number [%d] in index", blockNum)
}
blkLoc := &fileLocPointer{}
if err := blkLoc.unmarshal(b); err != nil {
return nil, err
}
return blkLoc, nil
}
func (index *blockIndex) getTxLoc(txID string) (*fileLocPointer, error) {
v, _, err := index.getTxIDVal(txID)
if err != nil {
return nil, err
}
txFLP := &fileLocPointer{}
if err = txFLP.unmarshal(v.TxLocation); err != nil {
return nil, err
}
return txFLP, nilView on GitHub (pinned to 2736b63f8f)
Solutions
- Validate blockNum against ledger height before calling
- Retry with backoff when polling for pending commits
- Rebuild index if entries below height are missing
- Confirm correct channel
Example fix
// before
blk, err := store.RetrieveBlockByNumber(n)
// after
if n >= info.Height { return nil }
blk, err := store.RetrieveBlockByNumber(n) Defensive patterns
Strategy: retry
Validate before calling
func blockInRange(ledger lgr.PeerLedger, num uint64) (bool, error) {
bc, err := ledger.GetBlockchainInfo()
if err != nil { return false, err }
return num < bc.Height, nil
} Type guard
func canFetchByNumber(num, height uint64) bool { return num < height } Try / catch
var blk *common.Block
var err error
for i := 0; i < maxRetries; i++ {
blk, err = store.RetrieveBlockByNumber(n)
if err == nil || !strings.Contains(err.Error(), "no such block number") { break }
time.Sleep(pollInterval) // block may not be committed yet
} Prevention
- Always check GetBlockchainInfo().Height before by-number fetch
- Remember block numbers are 0-based: max valid number is Height-1
- Use bounded retry/backoff when polling for pending blocks
- Confirm channel correctness when numbers come from external sources
When it happens
Trigger: By-number retrieval or index range deletion targeting a block number not in the index: future number, wrong ledger, or missing index entry.
Common situations: Polling for uncommitted blocks, snapshot/truncation-related index gaps, channel mismatch.
Related errors
- no such block hash [%x] in index
- block numbers not maintained in index
- transaction IDs not maintained in index
- organization %s not found
- error while trying to check the presence of TXID [%s]
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/e047497c08d0b7c6.
Report an issue: GitHub.