diff --git a/weed/s3api/filer_multipart.go b/weed/s3api/filer_multipart.go index 1e4635ead..8dca4cedc 100644 --- a/weed/s3api/filer_multipart.go +++ b/weed/s3api/filer_multipart.go @@ -187,7 +187,10 @@ func (s3a *S3ApiServer) completeMultipartUpload(r *http.Request, input *s3.Compl sort.Ints(completedPartNumbers) uploadDirectory := s3a.genUploadsFolder(*input.Bucket) + "/" + *input.UploadId - entries, _, err := s3a.list(uploadDirectory, "", "", false, 0) + // Use explicit limit to ensure all parts are listed (up to S3's max of 10,000 parts) + // Previously limit=0 relied on server's DirListingLimit default (1000 in weed server mode), + // which caused CompleteMultipartUpload to fail for uploads with more than 1000 parts. + entries, _, err := s3a.list(uploadDirectory, "", "", false, s3_constants.MaxS3MultipartParts+1) if err != nil { glog.Errorf("completeMultipartUpload %s %s error: %v, entries:%d", *input.Bucket, *input.UploadId, err, len(entries)) stats.S3HandlerCounter.WithLabelValues(stats.ErrorCompletedNoSuchUpload).Inc()