Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
0.15.0
-
None
-
thrift: 0.15.0
openssl: 1.0.2k
libevent: 2.0.21-stable method epoll
Description
C++ TNonblockingServer processes the requests one by one. The processing of one request starts when an event for the given socket is triggered by libevent.
If TSSLSocket used, the openssl library may read all the available data from the socket which potentially contain more requests.
The first request is processed by TNonblockingServer::workSocket.
But after that since only oneway requests are used no send happens and the socket receive buffer is already empty, so no any event is triggered by libevent.
This means the processing of the further request already buffered by openssl will happen only when a new request arrives to the socket.
There is a little test client/server attached to show the problem. The output from server_rpcgw is the following:
17:23:35 message1
17:23:37 message2
17:23:37 message3
The message2 was sent by the client at the same time like message1, but got processed by the server just when the message3 arrived.
In the attached wireshark capture the frame #10 contains the message1 and message2 the #12 contains the message3.
In the code there is already a comment about this case after the thrift frame size is read:
https://github.com/apache/thrift/blob/0b29261a4f3c6882ef3b09aae47914f0012b0472/lib/cpp/src/thrift/server/TNonblockingServer.cpp#L480
It is not clear why no similar check happens after the thrift frame content is read.
Attachments
Attachments
Issue Links
- links to