From a529149e6f51c8a6532abf4493e58ac635f68eea Mon Sep 17 00:00:00 2001 From: Leonard Lyubich Date: Thu, 11 Aug 2022 18:44:48 +0400 Subject: [PATCH] [#1632] node: Cache Sidechain errors along with the values In previous implementation failed requests to the Sidechain weren't cached. It makes sense to cache errors along with the values in order to decrease potential load spikes onto Sidechain nodes. Signed-off-by: Leonard Lyubich --- cmd/neofs-node/cache.go | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/cmd/neofs-node/cache.go b/cmd/neofs-node/cache.go index c3b9b401..9061744a 100644 --- a/cmd/neofs-node/cache.go +++ b/cmd/neofs-node/cache.go @@ -20,6 +20,8 @@ type netValueReader func(interface{}) (interface{}, error) type valueWithTime struct { v interface{} t time.Time + // cached error in order to not repeat failed request for some time + e error } // entity that provides TTL cache interface. @@ -57,23 +59,25 @@ func (c *ttlNetCache) get(key interface{}) (interface{}, error) { valWithTime := val.(*valueWithTime) if time.Since(valWithTime.t) < c.ttl { - return valWithTime.v, nil + return valWithTime.v, valWithTime.e } c.cache.Remove(key) } val, err := c.netRdr(key) - if err != nil { - return nil, err - } - c.cache.Add(key, &valueWithTime{ - v: val, + c.set(key, val, err) + + return val, err +} + +func (c *ttlNetCache) set(k, v interface{}, e error) { + c.cache.Add(k, &valueWithTime{ + v: v, t: time.Now(), + e: e, }) - - return val, nil } func (c *ttlNetCache) remove(key interface{}) {