From a6b8017fb265b1cf2dcee454173d6758202f8503 Mon Sep 17 00:00:00 2001 From: Marcelo Zimbres Date: Sun, 4 Feb 2024 15:34:37 +0100 Subject: [PATCH 01/12] Fixes issue 181. --- README.md | 5 ++ .../boost/redis/detail/connection_base.hpp | 15 ++++- test/CMakeLists.txt | 1 + test/test_issue_181.cpp | 64 +++++++++++++++++++ 4 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 test/test_issue_181.cpp diff --git a/README.md b/README.md index 25e5817b..608c9b74 100644 --- a/README.md +++ b/README.md @@ -693,6 +693,11 @@ https://lists.boost.org/Archives/boost/2023/01/253944.php. apps need only one connection for their entire application, which makes the overhead of one ssl-context per connection negligible. +* ([Issue 181](https://github.com/boostorg/redis/issues/181)). + See a detailed description of this bug in + [this](https://github.com/boostorg/redis/issues/181#issuecomment-1913346983) + comment. + ### Boost 1.84 (First release in Boost) * Deprecates the `async_receive` overload that takes a response. Users diff --git a/include/boost/redis/detail/connection_base.hpp b/include/boost/redis/detail/connection_base.hpp index 043203bc..69ae68ca 100644 --- a/include/boost/redis/detail/connection_base.hpp +++ b/include/boost/redis/detail/connection_base.hpp @@ -506,6 +506,9 @@ class connection_base { usage get_usage() const noexcept { return usage_; } + auto run_is_canceled() const noexcept + { return cancel_run_called_; } + private: using receive_channel_type = asio::experimental::channel; using runner_type = runner; @@ -539,6 +542,7 @@ class connection_base { }); reqs_.erase(point, std::end(reqs_)); + std::for_each(std::begin(reqs_), std::end(reqs_), [](auto const& ptr) { return ptr->mark_waiting(); }); @@ -575,6 +579,12 @@ class connection_base { } break; case operation::run: { + // Protects the code below from being called more than + // once, see https://github.com/boostorg/redis/issues/181 + if (std::exchange(cancel_run_called_, true)) { + return; + } + close(); writer_timer_.cancel(); receive_channel_.cancel(); @@ -601,8 +611,9 @@ class connection_base { // partition of unwritten requests instead of them all. std::for_each(std::begin(reqs_), std::end(reqs_), [](auto const& ptr) { BOOST_ASSERT_MSG(ptr != nullptr, "Expects non-null pointer."); - if (ptr->is_staged()) + if (ptr->is_staged()) { ptr->mark_written(); + } }); } @@ -921,6 +932,7 @@ class connection_base { read_buffer_.clear(); parser_.reset(); on_push_ = false; + cancel_run_called_ = false; } asio::ssl::context ctx_; @@ -942,6 +954,7 @@ class connection_base { reqs_type reqs_; resp3::parser parser_{}; bool on_push_ = false; + bool cancel_run_called_ = false; usage usage_; }; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 40edb275..049469f3 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -47,6 +47,7 @@ make_test(test_conn_exec_cancel2 20) make_test(test_conn_echo_stress 20) make_test(test_conn_run_cancel 20) make_test(test_issue_50 20) +make_test(test_issue_181 17) # Coverage set( diff --git a/test/test_issue_181.cpp b/test/test_issue_181.cpp new file mode 100644 index 00000000..123f902d --- /dev/null +++ b/test/test_issue_181.cpp @@ -0,0 +1,64 @@ +/* Copyright (c) 2018-2024 Marcelo Zimbres Silva (mzimbres@gmail.com) + * + * Distributed under the Boost Software License, Version 1.0. (See + * accompanying file LICENSE.txt) + */ + +#include +#include +#include +#include +#define BOOST_TEST_MODULE conn-quit +#include +#include +#include +#include +#include +#include +#include "common.hpp" + +namespace net = boost::asio; +using boost::redis::request; +using boost::redis::request; +using boost::redis::response; +using boost::redis::ignore; +using boost::redis::logger; +using boost::redis::config; +using boost::redis::operation; +using boost::redis::connection; +using boost::system::error_code; +using namespace std::chrono_literals; + +BOOST_AUTO_TEST_CASE(issue_181) +{ + using connection_base = boost::redis::detail::connection_base; + + auto const level = boost::redis::logger::level::debug; + net::io_context ioc; + auto ctx = net::ssl::context{net::ssl::context::tlsv12_client}; + connection_base conn{ioc.get_executor(), std::move(ctx), 1000000}; + net::steady_timer timer{ioc}; + timer.expires_after(std::chrono::seconds{1}); + + auto run_cont = [&](auto ec){ + std::cout << "async_run1: " << ec.message() << std::endl; + }; + + auto cfg = make_test_config(); + cfg.health_check_interval = std::chrono::seconds{0}; + cfg.reconnect_wait_interval = std::chrono::seconds{0}; + conn.async_run(cfg, boost::redis::logger{level}, run_cont); + BOOST_TEST(!conn.run_is_canceled()); + + // Uses a timer to wait some time until run has been called. + auto timer_cont = [&](auto ec){ + std::cout << "timer_cont: " << ec.message() << std::endl; + BOOST_TEST(!conn.run_is_canceled()); + conn.cancel(operation::run); + BOOST_TEST(conn.run_is_canceled()); + }; + + timer.async_wait(timer_cont); + + ioc.run(); +} From 30fcbc978241c466afca6761ace1e8a6438cf9c0 Mon Sep 17 00:00:00 2001 From: Marcelo Zimbres Date: Sun, 11 Feb 2024 22:11:27 +0100 Subject: [PATCH 02/12] Refactors add_hello and adds unit tests. --- README.md | 4 ++ include/boost/redis/config.hpp | 2 +- include/boost/redis/detail/runner.hpp | 20 +++------- include/boost/redis/impl/runner.ipp | 27 +++++++++++++ include/boost/redis/src.hpp | 1 + test/test_low_level_sync_sans_io.cpp | 57 +++++++++++++++++++++++++++ 6 files changed, 96 insertions(+), 15 deletions(-) create mode 100644 include/boost/redis/impl/runner.ipp diff --git a/README.md b/README.md index 608c9b74..90d771e3 100644 --- a/README.md +++ b/README.md @@ -698,6 +698,10 @@ https://lists.boost.org/Archives/boost/2023/01/253944.php. [this](https://github.com/boostorg/redis/issues/181#issuecomment-1913346983) comment. +* ([Issue 182](https://github.com/boostorg/redis/issues/182)). + Sets `"default"` as the default value of `config::username`. This + makes it simpler to use the `requirepass` configuration in Redis. + ### Boost 1.84 (First release in Boost) * Deprecates the `async_receive` overload that takes a response. Users diff --git a/include/boost/redis/config.hpp b/include/boost/redis/config.hpp index b3297501..caadd80d 100644 --- a/include/boost/redis/config.hpp +++ b/include/boost/redis/config.hpp @@ -38,7 +38,7 @@ struct config { * [HELLO](https://redis.io/commands/hello/) command. If left * empty `HELLO` will be sent without authentication parameters. */ - std::string username; + std::string username = "default"; /** @brief Password passed to the * [HELLO](https://redis.io/commands/hello/) command. If left diff --git a/include/boost/redis/detail/runner.hpp b/include/boost/redis/detail/runner.hpp index 5d0c66b5..f257019b 100644 --- a/include/boost/redis/detail/runner.hpp +++ b/include/boost/redis/detail/runner.hpp @@ -30,6 +30,8 @@ namespace boost::redis::detail { +void push_hello(config const& cfg, request& req); + template struct hello_op { Runner* runner_ = nullptr; @@ -42,9 +44,6 @@ struct hello_op { { BOOST_ASIO_CORO_REENTER (coro_) { - runner_->hello_req_.clear(); - if (runner_->hello_resp_.has_value()) - runner_->hello_resp_.value().clear(); runner_->add_hello(); BOOST_ASIO_CORO_YIELD @@ -232,17 +231,10 @@ class runner { void add_hello() { - if (!cfg_.username.empty() && !cfg_.password.empty() && !cfg_.clientname.empty()) - hello_req_.push("HELLO", "3", "AUTH", cfg_.username, cfg_.password, "SETNAME", cfg_.clientname); - else if (cfg_.username.empty() && cfg_.password.empty() && cfg_.clientname.empty()) - hello_req_.push("HELLO", "3"); - else if (cfg_.clientname.empty()) - hello_req_.push("HELLO", "3", "AUTH", cfg_.username, cfg_.password); - else - hello_req_.push("HELLO", "3", "SETNAME", cfg_.clientname); - - if (cfg_.database_index && cfg_.database_index.value() != 0) - hello_req_.push("SELECT", cfg_.database_index.value()); + hello_req_.clear(); + if (hello_resp_.has_value()) + hello_resp_.value().clear(); + push_hello(cfg_, hello_req_); } bool has_error_in_response() const noexcept diff --git a/include/boost/redis/impl/runner.ipp b/include/boost/redis/impl/runner.ipp new file mode 100644 index 00000000..293ad92e --- /dev/null +++ b/include/boost/redis/impl/runner.ipp @@ -0,0 +1,27 @@ +/* Copyright (c) 2018-2024 Marcelo Zimbres Silva (mzimbres@gmail.com) + * + * Distributed under the Boost Software License, Version 1.0. (See + * accompanying file LICENSE.txt) + */ + +#include + +namespace boost::redis::detail +{ + +void push_hello(config const& cfg, request& req) +{ + if (!cfg.username.empty() && !cfg.password.empty() && !cfg.clientname.empty()) + req.push("HELLO", "3", "AUTH", cfg.username, cfg.password, "SETNAME", cfg.clientname); + else if (cfg.password.empty() && cfg.clientname.empty()) + req.push("HELLO", "3"); + else if (cfg.clientname.empty()) + req.push("HELLO", "3", "AUTH", cfg.username, cfg.password); + else + req.push("HELLO", "3", "SETNAME", cfg.clientname); + + if (cfg.database_index && cfg.database_index.value() != 0) + req.push("SELECT", cfg.database_index.value()); +} + +} // boost::redis::detail diff --git a/include/boost/redis/src.hpp b/include/boost/redis/src.hpp index 7751971a..f749e3f3 100644 --- a/include/boost/redis/src.hpp +++ b/include/boost/redis/src.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include diff --git a/test/test_low_level_sync_sans_io.cpp b/test/test_low_level_sync_sans_io.cpp index 441f8098..12e4980a 100644 --- a/test/test_low_level_sync_sans_io.cpp +++ b/test/test_low_level_sync_sans_io.cpp @@ -4,6 +4,7 @@ * accompanying file LICENSE.txt) */ +#include #include #include #define BOOST_TEST_MODULE conn-quit @@ -11,6 +12,9 @@ #include #include +using boost::redis::request; +using boost::redis::config; +using boost::redis::detail::push_hello; using boost::redis::adapter::adapt2; using boost::redis::adapter::result; using boost::redis::resp3::detail::deserialize; @@ -31,3 +35,56 @@ BOOST_AUTO_TEST_CASE(low_level_sync_sans_io) exit(EXIT_FAILURE); } } + +BOOST_AUTO_TEST_CASE(config_to_hello) +{ + config cfg; + cfg.clientname = ""; + request req; + + push_hello(cfg, req); + + std::string_view const expected = "*2\r\n$5\r\nHELLO\r\n$1\r\n3\r\n"; + BOOST_CHECK_EQUAL(req.payload(), expected); +} + +BOOST_AUTO_TEST_CASE(config_to_hello_with_select) +{ + config cfg; + cfg.clientname = ""; + cfg.database_index = 10; + request req; + + push_hello(cfg, req); + + std::string_view const expected = + "*2\r\n$5\r\nHELLO\r\n$1\r\n3\r\n" + "*2\r\n$6\r\nSELECT\r\n$2\r\n10\r\n"; + + BOOST_CHECK_EQUAL(req.payload(), expected); +} + +BOOST_AUTO_TEST_CASE(config_to_hello_cmd_clientname) +{ + config cfg; + request req; + + push_hello(cfg, req); + + std::string_view const expected = "*4\r\n$5\r\nHELLO\r\n$1\r\n3\r\n$7\r\nSETNAME\r\n$11\r\nBoost.Redis\r\n"; + BOOST_CHECK_EQUAL(req.payload(), expected); +} + +BOOST_AUTO_TEST_CASE(config_to_hello_cmd_auth) +{ + config cfg; + cfg.clientname = ""; + cfg.username = "foo"; + cfg.password = "bar"; + request req; + + push_hello(cfg, req); + + std::string_view const expected = "*5\r\n$5\r\nHELLO\r\n$1\r\n3\r\n$4\r\nAUTH\r\n$3\r\nfoo\r\n$3\r\nbar\r\n"; + BOOST_CHECK_EQUAL(req.payload(), expected); +} From 1378b32c2e2d914df0614f61d122697868a83f50 Mon Sep 17 00:00:00 2001 From: Marcelo Zimbres Date: Sat, 17 Feb 2024 21:05:15 +0100 Subject: [PATCH 03/12] Adds endian to the list of dependencies --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 60d07175..b86c4264 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -77,6 +77,7 @@ if (BOOST_REDIS_MAIN_PROJECT) functional test json + endian ) foreach(dep IN LISTS deps) From 4b8b609c8e35a523b100b1afe68baf3fae64f970 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Mon, 11 Mar 2024 08:38:18 -0500 Subject: [PATCH 04/12] Make the library modular usable. --- build.jam | 25 +++++++++++++++++++++++++ test/Jamfile | 4 ++-- 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 build.jam diff --git a/build.jam b/build.jam new file mode 100644 index 00000000..56e0b71f --- /dev/null +++ b/build.jam @@ -0,0 +1,25 @@ +# Copyright René Ferdinand Rivera Morell 2024 +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +import project ; + +project /boost/redis + : common-requirements + /boost/asio//boost_asio + /boost/assert//boost_assert + /boost/core//boost_core + /boost/mp11//boost_mp11 + /boost/system//boost_system + /boost/throw_exception//boost_throw_exception + include + ; + +explicit + [ alias boost_redis ] + [ alias all : boost_redis test ] + ; + +call-if : boost-library redis + ; diff --git a/test/Jamfile b/test/Jamfile index 81e1fd72..b6a859ad 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -1,5 +1,5 @@ -import ../config/checks/config : requires ; +import config : requires ; import ac ; # Configure openssl if it hasn't been done yet @@ -14,7 +14,6 @@ local requirements = BOOST_ASIO_DISABLE_BOOST_REGEX=1 msvc:"/bigobj" windows:_WIN32_WINNT=0x0601 - ../include [ requires cxx14_constexpr cxx14_generic_lambdas @@ -30,6 +29,7 @@ local requirements = ] [ ac.check-library /openssl//ssl : /openssl//ssl/shared : no ] [ ac.check-library /openssl//crypto : /openssl//crypto/shared : no ] + /boost/test//boost_unit_test_framework ; From 69bb69001e0c5687366edfe2d7ef40510a3c118d Mon Sep 17 00:00:00 2001 From: Marcelo Zimbres Date: Fri, 15 Mar 2024 11:31:30 +0100 Subject: [PATCH 05/12] Some fixes in the article about the costs of async abstractions [skip ci] --- doc/on-the-costs-of-async-abstractions.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/on-the-costs-of-async-abstractions.md b/doc/on-the-costs-of-async-abstractions.md index 55615318..d728c584 100644 --- a/doc/on-the-costs-of-async-abstractions.md +++ b/doc/on-the-costs-of-async-abstractions.md @@ -17,7 +17,7 @@ here influenced my views on the proposed (a.k.a. Senders and Receivers), which is likely to become the basis of networking in upcoming C++ standards. -Although the analysis presented here uses the Redis communication +Although the analysis presented in this article uses the Redis communication protocol for illustration I expect it to be useful in general since [RESP3](https://github.com/antirez/RESP3/blob/master/spec.md) shares many similarities with other widely used protocols such as HTTP. @@ -98,7 +98,7 @@ This is illustrated in the diagram below |<---- offset threshold ---->| | | "+PONG\r\n:100\r\n+OK\r\n_\r\n+PONG\r\n" - | # Initial message + | # Initial offset "+PONG\r\n:100\r\n+OK\r\n_\r\n+PONG\r\n" |<------>| # After 1st message @@ -110,7 +110,7 @@ This is illustrated in the diagram below |<--------------------->| # After 3rd message "+PONG\r\n:100\r\n+OK\r\n_\r\n+PONG\r\n" - |<-------------------------->| # 4th message crosses the threashold + |<-------------------------->| # Threshold crossed after the 4th message "+PONG\r\n" | # After rotation @@ -255,7 +255,7 @@ avoided, this is what worked for Boost.Redis `try_send_via_dispatch` for a more aggressive optimization). 3. Coalescing of individual requests into a single payload to reduce - the number of necessary writes on the socket,this is only + the number of necessary writes on the socket, this is only possible because Redis supports pipelining (good protocols help!). @@ -282,8 +282,8 @@ avoided, this is what worked for Boost.Redis `resp3::async_read` is IO-less. Sometimes it is not possible to avoid asynchronous operations that -complete synchronously, in the following sections we will therefore -see how favoring throughput over fairness works in Boost.Asio. +complete synchronously, in the following sections we will see how to +favor throughput over fairness in Boost.Asio. ### Calling the continuation inline @@ -299,7 +299,7 @@ async_read_until(socket, buffer, "\r\n", continuation); // Immediate completions are executed in exec2 (otherwise equal to the // version above). The completion is called inline if exec2 is the -same // executor that is running the operation. +// same executor that is running the operation. async_read_until(socket, buffer, "\r\n", bind_immediate_executor(exec2, completion)); ``` @@ -388,7 +388,7 @@ Although faster, this strategy has some downsides - Requires additional layers of complexity such as `bind_immediate_executor` in addition to `bind_executor`. - - Not compliat with more strict + - Non-compliat with more strict [guidelines](https://en.wikipedia.org/wiki/The_Power_of_10:_Rules_for_Developing_Safety-Critical_Code) that prohibits reentrat code. @@ -432,7 +432,7 @@ instructing the asynchronous operation to call the completion inline on immediate completion. It turns out however that coroutine support for _tail-calls_ provide a way to completely sidestep this problem. This feature is described by -[Backer](https://lewissbaker.github.io/2020/05/11/understanding_symmetric_transfer) +[Lewis Baker](https://lewissbaker.github.io/2020/05/11/understanding_symmetric_transfer) as follows > A tail-call is one where the current stack-frame is popped before @@ -581,7 +581,7 @@ reentracy, allowing [sixteen](https://github.com/NVIDIA/stdexec/blob/83cdb92d316e8b3bca1357e2cf49fc39e9bed403/include/exec/trampoline_scheduler.hpp#L52) levels of inline calls by default. While in Boost.Asio it is possible to use reentracy as an optimization for a corner cases, here it is made its -_modus operandi_, my opinion about this has already been stated in a +_modus operandi_, the downsides of this approach have already been stated in a previous section so I won't repeat it here. Also the fact that a special scheduler is needed by specific From 32978fe8d4106aefbab2e1438c8461df219b6fe9 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Fri, 29 Mar 2024 21:15:59 -0500 Subject: [PATCH 06/12] Switch to library requirements instead of source. As source puts extra source in install targets. --- build.jam | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build.jam b/build.jam index 56e0b71f..fcb7fea1 100644 --- a/build.jam +++ b/build.jam @@ -7,12 +7,12 @@ import project ; project /boost/redis : common-requirements - /boost/asio//boost_asio - /boost/assert//boost_assert - /boost/core//boost_core - /boost/mp11//boost_mp11 - /boost/system//boost_system - /boost/throw_exception//boost_throw_exception + /boost/asio//boost_asio + /boost/assert//boost_assert + /boost/core//boost_core + /boost/mp11//boost_mp11 + /boost/system//boost_system + /boost/throw_exception//boost_throw_exception include ; From 60bd6eeed4923eadbfbc9c0771042fb275984e95 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Sat, 4 May 2024 23:32:06 -0500 Subject: [PATCH 07/12] Add missing import-search for cconfig/predef checks. --- test/Jamfile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/Jamfile b/test/Jamfile index b6a859ad..30cb4235 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -1,4 +1,5 @@ +import-search /boost/config/checks ; import config : requires ; import ac ; @@ -6,7 +7,7 @@ import ac ; using openssl ; # Use these requirements as both regular and usage requirements across all tests -local requirements = +local requirements = BOOST_ASIO_NO_DEPRECATED=1 BOOST_ASIO_DISABLE_BOOST_ARRAY=1 BOOST_ASIO_DISABLE_BOOST_BIND=1 @@ -44,7 +45,7 @@ lib redis_test_common # B2 runs tests in parallel, and some tests rely on having exclusive # access to a Redis server, so we only run the ones that don't require a DB server. -local tests = +local tests = test_low_level_sync_sans_io test_low_level test_request @@ -54,7 +55,7 @@ local tests = # Build and run the tests for local test in $(tests) { - run + run $(test).cpp redis_test_common/static : target-name $(test) From a1d67a6bf763e98c05bb1f48630b30216f5e2210 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Sun, 5 May 2024 09:00:01 -0500 Subject: [PATCH 08/12] Add requires-b2 check to top-level build file. --- build.jam | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.jam b/build.jam index fcb7fea1..c2d1a345 100644 --- a/build.jam +++ b/build.jam @@ -3,6 +3,8 @@ # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +require-b2 5.1 ; + import project ; project /boost/redis From 8532e18034aaf820946af0333ee4f0e1dc1a003f Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Fri, 14 Jun 2024 11:33:56 -0500 Subject: [PATCH 09/12] Bump B2 require to 5.2 --- build.jam | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/build.jam b/build.jam index c2d1a345..5dfb31fb 100644 --- a/build.jam +++ b/build.jam @@ -3,9 +3,7 @@ # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -require-b2 5.1 ; - -import project ; +require-b2 5.2 ; project /boost/redis : common-requirements From 55664cd636f51f51d09310ae6c7a476c9644e816 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Tue, 23 Jul 2024 22:34:24 -0500 Subject: [PATCH 10/12] Move inter-lib dependencies to a project variable and into the build targets. --- build.jam | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/build.jam b/build.jam index 5dfb31fb..5c5c19b8 100644 --- a/build.jam +++ b/build.jam @@ -5,21 +5,24 @@ require-b2 5.2 ; +constant boost_dependencies : + /boost/asio//boost_asio + /boost/assert//boost_assert + /boost/core//boost_core + /boost/mp11//boost_mp11 + /boost/system//boost_system + /boost/throw_exception//boost_throw_exception ; + project /boost/redis : common-requirements - /boost/asio//boost_asio - /boost/assert//boost_assert - /boost/core//boost_core - /boost/mp11//boost_mp11 - /boost/system//boost_system - /boost/throw_exception//boost_throw_exception include ; explicit - [ alias boost_redis ] + [ alias boost_redis : : : : $(boost_dependencies) ] [ alias all : boost_redis test ] ; call-if : boost-library redis ; + From b232be8ead1e0a45e0dc80c36459d704793a8fb0 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Wed, 7 Aug 2024 23:43:03 -0500 Subject: [PATCH 11/12] Update build deps. --- test/Jamfile | 1 + 1 file changed, 1 insertion(+) diff --git a/test/Jamfile b/test/Jamfile index 30cb4235..80e511f2 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -8,6 +8,7 @@ using openssl ; # Use these requirements as both regular and usage requirements across all tests local requirements = + /boost/redis//boost_redis ; BOOST_ASIO_NO_DEPRECATED=1 BOOST_ASIO_DISABLE_BOOST_ARRAY=1 BOOST_ASIO_DISABLE_BOOST_BIND=1 From bd9f73c1547a87a0c0fa915245f1d7333bb10eb0 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Thu, 8 Aug 2024 07:36:45 -0500 Subject: [PATCH 12/12] Fix spurious semi-colon. --- test/Jamfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Jamfile b/test/Jamfile index 80e511f2..ad706b15 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -8,7 +8,7 @@ using openssl ; # Use these requirements as both regular and usage requirements across all tests local requirements = - /boost/redis//boost_redis ; + /boost/redis//boost_redis BOOST_ASIO_NO_DEPRECATED=1 BOOST_ASIO_DISABLE_BOOST_ARRAY=1 BOOST_ASIO_DISABLE_BOOST_BIND=1