hyperledger/fabric · error

failed parsing orderer endpoint %s

Error message

failed parsing orderer endpoint %s

What it means

This error means an entry in the global orderer address list could not be split into host and port with net.SplitHostPort, so the discovery service cannot build discovery.Endpoint entries. Because per-org endpoints are absent, globalEndpoints falls back to the channel-level orderer addresses (orderer.group values / general orderer addresses), and any malformed address aborts the whole computation. The message includes the offending endpoint string.

Source

Thrown at discovery/support/config/support.go:188

				return nil, errors.Wrap(err, "failed unmarshalling orderer addresses")
			}
			// Override the mapping because this orderer org config contains org-specific endpoints.
			res[fabricConfig.Name] = ordererEndpoints.Addresses
		}
	}

	return res, nil
}

func globalEndpoints(endpointsByMSPID map[string][]string, ordererAddresses []string) (map[string]*discovery.Endpoints, error) {
	res := make(map[string]*discovery.Endpoints)

	for mspID := range endpointsByMSPID {
		res[mspID] = &discovery.Endpoints{}
		for _, endpoint := range ordererAddresses {
			host, portStr, err := net.SplitHostPort(endpoint)
			if err != nil {
				return nil, errors.Errorf("failed parsing orderer endpoint %s", endpoint)
			}
			port, err := strconv.ParseInt(portStr, 10, 32)
			if err != nil {
				return nil, errors.Errorf("%s is not a valid port number", portStr)
			}
			res[mspID].Endpoint = append(res[mspID].Endpoint, &discovery.Endpoint{
				Host: host,
				Port: uint32(port),
			})
		}
	}
	return res, nil
}

func appendMSPConfigs(ordererGrp, appGrp map[string]*common.ConfigGroup, output map[string]*msp.FabricMSPConfig) error {
	for _, group := range []map[string]*common.ConfigGroup{ordererGrp, appGrp} {
		for _, grp := range group {
			mspConfig := &msp.MSPConfig{}

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Correct the orderer address in channel config / configtx.yaml to include an explicit port, e.g. orderer.example.com:7050.
  2. Regenerate and update the channel config with configtxgen/configtxlator after fixing the addresses.
  3. Validate each address with net.SplitHostPort locally before submitting config updates.
  4. Check for whitespace or bad IPv6 bracket formatting in OrdererAddresses values.

Example fix

// before (configtx.yaml / channel config)
OrdererAddresses:
  - orderer.example.com
// after
OrdererAddresses:
  - orderer.example.com:7050
Defensive patterns

Strategy: validation

Validate before calling

func validateOrdererAddresses(addrs []string) error {
    for _, a := range addrs {
        if _, _, err := net.SplitHostPort(a); err != nil {
            return fmt.Errorf("orderer address %q must be host:port", a)
        }
    }
    return nil
}
// call before invoking discovery / before config update:
// err := validateOrdererAddresses(globalOrdererAddresses)

Type guard

func isHostPort(s string) bool {
    host, port, err := net.SplitHostPort(s)
    if err != nil || host == "" || port == "" {
        return false
    }
    n, err := strconv.Atoi(port)
    return err == nil && n > 0 && n < 65536
}

Try / catch

eps, err := support.OrdererEndpoints()
if err != nil {
    if strings.Contains(err.Error(), "failed parsing orderer endpoint") {
        // fall back to known-good statically configured orderer list
    }
    return err
}

Prevention

When it happens

Trigger: globalEndpoints (called by computeOrdererEndpoints when no per-org endpoints exist) iterates ordererAddresses; net.SplitHostPort returns an error for addresses missing a port ('orderer.example.com'), using brackets incorrectly, containing spaces, or otherwise not host:port.

Common situations: Orderer.General.ListenAddress or channel config OrdererAddresses values set without :port; migration from older Fabric configs where addresses were host-only; configtx.yaml typos; environment variable substitution dropping the port.

Related errors


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