From ae7333d28e77d907a9e7d50055e352c15678e723 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 10 Dec 2025 00:54:34 -0800 Subject: [PATCH] fix: cache successful volume lookups instead of failed ones (#7698) The condition was inverted - it was caching lookups with errors instead of successful lookups. This caused every replicated write to make a gRPC call to master for volume location lookup, resulting in ~1 second latency for writeToReplicas. The bug particularly affected TTL volumes because: - More unique volumes are created (separate pools per TTL) - Volumes expire and get recreated frequently - Each new volume requires a fresh lookup (cache miss) - Higher volume churn = more cache misses = more master lookups With this fix, successful lookups are cached for 10 minutes, reducing replication latency from ~1s to ~10ms for cached volumes. --- weed/operation/lookup.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/weed/operation/lookup.go b/weed/operation/lookup.go index 9e9c719b5..12ad37330 100644 --- a/weed/operation/lookup.go +++ b/weed/operation/lookup.go @@ -4,12 +4,13 @@ import ( "context" "errors" "fmt" - "github.com/seaweedfs/seaweedfs/weed/pb" - "google.golang.org/grpc" "math/rand/v2" "strings" "time" + "github.com/seaweedfs/seaweedfs/weed/pb" + "google.golang.org/grpc" + "github.com/seaweedfs/seaweedfs/weed/pb/master_pb" ) @@ -101,7 +102,7 @@ func LookupVolumeIds(masterFn GetMasterFn, grpcDialOption grpc.DialOption, vids GrpcPort: int(loc.GrpcPort), }) } - if vidLocations.Error != "" { + if vidLocations.Error == "" { vc.Set(vidLocations.VolumeOrFileId, locations, 10*time.Minute) } ret[vidLocations.VolumeOrFileId] = &LookupResult{