{"record":{"id":"1c1bdc4b02ca5f1f","repo":"juicedata/juicefs","slug":"src-get-s","errorCode":null,"errorMessage":"src get: %s","messagePattern":"src get: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/sync/sync.go","lineNumber":555,"sourceCode":"\t}\n\treturn chksum, nil\n}\n\nfunc compObjPartBinary(src, dst object.ObjectStorage, key string, abort chan struct{}, offset, length int64) error {\n\tif limiter != nil {\n\t\tlimiter.Wait(length)\n\t}\n\tselect {\n\tcase <-abort:\n\t\treturn fmt.Errorf(\"aborted\")\n\tcase concurrent <- 1:\n\t\tdefer func() {\n\t\t\t<-concurrent\n\t\t}()\n\t}\n\tin, err := src.Get(ctx, key, offset, length)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"src get: %s\", err)\n\t}\n\tdefer in.Close()\n\tin2, err := dst.Get(ctx, key, offset, length)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"dest get: %s\", err)\n\t}\n\tdefer in2.Close()\n\n\tbuf := bufPool.Get().(*[]byte)\n\tdefer bufPool.Put(buf)\n\tbuf2 := bufPool.Get().(*[]byte)\n\tdefer bufPool.Put(buf2)\n\tfor left := int(length); left > 0; left -= bufferSize {\n\t\tbs := bufferSize\n\t\tif left < bufferSize {\n\t\t\tbs = left\n\t\t}\n\t\t*buf = (*buf)[:bs]","sourceCodeStart":537,"sourceCodeEnd":573,"githubUrl":"https://github.com/juicedata/juicefs/blob/c9a67b23e8e08ec23ec331aa6f1675e2319e921c/pkg/sync/sync.go#L537-L573","documentation":"Wraps an error from src.Get(ctx, key, offset, length): the sync worker could not fetch the byte range of the object from the SOURCE storage while comparing it with the destination. The underlying storage error (network, 404, 403, throttling) is embedded after 'src get: '.","triggerScenarios":"Source object missing, credentials lacking GetObject permission, range GET unsupported/rejected by the backend, network interruption or rate limiting during compObjPartBinary.","commonSituations":"Syncing from S3 with revoked/expired keys; object deleted between listing and copy; self-signed or proxy-mangled TLS; minio endpoint misconfigured.","solutions":["Verify source credentials and GetObject permission on the bucket/key.","Confirm the source object still exists (it may have been deleted mid-sync); re-list and retry.","Check network/proxy/TLS configuration for the source endpoint.","Increase retries or run try(3) wrapped copy if errors are transient throttling (429/503)."],"exampleFix":"// before\nin, err := src.Get(ctx, key, offset, length)\nif err != nil {\n\treturn fmt.Errorf(\"src get: %s\", err)\n}\n// after: retry transient failures before giving up\nerr = try(3, func() error {\n\tin, err = src.Get(ctx, key, offset, length)\n\treturn err\n})\nif err != nil {\n\treturn fmt.Errorf(\"src get: %s\", err)\n}","handlingStrategy":"retry","validationCode":"// preflight before sync\nhead, err := src.Head(ctx, key)\nif err != nil {\n\treturn fmt.Errorf(\"source unreadable for %s: %w\", key, err)\n}","typeGuard":null,"tryCatchPattern":"err := try(3, func() error {\n\t_, e := src.Get(ctx, key, offset, length)\n\treturn e\n})\nif err != nil {\n\tlogger.Errorf(\"persistent src get failure for %s: %v\", key, err)\n}","preventionTips":["Validate source credentials with a HeadObject/List before starting long syncs","Exclude keys being concurrently written","Monitor for 429/503 and back off via thread reduction","Pin endpoints/regions and verify TLS/proxy settings"],"tags":["object-storage","network","read"],"backgroundTag":"api-request-failed","analyzedSha":"c9a67b23e8e08ec23ec331aa6f1675e2319e921c","analyzedAt":"2026-09-06T17:55:48.476Z","contentChangedAt":"2026-09-06T17:55:48.476Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}