6e46a926bb
In the repair subsystem, it is necessary to acquire several extra properties of nodes that are holding pieces of things or may be selected to hold pieces. We need to know if a node is 'online' (the definition of "online" may change somewhat depending on the situation), if a node is in the process of graceful exit, and whether a node is suspended. We can't just filter out nodes with all of these properties, because sometimes we need to know properties about nodes even when the nodes are suspended or gracefully exiting. I thought the best way to do this was to add fields to SelectedNode, and (to avoid any confusion) arrange for the added fields to be populated wherever SelectedNode is returned, whether or not the new fields are necessarily going to be used. If people would rather I use a separate type from SelectedNode, I can do that instead. Change-Id: I7804a0e0a15cfe34c8ff47a227175ea5862a4ebc
59 lines
1.3 KiB
Go
59 lines
1.3 KiB
Go
// Copyright (C) 2020 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package nodeselection
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/zeebo/errs"
|
|
"golang.org/x/exp/slices"
|
|
|
|
"storj.io/common/pb"
|
|
"storj.io/common/storj"
|
|
"storj.io/common/storj/location"
|
|
)
|
|
|
|
// NodeTag is a tag associated with a node (approved by signer).
|
|
type NodeTag struct {
|
|
NodeID storj.NodeID
|
|
SignedAt time.Time
|
|
Signer storj.NodeID
|
|
Name string
|
|
Value []byte
|
|
}
|
|
|
|
// NodeTags is a collection of multiple NodeTag.
|
|
type NodeTags []NodeTag
|
|
|
|
// FindBySignerAndName selects first tag with same name / NodeID.
|
|
func (n NodeTags) FindBySignerAndName(signer storj.NodeID, name string) (NodeTag, error) {
|
|
for _, tag := range n {
|
|
if tag.Name == name && signer == tag.Signer {
|
|
return tag, nil
|
|
}
|
|
}
|
|
return NodeTag{}, errs.New("tags not found")
|
|
}
|
|
|
|
// SelectedNode is used as a result for creating orders limits.
|
|
type SelectedNode struct {
|
|
ID storj.NodeID
|
|
Address *pb.NodeAddress
|
|
LastNet string
|
|
LastIPPort string
|
|
CountryCode location.CountryCode
|
|
Exiting bool
|
|
Suspended bool
|
|
Online bool
|
|
Tags NodeTags
|
|
}
|
|
|
|
// Clone returns a deep clone of the selected node.
|
|
func (node *SelectedNode) Clone() *SelectedNode {
|
|
newNode := *node
|
|
newNode.Address = pb.CopyNodeAddress(node.Address)
|
|
newNode.Tags = slices.Clone(node.Tags)
|
|
return &newNode
|
|
}
|