hasura/graphql-engine · error

reading metadata from response: %w

Error message

reading metadata from response: %w

What it means

After `metadata export` successfully receives a streaming response from the server, the CLI reads the response body with io.ReadAll. This error indicates reading the response stream failed partway — the connection dropped, the response was truncated, or the stream was otherwise interrupted after the request was accepted.

Source

Thrown at cli/commands/metadata_handlers.go:327

		return errors.E(op, err)
	}

	return nil
}

func export(o *MetadataExportOptions, mode cli.MetadataMode) error {
	var op errors.Op = "commands.export"

	metadata, err := ec.APIClient.V1Metadata.ExportMetadata()
	if err != nil {
		return errors.E(op, fmt.Errorf("exporting metadata from server: %w", err))
	}

	var metadataBytes []byte

	metadataBytes, err = io.ReadAll(metadata)
	if err != nil {
		return errors.E(op, fmt.Errorf("reading metadata from response: %w", err))
	}

	if mode == cli.MetadataModeYAML {
		metadataBytes, err = metadatautil.JSONToYAML(metadataBytes)
		if err != nil {
			return errors.E(op, fmt.Errorf("parsing metadata to yaml: %w", err))
		}
	}

	err = os.WriteFile(o.EC.MetadataFile, metadataBytes, os.ModePerm)
	if err != nil {
		return errors.E(op, fmt.Errorf("writing metadata to file: %w", err))
	}

	return nil
}

func apply(o *MetadataApplyOptions, mode cli.MetadataMode) error {

View on GitHub (pinned to 724551b9ae)

Solutions

  1. Retry the export — transient stream failures are the most common cause
  2. Check for proxy/LB response timeouts and raise them if the metadata document is large
  3. Inspect server logs to see if it terminated the response early (crash, OOM)
  4. If reproducible, capture the response with curl to confirm whether truncation is network-side or server-side
Defensive patterns

Strategy: retry

Try / catch

err := export(opts, mode)
for attempt := 0; err != nil && attempt < 3; attempt++ {
  if strings.Contains(err.Error(), "reading metadata from response") {
    time.Sleep(time.Duration(attempt+1) * time.Second)
    err = export(opts, mode)
  }
}

Prevention

When it happens

Trigger: `metadata export` where ExportMetadata succeeds but io.ReadAll on the response body fails: connection reset mid-transfer, proxy timeouts on large metadata payloads, TLS renegotiation failures, or the server closing the stream early.

Common situations: Large metadata documents exceeding proxy/load-balancer timeouts; flaky networks or VPN drops mid-response; aggressive idle-timeout settings on ingress controllers; server crash while streaming the response.

Related errors


AI-assisted analysis of hasura/graphql-engine@724551b9ae (2026-08-28). Data as JSON: /api/errors/a0152a64b7b7a825. Report an issue: GitHub.