github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/radar/cycleactor/cycel_actor.go (about)

     1  package cycleactor
     2  
     3  import (
     4  	"sync"
     5  	"time"
     6  
     7  	"github.com/ontio/ontology-eventbus/actor"
     8  	"github.com/sixexorg/magnetic-ring/bactor"
     9  	"github.com/sixexorg/magnetic-ring/common"
    10  	orgtypes "github.com/sixexorg/magnetic-ring/core/orgchain/types"
    11  	"github.com/sixexorg/magnetic-ring/node"
    12  	p2pcommon "github.com/sixexorg/magnetic-ring/p2pserver/common"
    13  )
    14  
    15  type CycleActor struct {
    16  	p2p       bactor.Teller
    17  	mainRadar bactor.Teller
    18  	start     bool
    19  	m         sync.Mutex
    20  }
    21  
    22  func NewCycleActor(p2pActor bactor.Teller) *CycleActor {
    23  	return &CycleActor{
    24  		p2p: p2pActor,
    25  	}
    26  }
    27  
    28  var (
    29  	leagueBlockPool = make(map[common.Hash]int64)
    30  	t               = common.NewTimingWheel(time.Second, 10)
    31  	m               sync.RWMutex
    32  )
    33  
    34  func (this *CycleActor) SetMainRadarActor(mainRadarActor bactor.Teller) {
    35  	this.mainRadar = mainRadarActor
    36  }
    37  func (this *CycleActor) Receive(context actor.Context) {
    38  	m.Lock()
    39  	defer m.Unlock()
    40  	switch msg := context.Message().(type) {
    41  	case *orgtypes.Block:
    42  		blkHash := msg.Hash()
    43  		_, ok := leagueBlockPool[blkHash]
    44  		if !ok {
    45  			leagueBlockPool[blkHash] = time.Now().Add(time.Minute * 2).Unix()
    46  			opd := &p2pcommon.OrgPendingData{
    47  				BANodeSrc: true,                // true:ANode send staller false:staller send staller
    48  				OrgId:     msg.Header.LeagueId, // orgid
    49  				Block:     msg,                 // tx
    50  			}
    51  			if node.IsStar() {
    52  				opd.BANodeSrc = false
    53  				this.mainRadar.Tell(msg)
    54  			}
    55  			this.p2p.Tell(opd)
    56  		}
    57  	}
    58  }
    59  func init() {
    60  	go func() {
    61  		for {
    62  			select {
    63  			case <-t.After(time.Second * 5):
    64  				time := time.Now().Unix()
    65  				for k, v := range leagueBlockPool {
    66  					if v < time {
    67  						delete(leagueBlockPool, k)
    68  					}
    69  				}
    70  			}
    71  		}
    72  	}()
    73  }