forked from TrueCloudLab/frostfs-node
6848a816f9
This small refactoring adds `blocktimer.go` file with all timer related function and constructors. This way we can create all timers in one place (at the end of innerring.Server constructor). To do that we had to move timer reset into global server state so it can be accessed by netmap processor. Signed-off-by: Alex Vanin <alexey@nspcc.ru>
92 lines
2.6 KiB
Go
92 lines
2.6 KiB
Go
package innerring
|
|
|
|
import (
|
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
|
"github.com/nspcc-dev/neofs-node/pkg/innerring/invoke"
|
|
"github.com/nspcc-dev/neofs-node/pkg/services/audit"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// EpochCounter is a getter for a global epoch counter.
|
|
func (s *Server) EpochCounter() uint64 {
|
|
return s.epochCounter.Load()
|
|
}
|
|
|
|
// SetEpochCounter is a setter for contract processors to update global
|
|
// epoch counter.
|
|
func (s *Server) SetEpochCounter(val uint64) {
|
|
s.epochCounter.Store(val)
|
|
}
|
|
|
|
// IsActive is a getter for a global active flag state.
|
|
func (s *Server) IsActive() bool {
|
|
return s.innerRingIndex.Load() >= 0
|
|
}
|
|
|
|
// Index is a getter for a global index of node in inner ring list. Negative
|
|
// index means that node is not in the inner ring list.
|
|
func (s *Server) Index() int32 {
|
|
return s.innerRingIndex.Load()
|
|
}
|
|
|
|
// InnerRingSize is a getter for a global size of inner ring list. This value
|
|
// paired with inner ring index.
|
|
func (s *Server) InnerRingSize() int32 {
|
|
return s.innerRingSize.Load()
|
|
}
|
|
|
|
func (s *Server) voteForSidechainValidator(validators []keys.PublicKey) error {
|
|
index := s.Index()
|
|
if index < 0 || index >= alphabetContractsN {
|
|
s.log.Info("ignore validator vote: node not in alphabet range")
|
|
|
|
return nil
|
|
}
|
|
|
|
if len(validators) == 0 {
|
|
s.log.Info("ignore validator vote: empty validators list")
|
|
|
|
return nil
|
|
}
|
|
|
|
epoch := s.EpochCounter()
|
|
|
|
for i := range s.contracts.alphabet {
|
|
err := invoke.AlphabetVote(s.morphClient, s.contracts.alphabet[i], epoch, validators)
|
|
if err != nil {
|
|
s.log.Warn("can't invoke vote method in alphabet contract",
|
|
zap.Int("alphabet_index", i),
|
|
zap.Uint64("epoch", epoch))
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// InitAndVoteForSidechainValidator is a public function to use outside of
|
|
// inner ring daemon execution. It initialize inner ring structure with data
|
|
// from blockchain and then calls vote method on corresponding alphabet contract.
|
|
func (s *Server) InitAndVoteForSidechainValidator(validators []keys.PublicKey) error {
|
|
err := s.initConfigFromBlockchain()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return s.voteForSidechainValidator(validators)
|
|
}
|
|
|
|
// WriteReport composes audit result structure from audit report
|
|
// and sends it to Audit contract.
|
|
func (s *Server) WriteReport(r *audit.Report) error {
|
|
res := r.Result()
|
|
res.SetPublicKey(s.pubKey)
|
|
|
|
return s.auditClient.PutAuditResult(res)
|
|
}
|
|
|
|
// ResetEpochTimer resets block timer that produces events to update epoch
|
|
// counter in netmap contract. Used to synchronize this even production
|
|
// based on block with notification of last epoch.
|
|
func (s *Server) ResetEpochTimer() error {
|
|
return s.epochTimer.Reset()
|
|
}
|