From 98fcda66f2269d936f6ba4888047d6cb00bbd519 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 27 Mar 2026 12:53:11 -0700 Subject: [PATCH] make LockClient persistent on S3ApiServer Avoid per-request allocation by initializing the lock client once at server startup. The gRPC connections were already pooled; this eliminates the remaining struct allocation overhead. --- weed/s3api/s3api_object_handlers_put.go | 3 +-- weed/s3api/s3api_server.go | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/weed/s3api/s3api_object_handlers_put.go b/weed/s3api/s3api_object_handlers_put.go index dfbc9bdea..1110c380d 100644 --- a/weed/s3api/s3api_object_handlers_put.go +++ b/weed/s3api/s3api_object_handlers_put.go @@ -1854,8 +1854,7 @@ func (s3a *S3ApiServer) lockAndRecheckConditionalHeaders(r *http.Request, bucket } lockKey := s3a.toFilerPath(bucket, object) - lockClient := cluster.NewLockClient(s3a.option.GrpcDialOption, s3a.option.Filers[0]) - lock := lockClient.NewShortLivedLock(lockKey, fmt.Sprintf("s3-cond-%d", s3a.randomClientId)) + lock := s3a.lockClient.NewShortLivedLock(lockKey, fmt.Sprintf("s3-cond-%d", s3a.randomClientId)) entry, err := s3a.resolveObjectEntry(bucket, object) if err != nil { diff --git a/weed/s3api/s3api_server.go b/weed/s3api/s3api_server.go index f969582bc..1a7c320f7 100644 --- a/weed/s3api/s3api_server.go +++ b/weed/s3api/s3api_server.go @@ -82,6 +82,7 @@ type S3ApiServer struct { embeddedIam *EmbeddedIamApi // Embedded IAM API server (when enabled) stsHandlers *STSHandlers // STS HTTP handlers for AssumeRoleWithWebIdentity cipher bool // encrypt data on volume servers + lockClient *cluster.LockClient } func NewS3ApiServer(router *mux.Router, option *S3ApiServerOption) (s3ApiServer *S3ApiServer, err error) { @@ -180,6 +181,7 @@ func NewS3ApiServerWithStore(router *mux.Router, option *S3ApiServerOption, expl policyEngine: policyEngine, // Initialize bucket policy engine inFlightDataLimitCond: sync.NewCond(new(sync.Mutex)), cipher: option.Cipher, + lockClient: cluster.NewLockClient(option.GrpcDialOption, option.Filers[0]), } // Set s3a reference in circuit breaker for upload limiting