[#488] reputation/eigentrust/calculator: Implement calc wrapper

Signed-off-by: Pavel Karpy <carpawell@nspcc.ru>
This commit is contained in:
Pavel Karpy 2021-04-29 08:30:41 +03:00 committed by Alex Vanin
parent d3c1fc7dda
commit ea781664cf
14 changed files with 294 additions and 53 deletions

View file

@ -4,6 +4,7 @@ import (
"fmt"
"github.com/nspcc-dev/neofs-node/pkg/services/reputation"
"github.com/nspcc-dev/neofs-node/pkg/services/reputation/common"
"github.com/nspcc-dev/neofs-node/pkg/util"
)
@ -26,7 +27,7 @@ type Prm struct {
DaughterTrustSource DaughterTrustIteratorProvider
IntermediateValueTarget IntermediateWriterProvider
IntermediateValueTarget common.WriterProvider
FinalResultTarget IntermediateWriterProvider

View file

@ -15,17 +15,16 @@ type CalculatePrm struct {
ei eigentrust.EpochIteration
}
func (p *CalculatePrm) SetLast(last bool) {
p.last = last
}
func (p *CalculatePrm) SetEpochIteration(ei eigentrust.EpochIteration) {
p.ei = ei
}
type iterContext struct {
context.Context
eigentrust.EpochIteration
}
func (c *Calculator) Calculate(prm CalculatePrm) {
ctx := iterContext{
ctx := eigentrust.IterContext{
Context: context.Background(),
EpochIteration: prm.ei,
}
@ -139,7 +138,7 @@ func (c *Calculator) iterateDaughter(p iterDaughterPrm) {
var intermediateTrust eigentrust.IterationTrust
intermediateTrust.SetEpoch(p.ctx.Epoch())
intermediateTrust.SetTrustingPeer(p.id)
intermediateTrust.SetPeer(p.id)
intermediateTrust.SetI(p.ctx.I())
if p.lastIter {
@ -163,7 +162,7 @@ func (c *Calculator) iterateDaughter(p iterDaughterPrm) {
return
}
} else {
intermediateWriter, err := c.prm.IntermediateValueTarget.InitIntermediateWriter(p.ctx)
intermediateWriter, err := c.prm.IntermediateValueTarget.InitWriter(p.ctx)
if err != nil {
c.opts.log.Debug("init intermediate writer failure",
zap.String("error", err.Error()),
@ -184,10 +183,7 @@ func (c *Calculator) iterateDaughter(p iterDaughterPrm) {
trust.SetValue(val)
intermediateTrust.SetPeer(trust.Peer())
intermediateTrust.SetValue(val)
err := intermediateWriter.WriteIntermediateTrust(intermediateTrust)
err := intermediateWriter.Write(p.ctx, trust)
if err != nil {
c.opts.log.Debug("write intermediate value failure",
zap.String("error", err.Error()),
@ -201,6 +197,14 @@ func (c *Calculator) iterateDaughter(p iterDaughterPrm) {
zap.String("error", err.Error()),
)
}
err = intermediateWriter.Close()
if err != nil {
c.opts.log.Error(
"could not close intermediate writer",
zap.String("error", err.Error()),
)
}
}
}
@ -214,7 +218,7 @@ func (c *Calculator) sendInitialValues(ctx Context) {
return
}
intermediateWriter, err := c.prm.IntermediateValueTarget.InitIntermediateWriter(ctx)
intermediateWriter, err := c.prm.IntermediateValueTarget.InitWriter(ctx)
if err != nil {
c.opts.log.Debug("init intermediate writer failure",
zap.String("error", err.Error()),
@ -223,14 +227,7 @@ func (c *Calculator) sendInitialValues(ctx Context) {
return
}
var intermediateTrust eigentrust.IterationTrust
intermediateTrust.SetEpoch(ctx.Epoch())
intermediateTrust.SetI(ctx.I())
err = daughterIter.Iterate(func(daughter reputation.PeerID, iterator TrustIterator) error {
intermediateTrust.SetTrustingPeer(daughter)
return iterator.Iterate(func(trust reputation.Trust) error {
trusted := trust.Peer()
@ -245,12 +242,10 @@ func (c *Calculator) sendInitialValues(ctx Context) {
return nil
}
intermediateTrust.SetPeer(trusted)
initTrust.Mul(trust.Value())
intermediateTrust.SetValue(initTrust)
trust.SetValue(initTrust)
err = intermediateWriter.WriteIntermediateTrust(intermediateTrust)
err = intermediateWriter.Write(ctx, trust)
if err != nil {
c.opts.log.Debug("write intermediate value failure",
zap.String("error", err.Error()),
@ -267,4 +262,11 @@ func (c *Calculator) sendInitialValues(ctx Context) {
zap.String("error", err.Error()),
)
}
err = intermediateWriter.Close()
if err != nil {
c.opts.log.Debug("could not close intermediate writer",
zap.String("error", err.Error()),
)
}
}

View file

@ -28,13 +28,27 @@ type TrustIterator interface {
type PeerTrustsHandler func(reputation.PeerID, TrustIterator) error
// PeerTrustsIterator must iterate over all nodes(PeerIDs) and provide
// TrustIterator for iteration over node's Trusts to others peers.
type PeerTrustsIterator interface {
Iterate(PeerTrustsHandler) error
}
type DaughterTrustIteratorProvider interface {
InitDaughterIterator(Context, reputation.PeerID) (TrustIterator, error)
InitAllDaughtersIterator(Context) (PeerTrustsIterator, error)
// InitDaughterIterator must init TrustIterator
// that iterates over received local trusts from
// daughter p for ctx.Epoch() epoch.
InitDaughterIterator(ctx Context, p reputation.PeerID) (TrustIterator, error)
// InitAllDaughtersIterator must init PeerTrustsIterator
// that must iterate over all daughters of the current
// node(manager) and all trusts received from them for
// ctx.Epoch() epoch.
InitAllDaughtersIterator(ctx Context) (PeerTrustsIterator, error)
// InitConsumersIterator must init PeerTrustsIterator
// that must iterate over all daughters of the current
// node(manager) and their consumers' trusts received
// from other managers for ctx.Epoch() epoch and
// ctx.I() iteration.
InitConsumersIterator(Context) (PeerTrustsIterator, error)
}