Skip to content

Commit

Permalink
Merge branch 'develop' into Fix_nightly_build
Browse files Browse the repository at this point in the history
  • Loading branch information
kuznetsss authored Oct 25, 2024
2 parents 1708773 + c62e9d5 commit cd4f882
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 15 deletions.
8 changes: 7 additions & 1 deletion src/util/CoroutineGroup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,16 @@ CoroutineGroup::~CoroutineGroup()
ASSERT(childrenCounter_ == 0, "CoroutineGroup is destroyed without waiting for child coroutines to finish");
}

bool
CoroutineGroup::canSpawn() const
{
return not maxChildren_.has_value() or childrenCounter_ < *maxChildren_;
}

bool
CoroutineGroup::spawn(boost::asio::yield_context yield, std::function<void(boost::asio::yield_context)> fn)
{
if (maxChildren_.has_value() && childrenCounter_ >= *maxChildren_)
if (not canSpawn())
return false;

++childrenCounter_;
Expand Down
8 changes: 8 additions & 0 deletions src/util/CoroutineGroup.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,14 @@ class CoroutineGroup {
*/
~CoroutineGroup();

/**
* @brief Check if a new coroutine can be spawned (i.e. there is space for a new coroutine in the group)
*
* @return true If a new coroutine can be spawned. false if the maximum number of coroutines has been reached
*/
bool
canSpawn() const;

/**
* @brief Spawn a new coroutine in the group
*
Expand Down
28 changes: 14 additions & 14 deletions src/web/ng/impl/ConnectionHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -218,21 +218,21 @@ ConnectionHandler::parallelRequestResponseLoop(Connection& connection, boost::as
closeConnectionGracefully &= closeGracefully;
break;
}

bool const spawnSuccess = tasksGroup.spawn(
yield, // spawn on the same strand
[this, &stop, &closeConnectionGracefully, &connection, request = std::move(expectedRequest).value()](
boost::asio::yield_context innerYield
) mutable {
auto maybeCloseConnectionGracefully = processRequest(connection, request, innerYield);
if (maybeCloseConnectionGracefully.has_value()) {
stop = true;
closeConnectionGracefully &= maybeCloseConnectionGracefully.value();
if (tasksGroup.canSpawn()) {
bool const spawnSuccess = tasksGroup.spawn(
yield, // spawn on the same strand
[this, &stop, &closeConnectionGracefully, &connection, request = std::move(expectedRequest).value()](
boost::asio::yield_context innerYield
) mutable {
auto maybeCloseConnectionGracefully = processRequest(connection, request, innerYield);
if (maybeCloseConnectionGracefully.has_value()) {
stop = true;
closeConnectionGracefully &= maybeCloseConnectionGracefully.value();
}
}
}
);

if (not spawnSuccess) {
);
ASSERT(spawnSuccess, "The coroutine was expected to be spawned");
} else {
connection.send(
Response{
boost::beast::http::status::too_many_requests,
Expand Down
2 changes: 2 additions & 0 deletions tests/common/util/TestHttpClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,12 @@
#include <boost/beast/core/flat_buffer.hpp>
#include <boost/beast/core/stream_traits.hpp>
#include <boost/beast/core/tcp_stream.hpp>
#include <boost/beast/http.hpp>
#include <boost/beast/http/field.hpp>
#include <boost/beast/http/message.hpp>
#include <boost/beast/http/string_body.hpp>
#include <boost/beast/http/verb.hpp>
#include <boost/beast/http/write.hpp>
#include <boost/beast/ssl/ssl_stream.hpp>
#include <boost/beast/version.hpp>
#include <openssl/err.h>
Expand Down
14 changes: 14 additions & 0 deletions tests/unit/util/CoroutineGroupTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -165,3 +165,17 @@ TEST_F(CoroutineGroupTests, TooManyCoroutines)
callback3_.Call();
});
}

TEST_F(CoroutineGroupTests, CanSpawn)
{
EXPECT_CALL(callback1_, Call);

runSpawn([this](boost::asio::yield_context yield) {
CoroutineGroup group{yield, 1};
EXPECT_TRUE(group.canSpawn());
group.spawn(yield, [&group, this](boost::asio::yield_context) {
callback1_.Call();
EXPECT_FALSE(group.canSpawn());
});
});
}

0 comments on commit cd4f882

Please sign in to comment.