@@ -24,10 +24,11 @@ import (
24
24
)
25
25
26
26
type broadcastServer struct {
27
- queue chan * ab. BroadcastMessage
27
+ queueSize int
28
28
batchSize int
29
29
batchTimeout time.Duration
30
30
rl rawledger.Writer
31
+ sendChan chan * ab.BroadcastMessage
31
32
exitChan chan struct {}
32
33
}
33
34
@@ -39,10 +40,11 @@ func newBroadcastServer(queueSize, batchSize int, batchTimeout time.Duration, rl
39
40
40
41
func newPlainBroadcastServer (queueSize , batchSize int , batchTimeout time.Duration , rl rawledger.Writer ) * broadcastServer {
41
42
bs := & broadcastServer {
42
- queue : make ( chan * ab. BroadcastMessage , queueSize ) ,
43
+ queueSize : queueSize ,
43
44
batchSize : batchSize ,
44
45
batchTimeout : batchTimeout ,
45
46
rl : rl ,
47
+ sendChan : make (chan * ab.BroadcastMessage ),
46
48
exitChan : make (chan struct {}),
47
49
}
48
50
return bs
59
61
timer := time .After (bs .batchTimeout )
60
62
for {
61
63
select {
62
- case msg := <- bs .queue :
64
+ case msg := <- bs .sendChan :
63
65
curBatch = append (curBatch , msg )
64
66
if len (curBatch ) < bs .batchSize {
65
67
continue
@@ -83,6 +85,38 @@ outer:
83
85
}
84
86
85
87
func (bs * broadcastServer ) handleBroadcast (srv ab.AtomicBroadcast_BroadcastServer ) error {
88
+ b := newBroadcaster (bs )
89
+ defer close (b .queue )
90
+ go b .drainQueue ()
91
+ return b .queueBroadcastMessages (srv )
92
+ }
93
+
94
+ type broadcaster struct {
95
+ bs * broadcastServer
96
+ queue chan * ab.BroadcastMessage
97
+ }
98
+
99
+ func (b * broadcaster ) drainQueue () {
100
+ for {
101
+ select {
102
+ case msg , ok := <- b .queue :
103
+ if ok {
104
+ select {
105
+ case b .bs .sendChan <- msg :
106
+ case <- b .bs .exitChan :
107
+ return
108
+ }
109
+ } else {
110
+ return
111
+ }
112
+ case <- b .bs .exitChan :
113
+ return
114
+ }
115
+ }
116
+ }
117
+
118
+ func (b * broadcaster ) queueBroadcastMessages (srv ab.AtomicBroadcast_BroadcastServer ) error {
119
+
86
120
for {
87
121
msg , err := srv .Recv ()
88
122
if err != nil {
@@ -97,7 +131,7 @@ func (bs *broadcastServer) handleBroadcast(srv ab.AtomicBroadcast_BroadcastServe
97
131
}
98
132
99
133
select {
100
- case bs .queue <- msg :
134
+ case b .queue <- msg :
101
135
err = srv .Send (& ab.BroadcastResponse {ab .Status_SUCCESS })
102
136
default :
103
137
err = srv .Send (& ab.BroadcastResponse {ab .Status_SERVICE_UNAVAILABLE })
@@ -108,3 +142,11 @@ func (bs *broadcastServer) handleBroadcast(srv ab.AtomicBroadcast_BroadcastServe
108
142
}
109
143
}
110
144
}
145
+
146
+ func newBroadcaster (bs * broadcastServer ) * broadcaster {
147
+ b := & broadcaster {
148
+ bs : bs ,
149
+ queue : make (chan * ab.BroadcastMessage , bs .queueSize ),
150
+ }
151
+ return b
152
+ }
0 commit comments