summaryrefslogtreecommitdiffstats
path: root/fnet
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2018-09-11 11:21:57 +0000
committerHåvard Pettersen <havardpe@oath.com>2018-09-11 11:21:57 +0000
commitcc85d0014b7860d03a088327eb3c408bc2884074 (patch)
tree30b11313907bbbb465e37a1781584bfe99343aae /fnet
parentbf9ffe030915495bd8e46359af1d8bf0789829c5 (diff)
better handling of framed sockets in fnet
also minor tweaking of crypto codec adapter
Diffstat (limited to 'fnet')
-rw-r--r--fnet/src/vespa/fnet/connection.cpp7
-rw-r--r--fnet/src/vespa/fnet/connection.h4
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;