summaryrefslogtreecommitdiffstats
path: root/fnet
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2018-08-30 09:28:01 +0000
committerHåvard Pettersen <havardpe@oath.com>2018-08-30 09:28:01 +0000
commita7eca91afb48a0d1664ec53eaebb86ffa069722b (patch)
treec378b6e54442045caf3d89a6f4f3f40a31b5e96a /fnet
parent3d67de8d8e3bfbcfd16abac27cf8f2b33a3303bc (diff)
drain input pipeline after crypto handshake
Diffstat (limited to 'fnet')
-rw-r--r--fnet/src/vespa/fnet/connection.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/fnet/src/vespa/fnet/connection.cpp b/fnet/src/vespa/fnet/connection.cpp
index 11856759165..07086ca54a2 100644
--- a/fnet/src/vespa/fnet/connection.cpp
+++ b/fnet/src/vespa/fnet/connection.cpp
@@ -229,9 +229,21 @@ FNET_Connection::handshake()
SetState(FNET_CLOSED);
broken = true;
break;
- case vespalib::CryptoSocket::HandshakeResult::DONE:
+ case vespalib::CryptoSocket::HandshakeResult::DONE: {
EnableReadEvent(true);
EnableWriteEvent(writePendingAfterConnect());
+ size_t chunk_size = std::max(size_t(FNET_READ_SIZE), _socket->min_read_buffer_size());
+ uint32_t ignore_stats = 0;
+ ssize_t res = 0;
+ do { // drain input pipeline
+ _input.EnsureFree(chunk_size);
+ res = _socket->drain(_input.GetFree(), _input.GetFreeLen());
+ if (res > 0) {
+ _input.FreeToData((uint32_t)res);
+ broken = !handle_packets(ignore_stats);
+ _input.resetIfEmpty();
+ }
+ } while ((res > 0) && !broken); }
break;
case vespalib::CryptoSocket::HandshakeResult::NEED_READ:
EnableReadEvent(true);