Vladimir Ozerov created IGNITE-2627:
---------------------------------------

             Summary: ODBC: OdbcNioParser is implemented incorrectly.
                 Key: IGNITE-2627
                 URL: https://issues.apache.org/jira/browse/IGNITE-2627
             Project: Ignite
          Issue Type: Sub-task
          Components: odbc
    Affects Versions: 1.5.0.final
            Reporter: Vladimir Ozerov
            Assignee: Igor Sapego
             Fix For: 1.6


There are number of problem with OdbcNioParser which makes it usable only in 
single-threaded application when no TCP messages are batched together:

1) Parser is not thread-safe and hence cannot have any state like 
"leftToReceive" of "curMsg" fields.
Instead, you should rely on meta assigned to GridNioSession. See 
GridDirectParser as example. 
This will make the parser thread-safe.

2) Message is decoded incorrectly. When "decode" is called, you cannot rely on 
buf.array(), as this array could contain multiple requests. Moreover, there are 
no guarantees that current message is started from the beginning of this array. 
So, the following line might return incorrect result:
{code}
int msgLen = reader.readInt();
{code}

Instead, you should follow common practice:
1) Always rely on ByteBuffer.remaining()
2) Read message byte-by-byte until all 4 bytes are read.
3) Then read message body into separate byte[] until all data is ready.
4) And only then you can create BinaryHeapInputStream and deserialize the stuff.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to