[#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
parent bec16a7e7c
commit b4adf43557
Signed by: dstepanov-yadro
GPG key ID: 237AF1A763293BC0

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
} }