{"record":{"id":"25bd9ce8e4769a1a","repo":"hashicorp/terraform","slug":"failed-to-read-state-file-from-v-v","errorCode":null,"errorMessage":"Failed to read state file from %v: %v","messagePattern":"Failed to read state file from (.+?): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/backend/remote-state/gcs/client.go","lineNumber":47,"sourceCode":"\tencryptionKey []byte\n\tkmsKeyName    string\n}\n\nfunc (c *remoteClient) Get() (payload *remote.Payload, diags tfdiags.Diagnostics) {\n\tctx := context.TODO()\n\tstateFileReader, err := c.stateFile().NewReader(ctx)\n\tif err != nil {\n\t\tif err == storage.ErrObjectNotExist {\n\t\t\treturn nil, diags\n\t\t} else {\n\t\t\treturn nil, diags.Append(fmt.Errorf(\"Failed to open state file at %v: %v\", c.stateFileURL(), err))\n\t\t}\n\t}\n\tdefer stateFileReader.Close()\n\n\tstateFileContents, err := ioutil.ReadAll(stateFileReader)\n\tif err != nil {\n\t\treturn nil, diags.Append(fmt.Errorf(\"Failed to read state file from %v: %v\", c.stateFileURL(), err))\n\t}\n\n\tstateFileAttrs, err := c.stateFile().Attrs(ctx)\n\tif err != nil {\n\t\treturn nil, diags.Append(fmt.Errorf(\"Failed to read state file attrs from %v: %v\", c.stateFileURL(), err))\n\t}\n\n\tresult := &remote.Payload{\n\t\tData: stateFileContents,\n\t\tMD5:  stateFileAttrs.MD5,\n\t}\n\n\treturn result, diags\n}\n\nfunc (c *remoteClient) Put(data []byte) tfdiags.Diagnostics {\n\tvar diags tfdiags.Diagnostics\n\tctx := context.TODO()","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/hashicorp/terraform/blob/d32a084675427f5ac3f7d2868578ef8b2c1dc525/internal/backend/remote-state/gcs/client.go#L29-L65","documentation":"Thrown by Get after the reader was opened successfully but ioutil.ReadAll failed while streaming the state object's bytes. The reader was constructed but the transfer aborted partway.","triggerScenarios":"ioutil.ReadAll(stateFileReader) returns an error — connection reset mid-stream, payload too large for available memory, decompression error, or transient GCS read timeout.","commonSituations":"Large state file over a flaky connection; GCS returns partial data then closes; client timeout (http client transport) cancelled the stream; memory pressure in CI runners.","solutions":["Retry the read; streaming errors are frequently transient.","Check for client-side HTTP timeout configuration that may cancel long reads.","If state is unusually large, consider splitting or pruning resources to reduce size.","Inspect the wrapped %v for transport-level detail (e.g., 'unexpected EOF')."],"exampleFix":"// no code change — retry terraform; if persistent:\n// increase http timeout / verify network stability","handlingStrategy":"retry","validationCode":"// No deterministic pre-check; size-check the object if known.\n// gsutil ls -L gs://bucket/prefix/default.tfstate","typeGuard":null,"tryCatchPattern":"// Retry the read with backoff on transient stream errors.\nvar contents []byte\nfor i := 0; i < 3; i++ {\n    r, err := f.NewReader(ctx)\n    if err != nil { ... }\n    contents, err = ioutil.ReadAll(r)\n    r.Close()\n    if err == nil { break }\n    if !isTransient(err) { return err }\n}","preventionTips":["Increase client HTTP timeout if reading large state files.","Run terraform from hosts with stable connectivity to GCS.","Split very large states to reduce per-read size."],"tags":["gcs","backend","storage","network","state-read","transient"],"backgroundTag":null,"analyzedSha":"d32a084675427f5ac3f7d2868578ef8b2c1dc525","analyzedAt":"2026-08-11T18:43:52.779Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}