-
Notifications
You must be signed in to change notification settings - Fork 199
/
routineHandler.go
74 lines (60 loc) · 1.95 KB
/
routineHandler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package sender
import (
"context"
"time"
logger "github.com/ElrondNetwork/elrond-go-logger"
)
var log = logger.GetOrCreate("heartbeat/sender")
type routineHandler struct {
peerAuthenticationSender senderHandler
heartbeatSender senderHandler
hardforkSender hardforkHandler
delayAfterHardforkMessageBroadcast time.Duration
cancel func()
}
func newRoutineHandler(peerAuthenticationSender senderHandler, heartbeatSender senderHandler, hardforkSender hardforkHandler) *routineHandler {
handler := &routineHandler{
peerAuthenticationSender: peerAuthenticationSender,
heartbeatSender: heartbeatSender,
hardforkSender: hardforkSender,
delayAfterHardforkMessageBroadcast: time.Minute,
}
var ctx context.Context
ctx, handler.cancel = context.WithCancel(context.Background())
go handler.processLoop(ctx)
return handler
}
func (handler *routineHandler) processLoop(ctx context.Context) {
defer func() {
log.Debug("heartbeat's routine handler is closing...")
handler.peerAuthenticationSender.Close()
handler.heartbeatSender.Close()
handler.hardforkSender.Close()
}()
handler.peerAuthenticationSender.Execute()
handler.heartbeatSender.Execute()
for {
select {
case <-handler.peerAuthenticationSender.ExecutionReadyChannel():
handler.peerAuthenticationSender.Execute()
case <-handler.heartbeatSender.ExecutionReadyChannel():
handler.heartbeatSender.Execute()
case <-handler.hardforkSender.ShouldTriggerHardfork():
handler.hardforkSender.Execute()
handler.waitAfterHarforkBroadcast(ctx)
case <-ctx.Done():
return
}
}
}
func (handler *routineHandler) waitAfterHarforkBroadcast(ctx context.Context) {
timer := time.NewTimer(handler.delayAfterHardforkMessageBroadcast)
defer timer.Stop()
select {
case <-timer.C:
case <-ctx.Done():
}
}
func (handler *routineHandler) closeProcessLoop() {
handler.cancel()
}