diff --git a/.gitignore b/.gitignore index a20f5d6..e8309e0 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,8 @@ /vendor/ /Godeps/ +# Build artifacts +/build/ +checksums.txt + # End of https://www.toptal.com/developers/gitignore/api/go diff --git a/gen3-client/g3cmd/upload-multipart.go b/gen3-client/g3cmd/upload-multipart.go index f1dc1e6..789ac78 100644 --- a/gen3-client/g3cmd/upload-multipart.go +++ b/gen3-client/g3cmd/upload-multipart.go @@ -10,6 +10,7 @@ import ( "os" "sort" "strconv" + "strings" "sync" "time" @@ -130,6 +131,8 @@ func multipartUpload(g3 Gen3Interface, fileInfo FileInfo, retryCount int, bucket err = errors.New("No ETag found in header") return } + // Normalize ETag by trimming quotes (S3 returns quoted ETags) + eTag = strings.Trim(eTag, `"`) return }) if err != nil { @@ -140,6 +143,7 @@ func multipartUpload(g3 Gen3Interface, fileInfo FileInfo, retryCount int, bucket multipartUploadLock.Lock() // to avoid racing conditions parts = append(parts, (MultipartPartObject{PartNumber: chunkIndex, ETag: eTag})) + log.Printf("Appended part %d with ETag %s\n", chunkIndex, eTag) bar.Add(n) multipartUploadLock.Unlock() } @@ -165,6 +169,12 @@ func multipartUpload(g3 Gen3Interface, fileInfo FileInfo, retryCount int, bucket return parts[i].PartNumber < parts[j].PartNumber // sort parts in ascending order }) + // Log part details before completing multipart upload for debugging + log.Printf("Completing multipart upload with %d parts for file %s\n", len(parts), fileInfo.Filename) + for _, part := range parts { + log.Printf(" Part %d: ETag=%s\n", part.PartNumber, part.ETag) + } + if err = CompleteMultipartUpload(g3, key, uploadID, parts, bucketName); err != nil { logs.AddToFailedLog(fileInfo.FilePath, fileInfo.Filename, fileInfo.FileMetadata, guid, retryCount, true, true) err = fmt.Errorf("FAILED multipart upload for %s: %s", fileInfo.Filename, err.Error())