hyperledger/fabric · error

Attempted to set the batch timeout to a invalid value: %s

Error message

Attempted to set the batch timeout to a invalid value: %s

What it means

validateBatchTimeout parses Orderer.BatchTimeout.Timeout with time.ParseDuration. If the string is not a valid Go duration (e.g. missing a unit), ParseDuration fails and this error wraps the parse error, rejecting the orderer channel config.

Source

Thrown at common/channelconfig/orderer.go:234

		return fmt.Errorf("Attempted to set the batch size max message count to an invalid value: 0")
	}
	if oc.protos.BatchSize.AbsoluteMaxBytes == 0 {
		return fmt.Errorf("Attempted to set the batch size absolute max bytes to an invalid value: 0")
	}
	if oc.protos.BatchSize.PreferredMaxBytes == 0 {
		return fmt.Errorf("Attempted to set the batch size preferred max bytes to an invalid value: 0")
	}
	if oc.protos.BatchSize.PreferredMaxBytes > oc.protos.BatchSize.AbsoluteMaxBytes {
		return fmt.Errorf("Attempted to set the batch size preferred max bytes (%v) greater than the absolute max bytes (%v).", oc.protos.BatchSize.PreferredMaxBytes, oc.protos.BatchSize.AbsoluteMaxBytes)
	}
	return nil
}

func (oc *OrdererConfig) validateBatchTimeout() error {
	var err error
	oc.batchTimeout, err = time.ParseDuration(oc.protos.BatchTimeout.Timeout)
	if err != nil {
		return fmt.Errorf("Attempted to set the batch timeout to a invalid value: %s", err)
	}
	if oc.batchTimeout <= 0 {
		return fmt.Errorf("Attempted to set the batch timeout to a non-positive value: %s", oc.batchTimeout)
	}
	return nil
}

func (oc *OrdererConfig) validateAllOrgsHaveEndpoints() error {
	var orgsMissingEndpoints []string

	for _, org := range oc.Organizations() {
		if len(org.Endpoints()) == 0 {
			orgsMissingEndpoints = append(orgsMissingEndpoints, org.Name())
		}
	}

	if len(orgsMissingEndpoints) > 0 {
		return errors.Errorf("some orderer organizations endpoints are empty: %s", orgsMissingEndpoints)

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Fix BatchTimeout in configtx.yaml to a valid Go duration with unit, e.g. "2s"
  2. Do not use bare numbers; always include s/m/h suffix
  3. Rerun configtxgen and recreate/update the channel config

Example fix

# before (configtx.yaml)
BatchTimeout: 2
# after
BatchTimeout: 2s
Defensive patterns

Strategy: validation

Validate before calling

func validDuration(s string) error {
	_, err := time.ParseDuration(s)
	return err
}
if err := validDuration(cfg.Orderer.BatchTimeout); err != nil {
	return fmt.Errorf("BatchTimeout must be a Go duration like \"2s\": %w", err)
}

Try / catch

_, err := channelconfig.NewOrdererConfig(ordererGroup, cryptoProvider)
if err != nil && strings.Contains(err.Error(), "batch timeout to a invalid value") {
	return fmt.Errorf("fix BatchTimeout in configtx.yaml to include a unit (e.g. \"2s\"): %w", err)
}

Prevention

When it happens

Trigger: BatchTimeout value in configtx.yaml like "2" (no unit), "2m30" (partial unit), or empty string, passed through configtxgen / channel config creation.

Common situations: Typos in configtx.yaml; writing a plain integer seconds value assuming implicit seconds; templating tools that emit empty BatchTimeout when a variable is unset; YAML quoting issues that stringify a map instead of a duration string.

Understand the failure class

Background: "invalid duration" / "failed to parse duration": why your timeout, interval, or TTL string is rejected and which formats each library accepts — this error's family across 32 libraries.

Related errors


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