mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-08-16 04:06:44 +00:00
* refactor: extract remote mount resolution into shared helpers * refactor: share the adaptive remote cache wait policy * filer: stream cold remote reads from the origin while caching * s3: stream cold remote reads from the origin instead of 503 retries * test: cover the S3 origin stream-through path * remote mounts: match on path components and prefer the longest mount * fail short origin streams instead of silently truncating * s3: try the origin before failing a cold read on a local cache error * s3: gate origin streaming on the entry's resolved version * return the cache RPC's NotFound as a canonical status and classify it everywhere * filer: keep multipart-range cold reads on the retry path
38 lines
1.4 KiB
Go
38 lines
1.4 KiB
Go
package s3api
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
|
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
|
"github.com/seaweedfs/seaweedfs/weed/s3api/s3err"
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/status"
|
|
)
|
|
|
|
// isFilerNotFound reports whether a filer error is a not-found.
|
|
// Unlike lookups (normalized in filer_pb.LookupEntry), list and cache errors
|
|
// cross gRPC as raw status errors, so the sentinel survives as codes.NotFound
|
|
// or only as text. Callers must pass errors from paths without user-controlled
|
|
// segments that could spoof it.
|
|
func isFilerNotFound(err error) bool {
|
|
if err == nil {
|
|
return false
|
|
}
|
|
return errors.Is(err, filer_pb.ErrNotFound) || status.Code(err) == codes.NotFound || strings.Contains(err.Error(), filer_pb.ErrNotFound.Error())
|
|
}
|
|
|
|
// ErrorHandlers provide common error handling patterns for S3 API operations
|
|
|
|
// handleMultipartError logs an error and returns the standard multipart error format
|
|
func handleMultipartError(operation string, err error, errorCode s3err.ErrorCode) (interface{}, s3err.ErrorCode) {
|
|
glog.Errorf("Failed to %s: %v", operation, err)
|
|
return nil, errorCode
|
|
}
|
|
|
|
// handleMultipartInternalError is a convenience wrapper for internal errors in multipart operations
|
|
func handleMultipartInternalError(operation string, err error) (interface{}, s3err.ErrorCode) {
|
|
return handleMultipartError(operation, err, s3err.ErrInternalError)
|
|
}
|