hyperledger/fabric · warning
minimum requested sequence is %d but %s is at sequence %d
Error message
minimum requested sequence is %d but %s is at sequence %d
What it means
fetchLastBlockSeq fetches the latest block from an endpoint to decide whether to pull from it. If the remote node's latest sequence is below the minimum sequence the local node requires, the endpoint cannot help and this error is returned, causing probeEndpoint to skip it.
Source
Thrown at orderer/common/cluster/deliver.go:427
}
defer stream.abort()
resp, err := stream.Recv()
if err != nil {
p.Logger.Errorf("Failed receiving the latest block from %s: %v", endpoint, err)
return 0, nil, err
}
block, err := extractBlockFromResponse(resp)
if err != nil {
p.Logger.Warningf("Received %v from %s: %v", resp, endpoint, err)
return 0, nil, err
}
stream.CloseSend()
seq := block.Header.Number
if seq < minRequestedSequence {
err = errors.Errorf("minimum requested sequence is %d but %s is at sequence %d", minRequestedSequence, endpoint, seq)
p.Logger.Infof("Skipping pulling from %s: %v", endpoint, err)
return 0, nil, err
}
p.Logger.Infof("[channel: %s] %s is at block sequence of %d", p.Channel, endpoint, seq)
return block.Header.Number, stream.Certificate, nil
}
// requestBlocks starts requesting blocks from the given endpoint, using the given ImpatientStreamCreator by sending
// the given envelope.
// It returns a stream that is used to pull blocks, or error if something goes wrong.
func (p *BlockPuller) requestBlocks(endpoint string, newStream ImpatientStreamCreator, env *common.Envelope) (*ImpatientStream, error) {
stream, err := newStream()
if err != nil {
p.Logger.Warningf("Failed establishing deliver stream with %s", endpoint)
return nil, err
}
View on GitHub (pinned to 2736b63f8f)
Solutions
- Let the puller skip this endpoint and pull from an up-to-date orderer instead (default behavior)
- Wait for the lagging node to catch up before relying on it as a source
- Check the lagging node's consensus connectivity (Raft peers/Kafka) so it resumes ordering
Defensive patterns
Strategy: fallback
Try / catch
seq, cert, err := fetchLastBlockSeq(stream, endpoint)
if err != nil && strings.Contains(err.Error(), "minimum requested sequence") {
// endpoint is behind; try the next one
return probeEndpoint(nextEndpoint)
} Prevention
- Treat lagging nodes as pull sources of last resort
- Monitor per-node block heights and alert on lag
- Ensure Raft/Kafka connectivity so followers catch up quickly
When it happens
Trigger: probeEndpoint calls fetchLastBlockSeq with minRequestedSequence (e.g. the local height) and the remote orderer's latest block Header.Number is lower — the remote node is behind.
Common situations: A lagging or newly joined orderer is probed as a block source; the local node is ahead after the remote was down; probing a node of a different/forked chain.
Related errors
- got unexpected sequence from %s - (%d) instead of (%d)
- cannot create a block deliverer because height=0
- block is nil
- block data is nil
- block header is nil
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/5274f350efc46daf.
Report an issue: GitHub.