Open wmitsuda opened 1 month ago
at
github.com/erigontech/erigon-lib/direct.(*SubscribeLogsStreamS).Recv(0xdc03871bbd0?)
github.com/erigontech/erigon-lib@v0.0.0-00010101000000-000000000000/direct/eth_backend_client.go:158 +0x25
there is:
m, ok := <-s.chRecv
if !ok || m == nil {
return nil, io.EOF
}
which doesn't select on ctx.Done()
I see that we already closing channels when subscription breaks:
subscribeLogsRequestChan := make(chan *subscribeLogsRequest, 16384)
subscribeLogsReplyChan := make(chan *subscribeLogsReply, 16384)
srv := &SubscribeLogsStreamS{
chSend: subscribeLogsReplyChan,
chRecv: subscribeLogsRequestChan,
ctx: ctx,
}
go func() {
defer close(subscribeLogsRequestChan)
defer close(subscribeLogsReplyChan)
srv.Err(s.server.SubscribeLogs(srv))
}()
Means:
ctx.Done()
" - on receiver sidectx.Done()
" - on sender sideBut problem is here:
s.server.SubscribeLogs(srv)
-> LogsFilterAggregator) subscribeLogs(server remote.ETHBACKEND_SubscribeLogsServer)
-> Recv()
-> <-s.chRecv
means - server can't finish server.SubscribeLogs
because stuck at <-s.chRecv
- so we must add "select on ctx.Done()
" in Recv()
? seems yes. maybe in all erigon-lib/direct
classes.
FYI: direct
- it's grpc call without serialization (within 1 process).
e3, yesterday's main: