{"record":{"id":"8cadcd8926e81a55","repo":"hashicorp/terraform","slug":"not-all-parts-uploaded-successfully-multipart-upl","errorCode":null,"errorMessage":"not all parts uploaded successfully, multipart upload aborted","messagePattern":"not all parts uploaded successfully, multipart upload aborted","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/backend/remote-state/oci/multipart_upload.go","lineNumber":147,"sourceCode":"\t\tcommitMultipartUploadPartDetails[i] = objectstorage.CommitMultipartUploadPartDetails{\n\t\t\tPartNum: common.Int(partNumber),\n\t\t\tEtag:    common.String(etag),\n\t\t}\n\t\ti++\n\t}\n\n\tif len(commitMultipartUploadPartDetails) != len(sourceBlocks) {\n\t\tabortReq := objectstorage.AbortMultipartUploadRequest{\n\t\t\tUploadId:      multipartUploadResponse.MultipartUpload.UploadId,\n\t\t\tNamespaceName: multipartUploadResponse.Namespace,\n\t\t\tBucketName:    multipartUploadResponse.Bucket,\n\t\t\tObjectName:    multipartUploadResponse.Object,\n\t\t}\n\t\t_, abortErr := multipartUploadData.client.objectStorageClient.AbortMultipartUpload(context.Background(), abortReq)\n\t\tif abortErr != nil {\n\t\t\tlogger.Error(fmt.Sprintf(\"Failed to abort multipart upload: %s\", abortErr))\n\t\t}\n\t\treturn fmt.Errorf(\"not all parts uploaded successfully, multipart upload aborted\")\n\t}\n\n\tcommitMultipartUploadRequest := objectstorage.CommitMultipartUploadRequest{\n\t\tUploadId:           multipartUploadResponse.MultipartUpload.UploadId,\n\t\tNamespaceName:      multipartUploadResponse.Namespace,\n\t\tBucketName:         multipartUploadResponse.Bucket,\n\t\tObjectName:         multipartUploadResponse.Object,\n\t\tOpcClientRequestId: multipartUploadResponse.OpcClientRequestId,\n\t\tRequestMetadata:    multipartUploadRequest.RequestMetadata,\n\t\tCommitMultipartUploadDetails: objectstorage.CommitMultipartUploadDetails{\n\t\t\tPartsToCommit: commitMultipartUploadPartDetails,\n\t\t},\n\t}\n\t_, err = multipartUploadData.client.objectStorageClient.CommitMultipartUpload(context.Background(), commitMultipartUploadRequest)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to commit multipart upload: %s\", err)\n\t}\n","sourceCodeStart":129,"sourceCodeEnd":165,"githubUrl":"https://github.com/hashicorp/terraform/blob/c9def3e214014c1188faabfc4a5bde5095139765/internal/backend/remote-state/oci/multipart_upload.go#L129-L165","documentation":"Raised when the number of successfully-collected part responses (commitMultipartUploadPartDetails) does not equal the number of source blocks after all workers finished. As a safety measure it then aborts the in-flight multipart upload via AbortMultipartUpload (multipart_upload.go:137-143) so no partial object is committed. It indicates parts were lost relative to the planned split.","triggerScenarios":"After wg.Wait() and error collection (multipart_upload.go:112-121), len(commitMultipartUploadPartDetails) != len(sourceBlocks) at line 136. Reachable when workers fail to push a response for every block (a worker exited early without Done, or responses were dropped) and the prior error checks did not already return.","commonSituations":"A worker hit a hard error path that failed to balance Done/response bookkeeping, leaving fewer responses than blocks; SDK edge cases producing partial response sets; concurrency/timing anomalies in the worker pool under heavy load.","solutions":["Re-run the apply; the abort leaves the bucket clean and a fresh attempt usually completes all parts.","Inspect TF_LOG for the worker error that preceded the count mismatch (the matching 'failed to upload part %d' or 'error reading source block').","Reduce concurrency pressure by lowering defaultNumberOfGoroutines or splitting the configuration into smaller states.","Ensure stable network/credentials for the whole upload window; mid-upload auth expiry can drop workers."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// No pure pre-check; ensure balanced bookkeeping so every block yields a response\n// (each worker must wg.Done() and push a response or error for every block it pulls).","typeGuard":null,"tryCatchPattern":"if len(commitMultipartUploadPartDetails) != len(sourceBlocks) {\n    // abort then return error (the lib does AbortMultipartUpload here)\n    return fmt.Errorf(\"not all parts uploaded successfully, multipart upload aborted\")\n}","preventionTips":["Retry the apply; the abort keeps the bucket clean.","Keep credentials stable for the whole upload window.","Reduce concurrency pressure if workers drop under load."],"tags":["oci","multipart-upload","abort","concurrency","data-integrity","terraform-state"],"analyzedSha":"c9def3e214014c1188faabfc4a5bde5095139765","analyzedAt":"2026-08-07T15:39:49.278Z","schemaVersion":2},"datasetVersion":"2026-08-07T21:17:07.882Z"}