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

  1. Check the target peer's gossip logs for membership construction errors
  2. Restart the peer to rebuild its membership view
  3. Verify channel membership and that the peer's local MSP identity is valid so full membership is gossiped
  4. Upgrade/downgrade peers to matching Fabric versions
  5. 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

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


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