Skip to content

Commit a601804

Browse files
committed
BACKUP: node/object: Cache storage policy execution results
Signed-off-by: Leonard Lyubich <[email protected]>
1 parent 4439588 commit a601804

File tree

3 files changed

+302
-54
lines changed

3 files changed

+302
-54
lines changed

cmd/neofs-node/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,8 @@ type cfgObject struct {
473473
cfgLocalStorage cfgLocalStorage
474474

475475
tombstoneLifetime uint64
476+
477+
containerNodesBuilder *containerNodesBuilder
476478
}
477479

478480
type cfgNotifications struct {

cmd/neofs-node/object.go

Lines changed: 17 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -599,32 +599,15 @@ func (c *cfg) getContainerNodesFromNetworkMap(networkMap *netmapsdk.NetMap, cnrI
599599
return
600600
}
601601

602-
func (c *cfg) getContainerNodesAtEpoch(cnrID cid.ID, epoch uint64) (
603-
nodeSets [][]netmapsdk.NodeInfo,
604-
storagePolicy netmapsdk.PlacementPolicy,
605-
networkMap *netmapsdk.NetMap,
606-
err error,
607-
) {
608-
networkMap, err = c.netMapSource.GetNetMapByEpoch(epoch)
609-
if err != nil {
610-
err = fmt.Errorf("read network map by epoch: %w", err)
611-
return
612-
}
613-
614-
nodeSets, storagePolicy, err = c.getContainerNodesFromNetworkMap(networkMap, cnrID)
615-
616-
return
617-
}
618-
619602
// GetContainerNodesAtEpoch reads storage policy of the referenced container
620603
// from the underlying container storage, reads network map at the specified
621604
// epoch from the underlying storage, applies the storage policy to it and
622605
// returns sets of selected storage nodes.
623606
//
624607
// GetContainerNodesAtEpoch implements [searchsvc.Node].
625608
func (c *cfg) GetContainerNodesAtEpoch(cnr cid.ID, epoch uint64) ([][]netmapsdk.NodeInfo, error) {
626-
nodeSets, _, _, err := c.getContainerNodesAtEpoch(cnr, epoch)
627-
return nodeSets, err
609+
cnrNodes, _, err := c.cfgObject.containerNodesBuilder.getForEpoch(cnr, epoch)
610+
return cnrNodes.nodeSets, err
628611
}
629612

630613
// IsLocalPublicKey implements [searchsvc.Node], [getsvc.Node].
@@ -640,60 +623,40 @@ func (c *cfg) IsLocalPublicKey(bPubKey []byte) bool {
640623
//
641624
// GetObjectNodesAtEpoch implements [getsvc.Node].
642625
func (c *cfg) GetObjectNodesAtEpoch(addr oid.Address, epoch uint64) ([][]netmapsdk.NodeInfo, []uint32, error) {
643-
nodeLists, storagePolicy, networkMap, err := c.getContainerNodesAtEpoch(addr.Container(), epoch)
626+
cnrNodes, err := c.cfgObject.containerNodesBuilder.getForObjectAtEpoch(addr, epoch)
644627
if err != nil {
645628
return nil, nil, err
646629
}
647630

648-
nodeLists, err = networkMap.PlacementVectors(nodeLists, addr.Object())
649-
if err != nil {
650-
return nil, nil, fmt.Errorf("apply object's storage policy to the network map: %w", err)
651-
}
652-
653-
primaryNums := make([]uint32, storagePolicy.NumberOfReplicas())
654-
for i := range primaryNums {
655-
primaryNums[i] = storagePolicy.ReplicaNumberByIndex(i)
656-
}
657-
658-
return nodeLists, primaryNums, nil
631+
return cnrNodes.nodeSets, cnrNodes.primaryNodesNums, nil
659632
}
660633

661634
// TODO: docs
662635
func (c *cfg) ObjectStoragePolicyForContainer(cnrID cid.ID) (putsvc.ObjectStoragePolicy, error) {
663-
networkMap, err := netmap.GetLatestNetworkMap(c.netMapSource)
664-
if err != nil {
665-
return nil, fmt.Errorf("read current network map: %w", err)
666-
}
667-
668-
nodeSets, storagePolicy, err := c.getContainerNodesFromNetworkMap(networkMap, cnrID)
636+
cnrNodes, networkMap, cache, err := c.cfgObject.containerNodesBuilder._getForEpoch(cnrID, 0)
669637
if err != nil {
670-
return nil, fmt.Errorf("get storage nodes for the container in the current network map: %w", err)
671-
}
672-
673-
primaryNodeNums := make([]uint32, storagePolicy.NumberOfReplicas())
674-
for i := range primaryNodeNums {
675-
primaryNodeNums[i] = storagePolicy.ReplicaNumberByIndex(i)
638+
return nil, err
676639
}
677640

678-
return containerStoragePolicy{
679-
networkMap: networkMap,
680-
nodeSets: nodeSets,
681-
primaryNodeNums: primaryNodeNums,
641+
return &containerStoragePolicy{
642+
networkMap: networkMap,
643+
cnrNodes: cnrNodes,
644+
cache: cache,
682645
}, nil
683646
}
684647

685648
type containerStoragePolicy struct {
686-
networkMap *netmapsdk.NetMap
687-
nodeSets [][]netmapsdk.NodeInfo
688-
primaryNodeNums []uint32
649+
networkMap *netmapsdk.NetMap
650+
cnrNodes containerNodes
651+
cache *containerNodesCacheItem
689652
}
690653

691654
// TODO: docs
692-
func (x containerStoragePolicy) StorageNodesForObject(obj oid.ID) ([][]netmapsdk.NodeInfo, []uint32, error) {
693-
nodeLists, err := x.networkMap.PlacementVectors(x.nodeSets, obj)
655+
func (x *containerStoragePolicy) StorageNodesForObject(obj oid.ID) ([][]netmapsdk.NodeInfo, []uint32, error) {
656+
nodeLists, err := sortContainerNodesForObjectAtEpoch(x.cnrNodes.nodeSets, x.networkMap, x.cache, obj)
694657
if err != nil {
695-
return nil, nil, fmt.Errorf("sort container nodes for the object: %w", err)
658+
return nil, nil, err
696659
}
697660

698-
return nodeLists, x.primaryNodeNums, nil
661+
return nodeLists, x.cnrNodes.primaryNodesNums, nil
699662
}

0 commit comments

Comments
 (0)