diff options
author | Håvard Pettersen <havardpe@oath.com> | 2018-09-11 11:21:57 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2018-09-11 11:21:57 +0000 |
commit | cc85d0014b7860d03a088327eb3c408bc2884074 (patch) | |
tree | 30b11313907bbbb465e37a1781584bfe99343aae /fnet/src | |
parent | bf9ffe030915495bd8e46359af1d8bf0789829c5 (diff) |
better handling of framed sockets in fnet
also minor tweaking of crypto codec adapter
Diffstat (limited to 'fnet/src')
-rw-r--r-- | fnet/src/vespa/fnet/connection.cpp | 7 | ||||
-rw-r--r-- | fnet/src/vespa/fnet/connection.h | 4 |
2 files changed, 7 insertions, 4 deletions
diff --git a/fnet/src/vespa/fnet/connection.cpp b/fnet/src/vespa/fnet/connection.cpp index f2864d1dd58..e028afe5deb 100644 --- a/fnet/src/vespa/fnet/connection.cpp +++ b/fnet/src/vespa/fnet/connection.cpp @@ -225,6 +225,7 @@ FNET_Connection::handshake() case vespalib::CryptoSocket::HandshakeResult::DONE: { EnableReadEvent(true); EnableWriteEvent(writePendingAfterConnect()); + _flags._framed = (_socket->min_read_buffer_size() > 1); size_t chunk_size = std::max(size_t(FNET_READ_SIZE), _socket->min_read_buffer_size()); ssize_t res = 0; do { // drain input pipeline @@ -287,7 +288,7 @@ FNET_Connection::Read() _input.FreeToData((uint32_t)res); broken = !handle_packets(); _input.resetIfEmpty(); - if (broken || (_input.GetFreeLen() > 0) || (readCnt >= FNET_READ_REDO)) { + if (broken || ((_input.GetFreeLen() > 0) && !_flags._framed) || (readCnt >= FNET_READ_REDO)) { goto done_read; } _input.EnsureFree(chunk_size); @@ -302,7 +303,6 @@ done_read: _input.EnsureFree(chunk_size); res = _socket->drain(_input.GetFree(), _input.GetFreeLen()); my_errno = errno; - readCnt++; if (res > 0) { _input.FreeToData((uint32_t)res); broken = !handle_packets(); @@ -340,6 +340,7 @@ done_read: bool FNET_Connection::Write() { + size_t chunk_size = std::max(size_t(FNET_WRITE_SIZE), _socket->min_read_buffer_size()); uint32_t my_write_work = 0; int writeCnt = 0; // write count bool broken = false; // is this conn broken ? @@ -353,7 +354,7 @@ FNET_Connection::Write() // fill output buffer - while (_output.GetDataLen() < FNET_WRITE_SIZE) { + while (_output.GetDataLen() < chunk_size) { if (_myQueue.IsEmpty_NoLock()) break; diff --git a/fnet/src/vespa/fnet/connection.h b/fnet/src/vespa/fnet/connection.h index 8e275d68b18..44ad3fea97d 100644 --- a/fnet/src/vespa/fnet/connection.h +++ b/fnet/src/vespa/fnet/connection.h @@ -70,12 +70,14 @@ private: _gotheader(false), _inCallback(false), _callbackWait(false), - _discarding(false) + _discarding(false), + _framed(false) { } bool _gotheader; bool _inCallback; bool _callbackWait; bool _discarding; + bool _framed; }; struct ResolveHandler : public vespalib::AsyncResolver::ResultHandler { FNET_Connection *connection; |