From e328c66d8d525b0da75f02d6c06909d23bb25795 Mon Sep 17 00:00:00 2001 From: chrislu Date: Sat, 15 Nov 2025 12:38:18 -0800 Subject: [PATCH] s3: Trace SSE chunk metadata through multipart completion and retrieval MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added end-to-end logging to track SSE chunk metadata lifecycle: **During Multipart Completion (filer_multipart.go)**: 1. Log finalParts chunks BEFORE mkFile - shows SseType and metadata 2. Log versionEntry.Chunks INSIDE mkFile callback - shows if mkFile preserves SSE info 3. Log success after mkFile completes **During GET Retrieval (s3api_object_handlers.go)**: 1. Log retrieved entry chunks - shows SseType and metadata after retrieval 2. Log detected SSE type result This will reveal at which point SSE chunk metadata is lost: - If finalParts have SSE metadata but versionEntry.Chunks don't → mkFile bug - If versionEntry.Chunks have SSE metadata but retrieved chunks don't → storage/retrieval bug - If chunks never have SSE metadata → multipart completion SSE processing bug Expected to show chunks with SseType=NONE during retrieval even though they were created with proper SseType during multipart completion. --- weed/s3api/filer_multipart.go | 9 +++++++++ weed/s3api/s3api_object_handlers.go | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/weed/s3api/filer_multipart.go b/weed/s3api/filer_multipart.go index 69e7d1e5b..b145ed616 100644 --- a/weed/s3api/filer_multipart.go +++ b/weed/s3api/filer_multipart.go @@ -319,7 +319,15 @@ func (s3a *S3ApiServer) completeMultipartUpload(r *http.Request, input *s3.Compl versionDir := dirName + "/" + entryName + s3_constants.VersionsFolder // Move the completed object to the versions directory + glog.V(0).Infof("completeMultipartUpload: Creating version with %d finalParts chunks", len(finalParts)) + for i, chunk := range finalParts { + glog.V(0).Infof("completeMultipartUpload: finalParts[%d] - SseType=%v, hasMetadata=%v", i, chunk.SseType, len(chunk.SseMetadata) > 0) + } err = s3a.mkFile(versionDir, versionFileName, finalParts, func(versionEntry *filer_pb.Entry) { + glog.V(0).Infof("completeMultipartUpload: mkFile callback - entry has %d chunks", len(versionEntry.Chunks)) + for i, chunk := range versionEntry.Chunks { + glog.V(0).Infof("completeMultipartUpload: versionEntry.Chunks[%d] - SseType=%v, hasMetadata=%v", i, chunk.SseType, len(chunk.SseMetadata) > 0) + } if versionEntry.Extended == nil { versionEntry.Extended = make(map[string][]byte) } @@ -380,6 +388,7 @@ func (s3a *S3ApiServer) completeMultipartUpload(r *http.Request, input *s3.Compl glog.Errorf("completeMultipartUpload: failed to create version %s: %v", versionId, err) return nil, s3err.ErrInternalError } + glog.V(0).Infof("completeMultipartUpload: Successfully created version %s", versionId) // Update the .versions directory metadata to indicate this is the latest version err = s3a.updateLatestVersionInDirectory(*input.Bucket, *input.Key, versionId, versionFileName) diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 01158f2c6..8713ab6ac 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -1342,7 +1342,12 @@ func (s3a *S3ApiServer) HeadObjectHandler(w http.ResponseWriter, r *http.Request } // Detect and handle SSE + glog.V(0).Infof("GetObjectHandler: Retrieved entry for %s%s - %d chunks", bucket, object, len(objectEntryForSSE.Chunks)) + for i, chunk := range objectEntryForSSE.Chunks { + glog.V(0).Infof("GetObjectHandler: Retrieved chunk[%d] - SseType=%v, hasMetadata=%v, FileId=%s", i, chunk.SseType, len(chunk.SseMetadata) > 0, chunk.FileId) + } sseType := s3a.detectPrimarySSEType(objectEntryForSSE) + glog.V(0).Infof("GetObjectHandler: Detected SSE type: %s", sseType) if sseType != "" && sseType != "None" { // Validate SSE headers for encrypted objects switch sseType {