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, nil

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Validate blockNum against ledger height before calling
  2. Retry with backoff when polling for pending commits
  3. Rebuild index if entries below height are missing
  4. 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

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


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/e047497c08d0b7c6. Report an issue: GitHub.