[#132] Generate and handle netmap cleanup event

Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
Alex Vanin 2020-10-29 19:08:36 +03:00 committed by Alex Vanin
parent 5c7de27546
commit 94957dd38c
3 changed files with 37 additions and 2 deletions

View file

@ -77,3 +77,25 @@ func (np *Processor) handleUpdateState(ev event.Event) {
zap.Int("capacity", np.pool.Cap()))
}
}
func (np *Processor) handleCleanupTick(ev event.Event) {
if !np.netmapSnapshot.enabled {
np.log.Debug("netmap clean up routine is disabled")
return
}
cleanup := ev.(netmapCleanupTick)
np.log.Info("tick", zap.String("type", "netmap cleaner"))
// send event to the worker pool
err := np.pool.Submit(func() {
np.processNetmapCleanupTick(cleanup.epoch)
})
if err != nil {
// there system can be moved into controlled degradation stage
np.log.Warn("netmap worker pool drained",
zap.Int("capacity", np.pool.Cap()))
}
}

View file

@ -10,6 +10,18 @@ import (
func (np *Processor) processNewEpoch(epoch uint64) {
np.epochState.SetEpochCounter(epoch)
np.epochTimer.ResetEpochTimer()
// get new netmap snapshot
snapshot, err := invoke.NetmapSnapshot(np.morphClient, np.netmapContract)
if err != nil {
np.log.Warn("can't get netmap snapshot to perform cleanup",
zap.String("error", err.Error()))
return
}
np.netmapSnapshot.update(snapshot, epoch)
np.handleCleanupTick(netmapCleanupTick{epoch: epoch})
}
// Process new epoch tick by invoking new epoch method in network map contract.

View file

@ -29,11 +29,12 @@ func (np *Processor) processAddPeer(node []byte) {
}
keyString := hex.EncodeToString(nodeInfo.PublicKey)
np.log.Info("approving network map candidate",
zap.String("key", keyString))
exists := np.netmapSnapshot.touch(keyString, np.epochState.EpochCounter())
if !exists {
np.log.Info("approving network map candidate",
zap.String("key", keyString))
err = invoke.ApprovePeer(np.morphClient, np.netmapContract, node)
if err != nil {
np.log.Error("can't invoke netmap.AddPeer", zap.Error(err))