{"record":{"id":"6e31f19a00e3495c","repo":"hasura/graphql-engine","slug":"reading-metadata-from-response-w-6e31f1","errorCode":null,"errorMessage":"reading metadata from response: %w","messagePattern":"reading metadata from response: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/pkg/metadata/mode_handlers.go","lineNumber":288,"sourceCode":"\t\treturn nil, errors.E(op, fmt.Errorf(\"encoding json response from server: %w\", err))\n\t}\n\n\treturn b, nil\n}\n\nfunc export(p *ProjectMetadata, mode cli.MetadataMode) (io.Reader, error) {\n\tvar op errors.Op = \"metadata.export\"\n\n\tmetadata, err := p.ec.APIClient.V1Metadata.ExportMetadata()\n\tif err != nil {\n\t\treturn nil, errors.E(op, fmt.Errorf(\"exporting metadata from server: %w\", err))\n\t}\n\n\tvar metadataBytes []byte\n\n\tmetadataBytes, err = io.ReadAll(metadata)\n\tif err != nil {\n\t\treturn nil, errors.E(op, fmt.Errorf(\"reading metadata from response: %w\", err))\n\t}\n\n\tif mode == cli.MetadataModeYAML {\n\t\tmetadataBytes, err = metadatautil.JSONToYAML(metadataBytes)\n\t\tif err != nil {\n\t\t\treturn nil, errors.E(op, fmt.Errorf(\"parsing metadata to yaml: %w\", err))\n\t\t}\n\t}\n\n\treturn bytes.NewReader(metadataBytes), nil\n}\n","sourceCodeStart":270,"sourceCodeEnd":300,"githubUrl":"https://github.com/hasura/graphql-engine/blob/724551b9ae87845594ef0408cff0e50eb6c90dc5/cli/pkg/metadata/mode_handlers.go#L270-L300","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Retry the export — transient stream failures usually succeed on a second attempt","Increase proxy/load-balancer response timeouts for the Hasura endpoint if metadata is large","Check server logs for restarts/OOMs that abort responses mid-stream","Reduce metadata size (remove unused tracked tables/remote schemas) if payloads are consistently truncated"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"var r io.Reader\nfor attempt := 0; attempt < 3; attempt++ {\n    var err error\n    r, err = pm.Export(ctx, mode)\n    if err == nil || !strings.Contains(err.Error(), \"reading metadata from response\") {\n        break\n    }\n    time.Sleep(time.Duration(attempt+1) * time.Second)\n}","preventionTips":["Raise proxy/LB response timeouts for large metadata payloads","Retry transient stream failures before escalating","Monitor server stability during bulk metadata operations"],"tags":["network","io","metadata","timeout","hasura-cli"],"backgroundTag":"response-stream-interrupted","analyzedSha":"724551b9ae87845594ef0408cff0e50eb6c90dc5","analyzedAt":"2026-08-28T07:32:55.105Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}