Restructured the queue handling to isolate the blocking stream.Recv(), and found a seemingly random block point somewhere. After experimenting with the sizes of the long messages generation, it was determined that messages over 4kb are getting stuck in the gRPC packet handling code somewhere. Nothing that can be done about it, but just needed to fully isolate where the problem was so I could finally call the damn queue implementation done.
82 lines
1.5 KiB
Go
82 lines
1.5 KiB
Go
package client
|
|
|
|
import (
|
|
"github.com/quanterall/kitchensink/pkg/proto"
|
|
"io"
|
|
"time"
|
|
)
|
|
|
|
func (b *b32c) Decode(stream proto.Transcriber_DecodeClient) (err error) {
|
|
|
|
go func(stream proto.Transcriber_DecodeClient) {
|
|
out:
|
|
for {
|
|
select {
|
|
case <-b.stop:
|
|
|
|
break out
|
|
case msg := <-b.decChan:
|
|
|
|
log.Println("sending message on stream")
|
|
err := stream.Send(msg.Req)
|
|
if err != nil {
|
|
log.Print(err)
|
|
}
|
|
b.waitingDec[time.Now()] = msg
|
|
case recvd := <-b.decRes:
|
|
|
|
for i := range b.waitingDec {
|
|
|
|
// Return received responses
|
|
if recvd.IdNonce == b.waitingDec[i].Req.IdNonce {
|
|
b.waitingDec[i].Res <- recvd
|
|
delete(b.waitingDec, i)
|
|
}
|
|
|
|
// Check for expired responses
|
|
if i.Add(b.timeout).Before(time.Now()) {
|
|
|
|
log.Println(
|
|
"\nexpiring", i,
|
|
"\ntimeout", b.timeout,
|
|
"\nsince", i.Add(b.timeout),
|
|
"\nis late", i.Add(b.timeout).Before(time.Now()),
|
|
)
|
|
delete(b.waitingDec, i)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}(stream)
|
|
|
|
go func(stream proto.Transcriber_DecodeClient) {
|
|
in:
|
|
for {
|
|
// check whether it's shutdown time first
|
|
select {
|
|
case <-b.stop:
|
|
break in
|
|
default:
|
|
}
|
|
|
|
// Wait for and load in a newly received message
|
|
recvd, err := stream.Recv()
|
|
switch {
|
|
case err == io.EOF:
|
|
// The client has broken the connection, so we can quit
|
|
log.Println("stream closed")
|
|
break in
|
|
case err != nil:
|
|
|
|
log.Println(err)
|
|
break
|
|
}
|
|
|
|
// forward received message to processing loop
|
|
b.decRes <- recvd
|
|
}
|
|
}(stream)
|
|
|
|
return
|
|
}
|