Hi,

Thanks for your reply. I think current implementation (based on R2.6) does
exactly what you mentioned as of in GridNioServer
<https://github.com/apache/ignite/blob/ignite-2.6/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java#L1087>.
The problem is that in redis protocol defines message length right before
the message context. If a huge message comes in and unfortunately Selector
/ NioServer has not read the whole payload fully. Furthermore, the
incomplete message is passed to Redis packet parser, then logic error would
occur - in this case BufferUnderFlowError. I wonder if this is expected
behavior of how Ignite receive data from server perspective?

Regards,

Michael

On Fri, Oct 26, 2018 at 1:13 PM Jörn Franke <jornfra...@gmail.com> wrote:

> I have not checked the exact routine, but you need to reexecute read until
> it returns -1 or if known that all bytes that are expected have been read
> (if sockCh is based on some kind of input stream)
>
> > Am 26.10.2018 um 04:24 schrieb Michael Fong <mcfong.o...@gmail.com>:
> >
> > Bump!
> >
> > Anyone who could help me solve this random issue? Thanks!
> >
> > Regards,
> >
> >
> > Michael
> >
> >> On Wed, Oct 24, 2018 at 10:32 PM Michael Fong <mcfong.o...@gmail.com>
> wrote:
> >>
> >> Hi, all,
> >>
> >>
> >> I was trying to fix  IGNITE-7153 which relates to parsing incomplete
> REDIS
> >> packet larger than 8192 bytes. However, I found a random problem  which
> is
> >> reproducible on TC as well.
> >> That said, GridNioServerRead.processRead() :
> >>  - int cnt = sockCh.read(readBuf);
> >>
> >> sometimes does not read the payload fully as the length field in the
> >> header is larger than the ByteBuffer.limit(). As the result, the
> >> BufferUnderFlowException will be thrown.
> >>
> >> For example, in a erroneous round run with my IDE, a REDIS payload (sent
> >> by jedis client) looks like the following:
> >>
> >> 2a 33 d a 24 33 d a 53 45 54 d a 24 32 d a 62 31 d a 24 {38 31 39 32} d
> a | 65
> >> d a ...etc
> >>
> >> GridRedisProtocolParser.readBulkStr(buf) invokes elCnt(buf) which gets
> >> {8192}. However, the limit of buf is 28 which ends at | position.
> Obviously,
> >> 8192 < limit(), therefore, the logic throws BufferUnderFlow soon after.
> >>
> >> I traced back and found  sockCh.read(readBuf) only read 28 bytes for
> unknown reason
> >>
> >> The problem seems totally random. I wonder if this has anything to do
> with other NioWorker
> >> or Selector setting.
> >>
> >>
> >> Any help would be appreciated!
> >>
> >>
> >> Regards,
> >>
> >>
> >> Michael
> >>
> >>
>

Reply via email to