From c60029d3b0c0ea03ea3d7ed507c5c949a66b1807 Mon Sep 17 00:00:00 2001 From: Pavel Karpy Date: Thu, 4 May 2023 19:44:49 +0300 Subject: [PATCH] [#323] node: Fix tree svc panic If a connection has not been established earlier, it stores `nil` in LRU cache. Cache eviction tries to close every connection (even a `nil` one) and panics but not crash the app because we are using pools. That ugly bug also leads to a deadlock where `Unlock` is not called via `defer` func (and that is the way I found it). Signed-off-by: Pavel Karpy --- CHANGELOG.md | 1 + pkg/services/tree/cache.go | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19449efdd..29da78e74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Changelog for FrostFS Node ### Changed ### Fixed - Copy number was not used for `PUT` requests (#284) +- Tree service panic in its internal client cache (#323) ### Removed ### Updated diff --git a/pkg/services/tree/cache.go b/pkg/services/tree/cache.go index ab9f509ac..56b97e687 100644 --- a/pkg/services/tree/cache.go +++ b/pkg/services/tree/cache.go @@ -36,7 +36,9 @@ var errRecentlyFailed = errors.New("client has recently failed") func (c *clientCache) init() { l, _ := simplelru.NewLRU[string, cacheItem](defaultClientCacheSize, func(_ string, value cacheItem) { - _ = value.cc.Close() + if conn := value.cc; conn != nil { + _ = conn.Close() + } }) c.LRU = *l }