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 }