Skip to content

Commit 33ab567

Browse files
committed
Improve watchdog
1 parent 665cb83 commit 33ab567

File tree

1 file changed

+41
-33
lines changed

1 file changed

+41
-33
lines changed

include/simple_http.h

Lines changed: 41 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,12 +1019,14 @@ class HttpResponseWriter
10191019
inline asio::awaitable<void> toSocket(
10201020
auto socket,
10211021
std::shared_ptr<Http2Channel> ch,
1022-
std::shared_ptr<std::chrono::steady_clock::time_point> deadline)
1022+
std::shared_ptr<std::chrono::steady_clock::time_point> deadline,
1023+
std::chrono::seconds max_idle_time)
10231024
{
10241025
std::vector<std::shared_ptr<std::string>> vec;
10251026
bool force_close = false;
10261027
for (;;)
10271028
{
1029+
*deadline = std::chrono::steady_clock::now() + max_idle_time;
10281030
while (true)
10291031
{
10301032
std::variant<std::shared_ptr<std::string>, Disconnect> data;
@@ -1043,7 +1045,6 @@ inline asio::awaitable<void> toSocket(
10431045
auto &info_ptr = std::get<std::shared_ptr<std::string>>(data);
10441046
vec.emplace_back(std::move(info_ptr));
10451047
}
1046-
*deadline = std::chrono::steady_clock::now();
10471048
}
10481049

10491050
if (vec.empty() && !force_close)
@@ -1095,19 +1096,20 @@ inline asio::awaitable<void> toSocket(
10951096
inline asio::awaitable<void> toH2Parse(
10961097
auto socket,
10971098
auto h2p,
1098-
std::shared_ptr<std::chrono::steady_clock::time_point> deadline)
1099+
std::shared_ptr<std::chrono::steady_clock::time_point> deadline,
1100+
std::chrono::seconds max_idle_time)
10991101
{
11001102
char buffer[4096];
11011103
for (;;)
11021104
{
1105+
*deadline = std::chrono::steady_clock::now() + max_idle_time;
11031106
auto [ec, nread] = co_await socket->async_read_some(
11041107
asio::buffer(buffer, sizeof(buffer)),
11051108
asio::as_tuple(asio::use_awaitable));
11061109
if (ec)
11071110
{
11081111
break;
11091112
}
1110-
*deadline = std::chrono::steady_clock::now();
11111113
auto ret = h2p->feedRecvData(buffer, nread);
11121114
if (ret == -1)
11131115
{
@@ -1138,20 +1140,16 @@ void shutdown(const auto &socket)
11381140
}
11391141

11401142
inline asio::awaitable<void> watchdog(
1141-
std::shared_ptr<std::chrono::steady_clock::time_point> deadline,
1142-
std::chrono::seconds interval)
1143+
std::shared_ptr<std::chrono::steady_clock::time_point> deadline)
11431144
{
11441145
asio::steady_timer timer(co_await asio::this_coro::executor);
1145-
while (true)
1146+
1147+
auto now = std::chrono::steady_clock::now();
1148+
while (*deadline > now)
11461149
{
1147-
timer.expires_at(std::chrono::steady_clock::now() + interval);
1150+
timer.expires_at(*deadline);
11481151
co_await timer.async_wait(asio::as_tuple(asio::use_awaitable));
1149-
auto now = std::chrono::steady_clock::now();
1150-
if (now - *deadline >= interval)
1151-
{
1152-
SIMPLE_HTTP_INFO_LOG("timeout");
1153-
break;
1154-
}
1152+
now = std::chrono::steady_clock::now();
11551153
}
11561154
co_return;
11571155
}
@@ -1423,9 +1421,9 @@ class HttpServer final
14231421
}
14241422
auto deadline = std::make_shared<std::chrono::steady_clock::time_point>(
14251423
std::chrono::steady_clock::now());
1426-
co_await (toH2Parse(socket, h2p, deadline) ||
1427-
toSocket(socket, ch, deadline) ||
1428-
watchdog(deadline, m_cfg.max_idle_time));
1424+
co_await (toH2Parse(socket, h2p, deadline, m_cfg.max_idle_time) ||
1425+
toSocket(socket, ch, deadline, m_cfg.max_idle_time) ||
1426+
watchdog(deadline));
14291427
shutdown(socket);
14301428
}
14311429

@@ -1465,9 +1463,9 @@ class HttpServer final
14651463
}
14661464
auto deadline = std::make_shared<std::chrono::steady_clock::time_point>(
14671465
std::chrono::steady_clock::now());
1468-
co_await (toH2Parse(socket, h2p, deadline) ||
1469-
toSocket(socket, ch, deadline) ||
1470-
watchdog(deadline, m_cfg.max_idle_time));
1466+
co_await (toH2Parse(socket, h2p, deadline, m_cfg.max_idle_time) ||
1467+
toSocket(socket, ch, deadline, m_cfg.max_idle_time) ||
1468+
watchdog(deadline));
14711469
shutdown(socket);
14721470
}
14731471

@@ -1476,11 +1474,14 @@ class HttpServer final
14761474
std::shared_ptr<Http2Parse> h2p,
14771475
Version version)
14781476
{
1479-
auto recv_request = [this](auto socket,
1480-
auto h2p,
1481-
auto deadline) -> asio::awaitable<void> {
1477+
auto recv_request =
1478+
[this](auto socket,
1479+
auto h2p,
1480+
auto deadline,
1481+
auto max_idle_time) -> asio::awaitable<void> {
14821482
for (;;)
14831483
{
1484+
*deadline = std::chrono::steady_clock::now() + max_idle_time;
14841485
beast::flat_buffer buffer;
14851486
http::request<http::string_body> req;
14861487
auto [ec, count] = co_await http::async_read(
@@ -1489,7 +1490,6 @@ class HttpServer final
14891490
{
14901491
co_return;
14911492
}
1492-
*deadline = std::chrono::steady_clock::now();
14931493
auto version =
14941494
(req.version() == 11 ? Version::Http11 : Version::Http1);
14951495
callHandler(m_handler_functions,
@@ -1503,16 +1503,17 @@ class HttpServer final
15031503
auto send_response = [](auto socket,
15041504
auto http1_ch,
15051505
Version version,
1506-
auto deadline) -> asio::awaitable<void> {
1506+
auto deadline,
1507+
auto max_idle_time) -> asio::awaitable<void> {
15071508
for (;;)
15081509
{
1510+
*deadline = std::chrono::steady_clock::now() + max_idle_time;
15091511
auto [ec, h1_rsp] = co_await http1_ch->async_receive(
15101512
asio::as_tuple(asio::use_awaitable));
15111513
if (ec)
15121514
{
15131515
break;
15141516
}
1515-
*deadline = std::chrono::steady_clock::now();
15161517
if (std::holds_alternative<std::string>(h1_rsp))
15171518
{
15181519
auto &body = std::get<std::string>(h1_rsp);
@@ -1551,9 +1552,11 @@ class HttpServer final
15511552
};
15521553
auto deadline = std::make_shared<std::chrono::steady_clock::time_point>(
15531554
std::chrono::steady_clock::now());
1554-
co_await (recv_request(socket, h2p, deadline) ||
1555-
send_response(socket, http1_ch, version, deadline) ||
1556-
watchdog(deadline, m_cfg.max_idle_time));
1555+
co_await (
1556+
recv_request(socket, h2p, deadline, m_cfg.max_idle_time) ||
1557+
send_response(
1558+
socket, http1_ch, version, deadline, m_cfg.max_idle_time) ||
1559+
watchdog(deadline));
15571560
shutdown(socket);
15581561
co_return;
15591562
}
@@ -2067,10 +2070,15 @@ class HttpsClient final : public HttpClient,
20672070
auto deadline =
20682071
std::make_shared<std::chrono::steady_clock::time_point>(
20692072
std::chrono::steady_clock::now());
2070-
co_await (toH2Parse(socket, sp, deadline) ||
2071-
toSocket(socket, h2_channel, deadline) ||
2072-
sp->forwardRequest() ||
2073-
watchdog(deadline, std::chrono::seconds(timeout)));
2073+
co_await (toH2Parse(socket,
2074+
sp,
2075+
deadline,
2076+
std::chrono::seconds(timeout)) ||
2077+
toSocket(socket,
2078+
h2_channel,
2079+
deadline,
2080+
std::chrono::seconds(timeout)) ||
2081+
sp->forwardRequest() || watchdog(deadline));
20742082
sp->m_connected = false;
20752083
// disconnect
20762084
for (auto &[id, rsp] : sp->m_streams)

0 commit comments

Comments
 (0)