aboutsummaryrefslogtreecommitdiff
path: root/weed/operation/lookup.go
diff options
context:
space:
mode:
authorChris Lu <chrislusf@users.noreply.github.com>2025-12-10 00:54:34 -0800
committerGitHub <noreply@github.com>2025-12-10 00:54:34 -0800
commitae7333d28e77d907a9e7d50055e352c15678e723 (patch)
tree4ffee8b47f42e10903691d2f9d6fac2910adeb7d /weed/operation/lookup.go
parent0cd9f341778775195fb44cc32d1434e63dba4fca (diff)
downloadseaweedfs-ae7333d28e77d907a9e7d50055e352c15678e723.tar.xz
seaweedfs-ae7333d28e77d907a9e7d50055e352c15678e723.zip
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.
Diffstat (limited to 'weed/operation/lookup.go')
-rw-r--r--weed/operation/lookup.go7
1 files 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{