forked from TrueCloudLab/frostfs-node
[#482] reputation/router: Use trusting peer
In route building use `trusting` peer field of `reputation.Trust` struct instead of `reputation.Peer`. Signed-off-by: Pavel Karpy <carpawell@nspcc.ru>
This commit is contained in:
parent
1c92dc2414
commit
0a16aaacb1
5 changed files with 13 additions and 12 deletions
|
@ -415,7 +415,8 @@ func (s *reputationServer) SendLocalTrust(ctx context.Context, req *v2reputation
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, trust := range body.GetTrusts() {
|
for _, trust := range body.GetTrusts() {
|
||||||
if err = s.processTrust(body.GetEpoch(), apiToLocalTrust(trust), passedRoute, w); err != nil {
|
err = s.processTrust(body.GetEpoch(), apiToLocalTrust(trust, passedRoute[0].PublicKey()), passedRoute, w)
|
||||||
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "could not write one of trusts")
|
return nil, errors.Wrap(err, "could not write one of trusts")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -434,18 +435,20 @@ func (s *reputationServer) SendIntermediateResult(_ context.Context, req *v2repu
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiToLocalTrust(t *v2reputation.Trust) reputation.Trust {
|
// apiToLocalTrust converts v2 Trust to local reputation.Trust, adding trustingPeer.
|
||||||
|
func apiToLocalTrust(t *v2reputation.Trust, trustingPeer []byte) reputation.Trust {
|
||||||
localTrust := reputation.Trust{}
|
localTrust := reputation.Trust{}
|
||||||
|
|
||||||
localTrust.SetValue(reputation.TrustValueFromFloat64(t.GetValue()))
|
localTrust.SetValue(reputation.TrustValueFromFloat64(t.GetValue()))
|
||||||
localTrust.SetPeer(reputation.PeerIDFromBytes(t.GetPeer().GetValue()))
|
localTrust.SetPeer(reputation.PeerIDFromBytes(t.GetPeer().GetValue()))
|
||||||
|
localTrust.SetTrustingPeer(reputation.PeerIDFromBytes(trustingPeer))
|
||||||
|
|
||||||
return localTrust
|
return localTrust
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *reputationServer) processTrust(epoch uint64, t reputation.Trust,
|
func (s *reputationServer) processTrust(epoch uint64, t reputation.Trust,
|
||||||
passedRoute []reputationroute.ServerInfo, w trustcontroller.Writer) error {
|
passedRoute []reputationroute.ServerInfo, w trustcontroller.Writer) error {
|
||||||
err := reputationroute.CheckRoute(s.routeBuilder, epoch, reputation.PeerIDFromBytes(passedRoute[0].PublicKey()), passedRoute)
|
err := reputationroute.CheckRoute(s.routeBuilder, epoch, t, passedRoute)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "wrong route of reputation trust value")
|
return errors.Wrap(err, "wrong route of reputation trust value")
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,9 +69,7 @@ func (w *trustWriter) Write(t reputation.Trust) error {
|
||||||
w.routeMtx.Lock()
|
w.routeMtx.Lock()
|
||||||
defer w.routeMtx.Unlock()
|
defer w.routeMtx.Unlock()
|
||||||
|
|
||||||
localPeerID := reputation.PeerIDFromBytes(w.router.localSrvInfo.PublicKey())
|
route, err := w.router.routeBuilder.NextStage(w.ctx.Epoch(), t, w.ctx.passedRoute)
|
||||||
|
|
||||||
route, err := w.router.routeBuilder.NextStage(w.ctx.Epoch(), localPeerID, w.ctx.passedRoute)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
} else if len(route) == 0 {
|
} else if len(route) == 0 {
|
||||||
|
|
|
@ -22,13 +22,13 @@ type ServerInfo interface {
|
||||||
// Builder groups methods to route values in the network.
|
// Builder groups methods to route values in the network.
|
||||||
type Builder interface {
|
type Builder interface {
|
||||||
// NextStage must return next group of route points
|
// NextStage must return next group of route points
|
||||||
// for passed epoch and PeerID of the current route point.
|
// for passed epoch and trust values.
|
||||||
// Implementation must take into account already passed route points.
|
// Implementation must take into account already passed route points.
|
||||||
//
|
//
|
||||||
// Empty passed list means being at the starting point of the route.
|
// Empty passed list means being at the starting point of the route.
|
||||||
//
|
//
|
||||||
// Must return empty list and no error if the endpoint of the route is reached.
|
// Must return empty list and no error if the endpoint of the route is reached.
|
||||||
NextStage(epoch uint64, p reputation.PeerID, passed []ServerInfo) ([]ServerInfo, error)
|
NextStage(epoch uint64, t reputation.Trust, passed []ServerInfo) ([]ServerInfo, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoteWriterProvider describes the component
|
// RemoteWriterProvider describes the component
|
||||||
|
|
|
@ -9,12 +9,12 @@ import (
|
||||||
// NextStage builds Manager list for node and returns it directly.
|
// NextStage builds Manager list for node and returns it directly.
|
||||||
//
|
//
|
||||||
// If passed route has more than one point, then endpoint of the route is reached.
|
// If passed route has more than one point, then endpoint of the route is reached.
|
||||||
func (b *Builder) NextStage(epoch uint64, p reputation.PeerID, passed []reputationroute.ServerInfo) ([]reputationroute.ServerInfo, error) {
|
func (b *Builder) NextStage(epoch uint64, t reputation.Trust, passed []reputationroute.ServerInfo) ([]reputationroute.ServerInfo, error) {
|
||||||
if len(passed) > 1 {
|
if len(passed) > 1 {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
route, err := b.managerBuilder.BuildManagers(epoch, p)
|
route, err := b.managerBuilder.BuildManagers(epoch, t.TrustingPeer())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(err, "could not build managers for epoch: %d", epoch)
|
return nil, errors.Wrapf(err, "could not build managers for epoch: %d", epoch)
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,9 +12,9 @@ var errWrongRoute = errors.New("wrong route")
|
||||||
// CheckRoute checks if the route is a route correctly constructed by the builder for value a.
|
// CheckRoute checks if the route is a route correctly constructed by the builder for value a.
|
||||||
//
|
//
|
||||||
// Returns nil if route is correct, otherwise an error clarifying the inconsistency.
|
// Returns nil if route is correct, otherwise an error clarifying the inconsistency.
|
||||||
func CheckRoute(builder Builder, epoch uint64, peer reputation.PeerID, route []ServerInfo) error {
|
func CheckRoute(builder Builder, epoch uint64, t reputation.Trust, route []ServerInfo) error {
|
||||||
for i := 1; i < len(route); i++ {
|
for i := 1; i < len(route); i++ {
|
||||||
servers, err := builder.NextStage(epoch, peer, route[:i])
|
servers, err := builder.NextStage(epoch, t, route[:i])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
} else if len(servers) == 0 {
|
} else if len(servers) == 0 {
|
||||||
|
|
Loading…
Reference in a new issue