diff --git a/weed/s3api/s3api_object_handlers_put.go b/weed/s3api/s3api_object_handlers_put.go index c61b6f8a7..0bb9d2795 100644 --- a/weed/s3api/s3api_object_handlers_put.go +++ b/weed/s3api/s3api_object_handlers_put.go @@ -643,7 +643,7 @@ func (s3a *S3ApiServer) updateLatestVersionInDirectory(bucket, object, versionId // Get the current .versions directory entry with retry logic for filer consistency var versionsEntry *filer_pb.Entry var err error - maxRetries := 3 + maxRetries := 5 for attempt := 1; attempt <= maxRetries; attempt++ { versionsEntry, err = s3a.getEntry(bucketDir, versionsObjectPath) if err == nil { @@ -653,8 +653,9 @@ func (s3a *S3ApiServer) updateLatestVersionInDirectory(bucket, object, versionId glog.V(0).Infof("CI-DEBUG: updateLatestVersionInDirectory: attempt %d/%d failed to get .versions entry for %s/%s: %v", attempt, maxRetries, bucket, object, err) if attempt < maxRetries { - // Brief wait before retry to allow filer consistency - time.Sleep(time.Millisecond * 50) + // Exponential backoff: 50ms, 100ms, 200ms, 400ms + delay := time.Millisecond * time.Duration(50 * (1 << (attempt - 1))) + time.Sleep(delay) } } diff --git a/weed/s3api/s3api_object_versioning.go b/weed/s3api/s3api_object_versioning.go index d3ced793a..df8ada047 100644 --- a/weed/s3api/s3api_object_versioning.go +++ b/weed/s3api/s3api_object_versioning.go @@ -785,7 +785,7 @@ func (s3a *S3ApiServer) getLatestObjectVersion(bucket, object string) (*filer_pb // Get the .versions directory entry to read latest version metadata with retry logic for filer consistency var versionsEntry *filer_pb.Entry var err error - maxRetries := 3 + maxRetries := 5 for attempt := 1; attempt <= maxRetries; attempt++ { versionsEntry, err = s3a.getEntry(bucketDir, versionsObjectPath) if err == nil { @@ -795,8 +795,9 @@ func (s3a *S3ApiServer) getLatestObjectVersion(bucket, object string) (*filer_pb glog.V(0).Infof("CI-DEBUG: getLatestObjectVersion: attempt %d/%d failed to get .versions directory for %s/%s: %v", attempt, maxRetries, bucket, object, err) if attempt < maxRetries { - // Brief wait before retry to allow filer consistency - time.Sleep(time.Millisecond * 50) + // Exponential backoff: 50ms, 100ms, 200ms, 400ms + delay := time.Millisecond * time.Duration(50 * (1 << (attempt - 1))) + time.Sleep(delay) } }