From 6f524fb762b93fda8099eccbd501f3a4c685b79a Mon Sep 17 00:00:00 2001 From: chrislu Date: Mon, 3 Nov 2025 15:08:56 -0800 Subject: [PATCH] constant --- weed/s3api/filer_multipart.go | 2 +- weed/s3api/s3api_object_handlers_acl.go | 12 ++++++------ weed/s3api/s3api_object_handlers_list.go | 6 +++--- weed/s3api/s3api_object_handlers_put.go | 10 +++++----- weed/s3api/s3api_object_versioning.go | 24 ++++++++++++------------ 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/weed/s3api/filer_multipart.go b/weed/s3api/filer_multipart.go index d181d51da..cb4c73692 100644 --- a/weed/s3api/filer_multipart.go +++ b/weed/s3api/filer_multipart.go @@ -313,7 +313,7 @@ func (s3a *S3ApiServer) completeMultipartUpload(r *http.Request, input *s3.Compl // For versioned buckets, create a version and return the version ID versionId := generateVersionId() versionFileName := s3a.getVersionFileName(versionId) - versionDir := dirName + "/" + entryName + ".versions" + versionDir := dirName + "/" + entryName + s3_constants.VersionsFolder // Move the completed object to the versions directory err = s3a.mkFile(versionDir, versionFileName, finalParts, func(versionEntry *filer_pb.Entry) { diff --git a/weed/s3api/s3api_object_handlers_acl.go b/weed/s3api/s3api_object_handlers_acl.go index 1386b6cba..efa26e657 100644 --- a/weed/s3api/s3api_object_handlers_acl.go +++ b/weed/s3api/s3api_object_handlers_acl.go @@ -308,7 +308,7 @@ func (s3a *S3ApiServer) PutObjectAclHandler(w http.ResponseWriter, r *http.Reque if versioningConfigured { if versionId != "" && versionId != "null" { // Versioned object - update the specific version file in .versions directory - updateDirectory = s3a.option.BucketsPath + "/" + bucket + "/" + object + ".versions" + updateDirectory = s3a.option.BucketsPath + "/" + bucket + "/" + object + s3_constants.VersionsFolder } else { // Latest version in versioned bucket - could be null version or versioned object // Extract version ID from the entry to determine where it's stored @@ -320,11 +320,11 @@ func (s3a *S3ApiServer) PutObjectAclHandler(w http.ResponseWriter, r *http.Reque } if actualVersionId == "null" || actualVersionId == "" { - // Null version (pre-versioning object) - stored as regular file - updateDirectory = s3a.option.BucketsPath + "/" + bucket - } else { - // Versioned object - stored in .versions directory - updateDirectory = s3a.option.BucketsPath + "/" + bucket + "/" + object + ".versions" + // Null version (pre-versioning object) - stored as regular file + updateDirectory = s3a.option.BucketsPath + "/" + bucket + } else { + // Versioned object - stored in .versions directory + updateDirectory = s3a.option.BucketsPath + "/" + bucket + "/" + object + s3_constants.VersionsFolder } } } else { diff --git a/weed/s3api/s3api_object_handlers_list.go b/weed/s3api/s3api_object_handlers_list.go index f60dccee0..fc8d52cb9 100644 --- a/weed/s3api/s3api_object_handlers_list.go +++ b/weed/s3api/s3api_object_handlers_list.go @@ -510,8 +510,8 @@ func (s3a *S3ApiServer) doListFilerEntries(client filer_pb.SeaweedFilerClient, d continue } - // Skip .versions directories in regular list operations but track them for logical object creation - if strings.HasSuffix(entry.Name, ".versions") { + // Skip .versions directories in regular list operations but track them for logical object creation + if strings.HasSuffix(entry.Name, s3_constants.VersionsFolder) { glog.V(4).Infof("Found .versions directory: %s", entry.Name) versionsDirs = append(versionsDirs, entry.Name) continue @@ -566,7 +566,7 @@ func (s3a *S3ApiServer) doListFilerEntries(client filer_pb.SeaweedFilerClient, d } // Extract object name from .versions directory name (remove .versions suffix) - baseObjectName := strings.TrimSuffix(versionsDir, ".versions") + baseObjectName := strings.TrimSuffix(versionsDir, s3_constants.VersionsFolder) // Construct full object path relative to bucket // dir is something like "/buckets/sea-test-1/Veeam/Backup/vbr/Config" diff --git a/weed/s3api/s3api_object_handlers_put.go b/weed/s3api/s3api_object_handlers_put.go index 1fff23545..148df89f6 100644 --- a/weed/s3api/s3api_object_handlers_put.go +++ b/weed/s3api/s3api_object_handlers_put.go @@ -463,7 +463,7 @@ func (s3a *S3ApiServer) putSuspendedVersioningObject(r *http.Request, bucket, ob // Check if there's an existing null version in .versions directory and delete it // This ensures suspended versioning properly overwrites the null version as per S3 spec // Note: We only delete null versions, NOT regular versions (those should be preserved) - versionsObjectPath := normalizedObject + ".versions" + versionsObjectPath := normalizedObject + s3_constants.VersionsFolder versionsDir := bucketDir + "/" + versionsObjectPath entries, _, err := s3a.list(versionsDir, "", "", false, 1000) if err == nil { @@ -617,7 +617,7 @@ func (s3a *S3ApiServer) putSuspendedVersioningObject(r *http.Request, bucket, ob // when a new "null" version becomes the latest during suspended versioning func (s3a *S3ApiServer) updateIsLatestFlagsForSuspendedVersioning(bucket, object string) error { bucketDir := s3a.option.BucketsPath + "/" + bucket - versionsObjectPath := object + ".versions" + versionsObjectPath := object + s3_constants.VersionsFolder versionsDir := bucketDir + "/" + versionsObjectPath glog.V(2).Infof("updateIsLatestFlagsForSuspendedVersioning: updating flags for %s%s", bucket, object) @@ -696,12 +696,12 @@ func (s3a *S3ApiServer) putVersionedObject(r *http.Request, bucket, object strin // Upload directly to the versions directory // We need to construct the object path relative to the bucket - versionObjectPath := normalizedObject + ".versions/" + versionFileName + versionObjectPath := normalizedObject + s3_constants.VersionsFolder + "/" + versionFileName versionUploadUrl := s3a.toFilerUrl(bucket, versionObjectPath) // Ensure the .versions directory exists before uploading bucketDir := s3a.option.BucketsPath + "/" + bucket - versionsDir := normalizedObject + ".versions" + versionsDir := normalizedObject + s3_constants.VersionsFolder err := s3a.mkdir(bucketDir, versionsDir, func(entry *filer_pb.Entry) { entry.Attributes.Mime = s3_constants.FolderMimeType }) @@ -791,7 +791,7 @@ func (s3a *S3ApiServer) putVersionedObject(r *http.Request, bucket, object strin // updateLatestVersionInDirectory updates the .versions directory metadata to indicate the latest version func (s3a *S3ApiServer) updateLatestVersionInDirectory(bucket, object, versionId, versionFileName string) error { bucketDir := s3a.option.BucketsPath + "/" + bucket - versionsObjectPath := object + ".versions" + versionsObjectPath := object + s3_constants.VersionsFolder // Get the current .versions directory entry with retry logic for filer consistency var versionsEntry *filer_pb.Entry diff --git a/weed/s3api/s3api_object_versioning.go b/weed/s3api/s3api_object_versioning.go index 4f1ff901f..76e991ff0 100644 --- a/weed/s3api/s3api_object_versioning.go +++ b/weed/s3api/s3api_object_versioning.go @@ -95,7 +95,7 @@ func generateVersionId() string { // getVersionedObjectDir returns the directory path for storing object versions func (s3a *S3ApiServer) getVersionedObjectDir(bucket, object string) string { - return path.Join(s3a.option.BucketsPath, bucket, object+".versions") + return path.Join(s3a.option.BucketsPath, bucket, object+s3_constants.VersionsFolder) } // getVersionFileName returns the filename for a specific version @@ -116,7 +116,7 @@ func (s3a *S3ApiServer) createDeleteMarker(bucket, object string) (string, error // Make sure to clean up the object path to remove leading slashes cleanObject := strings.TrimPrefix(object, "/") bucketDir := s3a.option.BucketsPath + "/" + bucket - versionsDir := bucketDir + "/" + cleanObject + ".versions" + versionsDir := bucketDir + "/" + cleanObject + s3_constants.VersionsFolder // Create the delete marker entry in the .versions directory err := s3a.mkFile(versionsDir, versionFileName, nil, func(entry *filer_pb.Entry) { @@ -300,10 +300,10 @@ func (s3a *S3ApiServer) findVersionsRecursively(currentPath, relativePath string continue } - // Check if this is a .versions directory - if strings.HasSuffix(entry.Name, ".versions") { - // Extract object name from .versions directory name - objectKey := strings.TrimSuffix(entryPath, ".versions") + // Check if this is a .versions directory + if strings.HasSuffix(entry.Name, s3_constants.VersionsFolder) { + // Extract object name from .versions directory name + objectKey := strings.TrimSuffix(entryPath, s3_constants.VersionsFolder) normalizedObjectKey := removeDuplicateSlashes(objectKey) // Mark both keys as processed for backward compatibility processedObjects[objectKey] = true @@ -418,8 +418,8 @@ func (s3a *S3ApiServer) findVersionsRecursively(currentPath, relativePath string } } - // Check if a .versions directory exists for this object - versionsObjectPath := normalizedObjectKey + ".versions" + // Check if a .versions directory exists for this object + versionsObjectPath := normalizedObjectKey + s3_constants.VersionsFolder _, versionsErr := s3a.getEntry(currentPath, versionsObjectPath) if versionsErr == nil { // .versions directory exists @@ -497,7 +497,7 @@ func (s3a *S3ApiServer) getObjectVersionList(bucket, object string) ([]*ObjectVe // All versions are now stored in the .versions directory only bucketDir := s3a.option.BucketsPath + "/" + bucket - versionsObjectPath := object + ".versions" + versionsObjectPath := object + s3_constants.VersionsFolder glog.V(2).Infof("getObjectVersionList: checking versions directory %s", versionsObjectPath) // Get the .versions directory entry to read latest version metadata @@ -676,7 +676,7 @@ func (s3a *S3ApiServer) deleteSpecificObjectVersion(bucket, object, versionId st versionFile := s3a.getVersionFileName(versionId) // Check if this is the latest version before attempting deletion (for potential metadata update) - versionsEntry, dirErr := s3a.getEntry(path.Join(s3a.option.BucketsPath, bucket), normalizedObject+".versions") + versionsEntry, dirErr := s3a.getEntry(path.Join(s3a.option.BucketsPath, bucket), normalizedObject+s3_constants.VersionsFolder) isLatestVersion := false if dirErr == nil && versionsEntry.Extended != nil { if latestVersionIdBytes, hasLatest := versionsEntry.Extended[s3_constants.ExtLatestVersionIdKey]; hasLatest { @@ -715,7 +715,7 @@ func (s3a *S3ApiServer) deleteSpecificObjectVersion(bucket, object, versionId st func (s3a *S3ApiServer) updateLatestVersionAfterDeletion(bucket, object string) error { bucketDir := s3a.option.BucketsPath + "/" + bucket cleanObject := strings.TrimPrefix(object, "/") - versionsObjectPath := cleanObject + ".versions" + versionsObjectPath := cleanObject + s3_constants.VersionsFolder versionsDir := bucketDir + "/" + versionsObjectPath glog.V(1).Infof("updateLatestVersionAfterDeletion: updating latest version for %s/%s, listing %s", bucket, object, versionsDir) @@ -847,7 +847,7 @@ func (s3a *S3ApiServer) getLatestObjectVersion(bucket, object string) (*filer_pb normalizedObject := removeDuplicateSlashes(object) bucketDir := s3a.option.BucketsPath + "/" + bucket - versionsObjectPath := normalizedObject + ".versions" + versionsObjectPath := normalizedObject + s3_constants.VersionsFolder glog.V(1).Infof("getLatestObjectVersion: looking for latest version of %s/%s (normalized: %s)", bucket, object, normalizedObject)