[#1451] placement: Return copy of slice from container nodes cache

Nodes from cache could be changed by traverser, if no objectID specified.
So it is required to return copy of cache's slice.

Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
This commit is contained in:
Dmitrii Stepanov 2024-10-29 12:39:50 +03:00 committed by Evgenii Stratonikov
parent 3cf6ea745d
commit 7edec9193c

View file

@ -3,6 +3,7 @@ package placement
import ( import (
"crypto/sha256" "crypto/sha256"
"fmt" "fmt"
"slices"
"sync" "sync"
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
@ -44,7 +45,7 @@ func (c *ContainerNodesCache) ContainerNodes(nm *netmapSDK.NetMap, cnr cid.ID, p
raw, ok := c.containerCache.Get(cnr) raw, ok := c.containerCache.Get(cnr)
c.mtx.Unlock() c.mtx.Unlock()
if ok { if ok {
return raw, nil return c.cloneResult(raw), nil
} }
} else { } else {
c.lastEpoch = nm.Epoch() c.lastEpoch = nm.Epoch()
@ -65,5 +66,13 @@ func (c *ContainerNodesCache) ContainerNodes(nm *netmapSDK.NetMap, cnr cid.ID, p
c.containerCache.Add(cnr, cn) c.containerCache.Add(cnr, cn)
} }
c.mtx.Unlock() c.mtx.Unlock()
return cn, nil return c.cloneResult(cn), nil
}
func (c *ContainerNodesCache) cloneResult(nodes [][]netmapSDK.NodeInfo) [][]netmapSDK.NodeInfo {
result := make([][]netmapSDK.NodeInfo, len(nodes))
for repIdx := range nodes {
result[repIdx] = slices.Clone(nodes[repIdx])
}
return result
} }