mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-09-28 02:44:23 +00:00
s3: fail over bucket-config writes when the owner filer is unreachable
patchBucketEntry dialed the bucket's ring owner directly, so a restarted filer's stale ring address hung every bucket-config write (versioning, lifecycle, object lock, ownership, ACL, policy, CORS) - the same failure as routed object writes. Route it through objectTxnOnFiler so it skips an unreachable owner and a live filer forwards by route_key.
This commit is contained in:
@@ -17,7 +17,6 @@ import (
|
||||
|
||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||
"github.com/seaweedfs/seaweedfs/weed/kms"
|
||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||
"github.com/seaweedfs/seaweedfs/weed/pb/s3_pb"
|
||||
"github.com/seaweedfs/seaweedfs/weed/s3api/cors"
|
||||
@@ -587,8 +586,7 @@ func (s3a *S3ApiServer) patchBucketEntry(bucket string, m *filer_pb.ObjectMutati
|
||||
RouteKey: objectWriteRouteKeyPrefix + bucketPath,
|
||||
Mutations: []*filer_pb.ObjectMutation{m},
|
||||
}
|
||||
txn := func(client filer_pb.SeaweedFilerClient) error {
|
||||
resp, err := client.ObjectTransaction(context.Background(), req)
|
||||
respErr := func(resp *filer_pb.ObjectTransactionResponse, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -598,11 +596,13 @@ func (s3a *S3ApiServer) patchBucketEntry(bucket string, m *filer_pb.ObjectMutati
|
||||
return nil
|
||||
}
|
||||
if s3a.objectWriteLockClient != nil {
|
||||
if owner := s3a.objectWriteLockClient.PrimaryForKey(objectWriteRouteKeyPrefix + bucketPath); owner != "" {
|
||||
return pb.WithFilerClient(false, 0, owner, s3a.option.GrpcDialOption, txn)
|
||||
if owner := s3a.objectWriteLockClient.PrimaryForKey(req.RouteKey); owner != "" {
|
||||
return respErr(s3a.objectTxnOnFiler(owner, req))
|
||||
}
|
||||
}
|
||||
return s3a.WithFilerClient(false, txn)
|
||||
return s3a.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error {
|
||||
return respErr(client.ObjectTransaction(context.Background(), req))
|
||||
})
|
||||
}
|
||||
|
||||
// isVersioningEnabled checks if versioning is enabled for a bucket (with caching)
|
||||
|
||||
Reference in New Issue
Block a user