{"record":{"id":"07478b8f8136cdca","repo":"juicedata/juicefs","slug":"create-multipart-upload-failed-s","errorCode":null,"errorMessage":"create multipart upload failed: %s","messagePattern":"create multipart upload failed: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/objbench.go","lineNumber":1033,"sourceCode":"\t\t// Copy `/` suffixed object\n\t\tdefer blob.Delete(ctx, \"slash_test_file/\") //nolint:errcheck\n\t\tif err := blob.Put(ctx, \"slash_test_file/\", bytes.NewReader([]byte(\"1\"))); err != nil {\n\t\t\treturn fmt.Errorf(\"put `/` suffixed object failed: %s\", err)\n\t\t}\n\t\treturn nil\n\t})\n\n\trunCase(\"multipart upload\", func(blob object.ObjectStorage) (err error) {\n\t\tdefer func() {\n\t\t\terr = warning(err)\n\t\t}()\n\n\t\tkey := \"multi_test_file\"\n\t\tif err = blob.CompleteUpload(ctx, key, \"notExistsUploadId\", []*object.Part{}); err != utils.ErrNotSUP {\n\t\t\tdefer blob.Delete(ctx, key) //nolint:errcheck\n\t\t\tupload, err := blob.CreateMultipartUpload(ctx, key)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"create multipart upload failed: %s\", err)\n\t\t\t}\n\t\t\ttotal := 3\n\t\t\tseed := make([]byte, upload.MinPartSize)\n\t\t\tutils.RandRead(seed)\n\t\t\tparts := make([]*object.Part, total)\n\t\t\tcontent := make([][]byte, total)\n\t\t\tfor i := 0; i < total; i++ {\n\t\t\t\tcontent[i] = make([]byte, upload.MinPartSize)\n\t\t\t\tgetMockData(seed, i, &content[i])\n\t\t\t}\n\t\t\tvar eg errgroup.Group\n\t\t\teg.SetLimit(4)\n\t\t\tfor i := 1; i <= total; i++ {\n\t\t\t\tnum := i\n\t\t\t\teg.Go(func() error {\n\t\t\t\t\tvar err error\n\t\t\t\t\tparts[num-1], err = blob.UploadPart(ctx, key, upload.UploadID, num, content[num-1])\n\t\t\t\t\tif err != nil {","sourceCodeStart":1015,"sourceCodeEnd":1051,"githubUrl":"https://github.com/juicedata/juicefs/blob/c9a67b23e8e08ec23ec331aa6f1675e2319e921c/cmd/objbench.go#L1015-L1051","documentation":"objbench's multipart-upload test first checks CompleteUpload returns utils.ErrNotSUP (backend uses built-in multipart). If not, it starts a real multipart upload via CreateMultipartUpload and wraps failures with this message — meaning the backend refused to initiate a multipart upload.","triggerScenarios":"`blob.CreateMultipartUpload(ctx, \"multi_test_file\")` returns an error — backend doesn't implement MultipartUpload, lacks permission, or returns an API error.","commonSituations":"Stores without multipart support that don't properly return ErrNotSUP; missing s3:PutObject/Multipart permissions; restricted endpoints (e.g. some S3-compatible gateways).","solutions":["Read the wrapped backend error for the root cause","If the backend lacks multipart support, its driver should return utils.ErrNotSUP from CreateMultipartUpload","Grant multipart-upload permissions (e.g. s3:CreateMultipartUpload) on the bucket","Test with a backend known to support multipart"],"exampleFix":"// before\nupload, err := blob.CreateMultipartUpload(ctx, key)\nif err != nil { return fmt.Errorf(\"create multipart upload failed: %s\", err) }\n// after (driver without multipart support)\nfunc (s *store) CreateMultipartUpload(ctx context.Context, key string) (*object.MultipartUpload, error) {\n    return nil, utils.ErrNotSUP\n}","handlingStrategy":"fallback","validationCode":"if _, err := blob.CreateMultipartUpload(ctx, \"probe\"); err != nil {\n    // backend lacks multipart; use single-put path\n}\n_ = blob.AbortUpload(ctx, \"probe\", id) // cleanup if created","typeGuard":null,"tryCatchPattern":"upload, err := blob.CreateMultipartUpload(ctx, key)\nif err != nil {\n    if errors.Is(err, utils.ErrNotSUP) { /* fall back to Put */ }\n    return fmt.Errorf(\"create multipart upload failed: %s\", err)\n}","preventionTips":["Grant multipart permissions (s3:CreateMultipartUpload etc.)","Use backends with known multipart support","Drivers without multipart should return utils.ErrNotSUP"],"tags":["object-storage","multipart-upload","benchmark"],"backgroundTag":"unsupported-operation","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"}