hasura/graphql-engine · error

reading metadata from response: %w

Error message

reading metadata from response: %w

What it means

After ExportMetadata succeeds, the CLI reads the full response body with io.ReadAll. This error means reading that response stream failed mid-transfer — the connection dropped, the server closed the stream early, or the reader returned an I/O error. Distinct from error 365, which is the API call itself failing.

Source

Thrown at cli/pkg/metadata/mode_handlers.go:288

		return nil, errors.E(op, fmt.Errorf("encoding json response from server: %w", err))
	}

	return b, nil
}

func export(p *ProjectMetadata, mode cli.MetadataMode) (io.Reader, error) {
	var op errors.Op = "metadata.export"

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

	var metadataBytes []byte

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

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

	return bytes.NewReader(metadataBytes), nil
}

View on GitHub (pinned to 724551b9ae)

Solutions

  1. Retry the export — transient stream failures usually succeed on a second attempt
  2. Increase proxy/load-balancer response timeouts for the Hasura endpoint if metadata is large
  3. Check server logs for restarts/OOMs that abort responses mid-stream
  4. Reduce metadata size (remove unused tracked tables/remote schemas) if payloads are consistently truncated
Defensive patterns

Strategy: retry

Try / catch

var r io.Reader
for attempt := 0; attempt < 3; attempt++ {
    var err error
    r, err = pm.Export(ctx, mode)
    if err == nil || !strings.Contains(err.Error(), "reading metadata from response") {
        break
    }
    time.Sleep(time.Duration(attempt+1) * time.Second)
}

Prevention

When it happens

Trigger: Calling Export when the HTTP response body is interrupted: server closing the connection partway, proxy/load-balancer idle timeouts on large metadata payloads, or network disruption during streaming of the response body.

Common situations: Large metadata payloads truncated by an nginx/ALB timeout; flaky connections from CI; HTTP/2 stream resets between client and server; keep-alive connections killed by intermediaries.

Related errors


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