hyperledger/fabric · error
membership is empty
Error message
membership is empty
What it means
validateAliveMessage found an AliveMessage whose Membership field is nil. An AliveMsg must carry MembershipInfo (peer name, endpoint, PKI id, identity) for the discovery client to use it; without it the peer record is unusable, so validation fails and the error is wrapped by the endorser flow.
Source
Thrown at discovery/client/client.go:581
layouts []map[string]int
}
// NewClient creates a new Client instance
func NewClient(createConnection Dialer, s Signer, signerCacheSize uint) *Client {
return &Client{
createConnection: createConnection,
signRequest: NewMemoizeSigner(s, signerCacheSize).Sign,
}
}
func validateAliveMessage(message *gprotoext.SignedGossipMessage) error {
am := message.GetAliveMsg()
if am == nil {
return errors.New("message isn't an alive message")
}
m := am.Membership
if m == nil {
return errors.New("membership is empty")
}
if am.Timestamp == nil {
return errors.New("timestamp is nil")
}
return nil
}
func validateStateInfoMessage(message *gprotoext.SignedGossipMessage) error {
si := message.GetStateInfo()
if si == nil {
return errors.New("message isn't a stateInfo message")
}
if si.Timestamp == nil {
return errors.New("timestamp is nil")
}
if si.Properties == nil {
return errors.New("properties is nil")
}View on GitHub (pinned to 2736b63f8f)
Solutions
- Check the target peer's gossip logs for membership construction errors
- Restart the peer to rebuild its membership view
- Verify channel membership and that the peer's local MSP identity is valid so full membership is gossiped
- Upgrade/downgrade peers to matching Fabric versions
- Retry discovery against another peer
Defensive patterns
Strategy: validation
Validate before calling
func hasMembership(m *gprotoext.SignedGossipMessage) bool {
am := m.GetAliveMsg()
return am != nil && am.Membership != nil && am.Membership.Endpoint != ""
} Type guard
func isCompleteAliveMsg(m *gprotoext.SignedGossipMessage) bool {
am := m.GetAliveMsg()
return am != nil && am.Membership != nil
} Try / catch
if err != nil && strings.Contains(err.Error(), "membership is empty") {
return fmt.Errorf("discovery peer gossip incomplete: %w", err)
} Prevention
- Verify peer local MSP identity is valid so full membership is gossiped
- Monitor gossip membership counts per peer
- Restart peers that broadcast incomplete membership
When it happens
Trigger: A gossip AliveMessage in a discovery response has its Membership ( AliveMsg.Membership ) nil — typically a partially constructed or truncated membership message.
Common situations: Peer gossip emitting synthetic alive messages without full membership data; corrupted protobuf wire data; inter-version incompatibility dropping membership fields.
Related errors
- group %s isn't mapped to endorsers, but exists in a layout
- failed creating endorser object
- received empty envelope(s) for endorsers for chaincode %s, c
- message isn't an alive message
- timestamp is nil
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/c0b8604e8dd941e5.
Report an issue: GitHub.