Commit b5c3fb8a authored by Jakob Otto's avatar Jakob Otto

Implement read retries for tcp

parent 6344cacd
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include "caf/fwd.hpp" #include "caf/fwd.hpp"
#include "caf/logger.hpp" #include "caf/logger.hpp"
#include "caf/net/defaults.hpp"
#include "caf/net/endpoint_manager.hpp" #include "caf/net/endpoint_manager.hpp"
#include "caf/net/fwd.hpp" #include "caf/net/fwd.hpp"
#include "caf/net/receive_policy.hpp" #include "caf/net/receive_policy.hpp"
...@@ -74,31 +73,36 @@ public: ...@@ -74,31 +73,36 @@ public:
// -- member functions ------------------------------------------------------- // -- member functions -------------------------------------------------------
bool handle_read_event(endpoint_manager&) override { bool handle_read_event(endpoint_manager&) override {
auto buf = this->read_buf_.data() + this->collected_; size_t reads = 0;
size_t len = this->read_threshold_ - this->collected_; while (reads++ < this->max_consecutive_reads_) {
CAF_LOG_TRACE(CAF_ARG2("handle", this->handle().id) auto buf = this->read_buf_.data() + this->collected_;
<< CAF_ARG2("missing", len)); size_t len = this->read_threshold_ - this->collected_;
auto ret = read(this->handle_, make_span(buf, len)); CAF_LOG_TRACE(CAF_ARG2("handle", this->handle().id)
// Update state. << CAF_ARG2("missing", len));
if (auto num_bytes = get_if<size_t>(&ret)) { auto ret = read(this->handle_, make_span(buf, len));
CAF_LOG_DEBUG(CAF_ARG(len) // Update state.
<< CAF_ARG(this->handle_.id) << CAF_ARG(*num_bytes)); if (auto num_bytes = get_if<size_t>(&ret)) {
this->collected_ += *num_bytes; CAF_LOG_DEBUG(CAF_ARG(len)
if (this->collected_ >= this->read_threshold_) { << CAF_ARG(this->handle_.id) << CAF_ARG(*num_bytes));
if (auto err = this->next_layer_.handle_data(*this, this->collected_ += *num_bytes;
make_span( if (this->collected_ >= this->read_threshold_) {
this->read_buf_))) { if (auto err = this->next_layer_.handle_data(*this,
CAF_LOG_ERROR("handle_data failed: " << CAF_ARG(err)); make_span(
this->read_buf_))) {
CAF_LOG_ERROR("handle_data failed: " << CAF_ARG(err));
return false;
}
this->prepare_next_read();
}
} else {
auto err = get<sec>(ret);
if (err == sec::unavailable_or_would_block) {
break;
} else {
CAF_LOG_DEBUG("read failed" << CAF_ARG(err));
this->next_layer_.handle_error(err);
return false; return false;
} }
this->prepare_next_read();
}
} else {
auto err = get<sec>(ret);
if (err != sec::unavailable_or_would_block) {
CAF_LOG_DEBUG("read failed" << CAF_ARG(err));
this->next_layer_.handle_error(err);
return false;
} }
} }
return true; return true;
...@@ -214,8 +218,6 @@ private: ...@@ -214,8 +218,6 @@ private:
size_t collected_; size_t collected_;
size_t max_; size_t max_;
receive_policy_flag rd_flag_; receive_policy_flag rd_flag_;
// TODO implement retries using this member!
// size_t max_consecutive_reads_;
}; };
} // namespace caf::net } // namespace caf::net
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#pragma once #pragma once
#include "caf/defaults.hpp"
#include "caf/detail/overload.hpp" #include "caf/detail/overload.hpp"
#include "caf/fwd.hpp" #include "caf/fwd.hpp"
#include "caf/logger.hpp" #include "caf/logger.hpp"
...@@ -100,6 +101,9 @@ public: ...@@ -100,6 +101,9 @@ public:
CAF_LOG_TRACE(""); CAF_LOG_TRACE("");
manager_ = &parent; manager_ = &parent;
auto& cfg = system().config(); auto& cfg = system().config();
max_consecutive_reads_ = get_or(this->system().config(),
"middleman.max-consecutive-reads",
defaults::middleman::max_consecutive_reads);
auto max_header_bufs = get_or(cfg, "middleman.max-header-buffers", auto max_header_bufs = get_or(cfg, "middleman.max-header-buffers",
defaults::middleman::max_header_buffers); defaults::middleman::max_header_buffers);
header_bufs_.reserve(max_header_bufs); header_bufs_.reserve(max_header_bufs);
...@@ -224,6 +228,8 @@ protected: ...@@ -224,6 +228,8 @@ protected:
buffer_type read_buf_; buffer_type read_buf_;
endpoint_manager* manager_; endpoint_manager* manager_;
size_t max_consecutive_reads_;
}; };
} // namespace caf::net } // namespace caf::net
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment