{"record":{"id":"70a2b6b620804e77","repo":"benbjohnson/litestream","slug":"oss-get-object-s-w","errorCode":null,"errorMessage":"oss: get object %s: %w","messagePattern":"oss: get object (.+?): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"oss/replica_client.go","lineNumber":222,"sourceCode":"\t\tBucket: oss.Ptr(c.Bucket),\n\t\tKey:    oss.Ptr(key),\n\t}\n\n\t// Set range header if offset is specified\n\tif size > 0 {\n\t\trequest.RangeBehavior = oss.Ptr(\"standard\")\n\t\trequest.Range = oss.Ptr(fmt.Sprintf(\"bytes=%d-%d\", offset, offset+size-1))\n\t} else if offset > 0 {\n\t\trequest.RangeBehavior = oss.Ptr(\"standard\")\n\t\trequest.Range = oss.Ptr(fmt.Sprintf(\"bytes=%d-\", offset))\n\t}\n\n\tresult, err := c.client.GetObject(ctx, request)\n\tif err != nil {\n\t\tif isNotExists(err) {\n\t\t\treturn nil, os.ErrNotExist\n\t\t}\n\t\treturn nil, fmt.Errorf(\"oss: get object %s: %w\", key, err)\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Inc()\n\n\treturn result.Body, nil\n}\n\n// WriteLTXFile writes an LTX file to the replica.\n// Extracts timestamp from LTX header and stores it in OSS metadata to preserve original creation time.\n// Uses multipart upload for large files via the uploader.\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, r io.Reader) (*ltx.FileInfo, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Use TeeReader to peek at LTX header while preserving data for upload\n\tvar buf bytes.Buffer\n\tteeReader := io.TeeReader(r, &buf)","sourceCodeStart":204,"sourceCodeEnd":240,"githubUrl":"https://github.com/benbjohnson/litestream/blob/4ed7a308f6271ebfd2b0a6e4b70b03011a37e4a3/oss/replica_client.go#L204-L240","documentation":"GetObject on the OSS bucket failed while opening an LTX file for read. The client first checks isNotExists(err) and translates a missing object into os.ErrNotExist; any other error (network, auth, permissions, invalid key) is wrapped with the object key for context.","triggerScenarios":"Calling OpenLTXFile for a key that exists but is inaccessible: expired/invalid credentials, wrong region endpoint, object deleted between listing and read, or transient network failure during restore/sync.","commonSituations":"Restoring a database whose LTX files were removed by a lifecycle rule; IAM/RAM policy lacking oss:GetObject; bucket in a different region than the configured endpoint; TLS/proxy interference in corporate networks.","solutions":["Inspect the wrapped underlying error for the OSS error code (AccessDenied, NoSuchBucket, RequestError) and fix accordingly.","Verify credentials (AccessKeyID/Secret) are valid and the RAM policy grants oss:GetObject on the bucket/path.","Confirm region/endpoint match the bucket's actual region (default is cn-hangzhou if Region is unset).","If the object is genuinely gone, restore from an older available LTX file or re-run 'litestream restore' after checking 'litestream ltx -level all'.","Retry on transient network errors; Litestream sync will retry on the next sync interval."],"exampleFix":"// before\nr, err := client.OpenLTXFile(ctx, pos)\nif err != nil { return err }\n// after\nr, err := client.OpenLTXFile(ctx, pos)\nif errors.Is(err, os.ErrNotExist) {\n    return nil // file not replicated yet; not fatal\n} else if err != nil {\n    return fmt.Errorf(\"read ltx: %w\", err)\n}","handlingStrategy":"try-catch","validationCode":"if _, err := client.HeadBucket(ctx); err != nil { /* credentials/region wrong before any read */ }","typeGuard":null,"tryCatchPattern":"r, err := client.OpenLTXFile(ctx, key)\nif errors.Is(err, os.ErrNotExist) {\n    return nil // expected: object not yet replicated\n}\nif err != nil {\n    return fmt.Errorf(\"open ltx from oss: %w\", err) // inspect wrapped OSS code\n}","preventionTips":["Grant oss:GetObject to the RAM role used by litestream.","Pin region/endpoint to the bucket's real region; do not rely on the cn-hangzhou default.","Disable lifecycle rules that could delete LTX files before retention expires."],"tags":["oss","network","read","storage"],"backgroundTag":"http-request-failed","analyzedSha":"4ed7a308f6271ebfd2b0a6e4b70b03011a37e4a3","analyzedAt":"2026-09-06T18:29:25.564Z","contentChangedAt":"2026-09-06T18:29:25.564Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}