aboutsummaryrefslogtreecommitdiffstats
path: root/fnet
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-11-29 12:29:40 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-11-29 21:48:12 +0000
commit8d4eb868704b3374c937f354f30533b174edb4fe (patch)
treedbfed24accc13fb53e9b05576a3c04a9d2534456 /fnet
parent12275ab8fb1f83935ba2a4ab2f7a72bd262cbcf3 (diff)
In ADAPTIVE mode a wakeup will be done with 100 packets ready for write.
Diffstat (limited to 'fnet')
-rw-r--r--fnet/src/vespa/fnet/transport_thread.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/fnet/src/vespa/fnet/transport_thread.cpp b/fnet/src/vespa/fnet/transport_thread.cpp
index 2064554392c..82c2353092f 100644
--- a/fnet/src/vespa/fnet/transport_thread.cpp
+++ b/fnet/src/vespa/fnet/transport_thread.cpp
@@ -18,9 +18,12 @@ LOG_SETUP(".fnet");
using vespalib::ServerSocket;
using vespalib::SocketHandle;
using vespalib::SocketSpec;
+using OptimizeFor = vespalib::Executor::OptimizeFor;
namespace {
+constexpr size_t WAKEUP_LIMIT_IN_ADAPTIVE_MODE = 100;
+
struct Sync : public FNET_IExecutable
{
vespalib::Gate gate;
@@ -29,6 +32,11 @@ struct Sync : public FNET_IExecutable
}
};
+bool needWakeup(vespalib::Executor::OptimizeFor mode, size_t qLen) {
+ return ((mode == OptimizeFor::LATENCY) && (qLen == 1)) ||
+ ((mode == OptimizeFor::ADAPTIVE) && (qLen == WAKEUP_LIMIT_IN_ADAPTIVE_MODE));
+}
+
} // namespace<unnamed>
void
@@ -113,7 +121,7 @@ bool
FNET_TransportThread::PostEvent(FNET_ControlPacket *cpacket,
FNET_Context context)
{
- bool wasEmpty;
+ size_t qLen;
{
std::unique_lock<std::mutex> guard(_lock);
if (IsShutDown()) {
@@ -121,10 +129,10 @@ FNET_TransportThread::PostEvent(FNET_ControlPacket *cpacket,
SafeDiscardEvent(cpacket, context);
return false;
}
- wasEmpty = _queue.IsEmpty_NoLock() && _owner.optimizeFor() == vespalib::Executor::OptimizeFor::LATENCY;
_queue.QueuePacket_NoLock(cpacket, context);
+ qLen = _queue.GetPacketCnt_NoLock();
}
- if (wasEmpty) {
+ if (needWakeup(_owner.optimizeFor(), qLen)) {
_selector.wakeup();
}
return true;