Browse Source

s3: Trace SSE chunk metadata through multipart completion and retrieval

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.
pull/7481/head
chrislu 1 month ago
parent
commit
e328c66d8d
  1. 9
      weed/s3api/filer_multipart.go
  2. 5
      weed/s3api/s3api_object_handlers.go

9
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 versionDir := dirName + "/" + entryName + s3_constants.VersionsFolder
// Move the completed object to the versions directory // 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) { 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 { if versionEntry.Extended == nil {
versionEntry.Extended = make(map[string][]byte) 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) glog.Errorf("completeMultipartUpload: failed to create version %s: %v", versionId, err)
return nil, s3err.ErrInternalError 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 // Update the .versions directory metadata to indicate this is the latest version
err = s3a.updateLatestVersionInDirectory(*input.Bucket, *input.Key, versionId, versionFileName) err = s3a.updateLatestVersionInDirectory(*input.Bucket, *input.Key, versionId, versionFileName)

5
weed/s3api/s3api_object_handlers.go

@ -1342,7 +1342,12 @@ func (s3a *S3ApiServer) HeadObjectHandler(w http.ResponseWriter, r *http.Request
} }
// Detect and handle SSE // 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) sseType := s3a.detectPrimarySSEType(objectEntryForSSE)
glog.V(0).Infof("GetObjectHandler: Detected SSE type: %s", sseType)
if sseType != "" && sseType != "None" { if sseType != "" && sseType != "None" {
// Validate SSE headers for encrypted objects // Validate SSE headers for encrypted objects
switch sseType { switch sseType {

Loading…
Cancel
Save