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

  1. Let the puller skip this endpoint and pull from an up-to-date orderer instead (default behavior)
  2. Wait for the lagging node to catch up before relying on it as a source
  3. 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

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


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