From 568973ec89b35354880561c7193b9d06f5461090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=9E=A8=E7=85=8A?= Date: Fri, 20 Jun 2025 17:39:56 +0800 Subject: [PATCH] feat: improve GetMulti method resilience and performance - Skip failed servers instead of returning early when PickServer fails - Pre-allocate result map with expected capacity to avoid dynamic resizing - Ensure partial results are returned even when some memcache servers are unavailable This change improves fault tolerance by allowing GetMulti to continue processing keys from healthy servers when some servers are down, while also optimizing memory allocation performance. Fixes issue where GetMulti would fail entirely if any single server was unreachable, now gracefully handles server failures and returns available data from functioning servers. --- memcache/memcache.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/memcache/memcache.go b/memcache/memcache.go index 6f48caa..d901d51 100644 --- a/memcache/memcache.go +++ b/memcache/memcache.go @@ -477,7 +477,7 @@ func (c *Client) touchFromAddr(addr net.Addr, keys []string, expiration int32) e // If no error is returned, the returned map will also be non-nil. func (c *Client) GetMulti(keys []string) (map[string]*Item, error) { var mu sync.Mutex - m := make(map[string]*Item) + m := make(map[string]*Item, len(keys)) addItemToMap := func(it *Item) { mu.Lock() defer mu.Unlock() @@ -491,7 +491,7 @@ func (c *Client) GetMulti(keys []string) (map[string]*Item, error) { } addr, err := c.selector.PickServer(key) if err != nil { - return nil, err + continue } keyMap[addr] = append(keyMap[addr], key) }