diff options
author | Håvard Pettersen <havardpe@oath.com> | 2018-08-30 09:28:01 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2018-08-30 09:28:01 +0000 |
commit | a7eca91afb48a0d1664ec53eaebb86ffa069722b (patch) | |
tree | c378b6e54442045caf3d89a6f4f3f40a31b5e96a /fnet/src | |
parent | 3d67de8d8e3bfbcfd16abac27cf8f2b33a3303bc (diff) |
drain input pipeline after crypto handshake
Diffstat (limited to 'fnet/src')
-rw-r--r-- | fnet/src/vespa/fnet/connection.cpp | 14 |
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); |