forked from TrueCloudLab/frostfs-node
86 lines
1.8 KiB
Go
86 lines
1.8 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
|
||
|
wrapNetmap "github.com/nspcc-dev/neofs-node/pkg/morph/client/netmap/wrapper"
|
||
|
"github.com/nspcc-dev/neofs-node/pkg/morph/timer"
|
||
|
)
|
||
|
|
||
|
type (
|
||
|
// EigenTrustDuration is a structure that provides duration of one
|
||
|
// eigen trust iteration round in blocks for block timer.
|
||
|
EigenTrustDuration struct {
|
||
|
sync.Mutex
|
||
|
|
||
|
nm *wrapNetmap.Wrapper
|
||
|
val uint32
|
||
|
}
|
||
|
)
|
||
|
|
||
|
// NewEigenTrustDuration returns instance of EigenTrustDuration.
|
||
|
func NewEigenTrustDuration(nm *wrapNetmap.Wrapper) *EigenTrustDuration {
|
||
|
return &EigenTrustDuration{
|
||
|
nm: nm,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Value returns number of blocks between two iterations of EigenTrust
|
||
|
// calculation. This value is not changed between `Update` calls.
|
||
|
func (e *EigenTrustDuration) Value() (uint32, error) {
|
||
|
e.Lock()
|
||
|
defer e.Unlock()
|
||
|
|
||
|
if e.val == 0 {
|
||
|
e.update()
|
||
|
}
|
||
|
|
||
|
return e.val, nil
|
||
|
}
|
||
|
|
||
|
// Update function recalculate duration of EigenTrust iteration based on
|
||
|
// NeoFS epoch duration and amount of iteration rounds from global config.
|
||
|
func (e *EigenTrustDuration) Update() {
|
||
|
e.Lock()
|
||
|
defer e.Unlock()
|
||
|
|
||
|
e.update()
|
||
|
}
|
||
|
|
||
|
func (e *EigenTrustDuration) update() {
|
||
|
iterationAmount, err := e.nm.EigenTrustIterations()
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
epochDuration, err := e.nm.EpochDuration()
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
e.val = uint32(epochDuration / iterationAmount)
|
||
|
}
|
||
|
|
||
|
func startBlockTimers(c *cfg) {
|
||
|
for i := range c.cfgMorph.blockTimers {
|
||
|
if err := c.cfgMorph.blockTimers[i].Reset(); err != nil {
|
||
|
fatalOnErr(err)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func tickBlockTimers(c *cfg) {
|
||
|
for i := range c.cfgMorph.blockTimers {
|
||
|
c.cfgMorph.blockTimers[i].Tick()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func newEigenTrustIterTimer(c *cfg, it *EigenTrustDuration, handler timer.BlockTickHandler) {
|
||
|
c.cfgMorph.eigenTrustTimer = timer.NewBlockTimer(
|
||
|
it.Value,
|
||
|
handler,
|
||
|
)
|
||
|
|
||
|
c.cfgMorph.blockTimers = append(c.cfgMorph.blockTimers, c.cfgMorph.eigenTrustTimer)
|
||
|
}
|