From 0295910d5709a514d7d60d49c36ace4c06833660 Mon Sep 17 00:00:00 2001 From: Tommy Andersson Date: Sat, 23 Mar 2024 21:53:06 +0100 Subject: [PATCH 1/2] Add and expose settings for SD find debounce as config options In this change a configurable initial debounce interval for SD find as well as a configurable number of initial debounces are introduced. This implies that services requested in the initial debounce phase will at most wait for an initial debounce interval before being included in a SD find debounce. After the initial debounce phase is completed, all subsequent SD find debounces will use the default debounce interval. Added and exposed options: * find_initial_debounce_reps * find_initial_debounce_time --- .../configuration/include/configuration.hpp | 2 ++ .../include/configuration_impl.hpp | 8 ++++- .../configuration/src/configuration_impl.cpp | 30 +++++++++++++++++++ .../service_discovery/include/defines.hpp | 3 +- .../include/service_discovery_impl.hpp | 6 ++++ .../src/service_discovery_impl.cpp | 17 +++++++++++ 6 files changed, 64 insertions(+), 2 deletions(-) diff --git a/implementation/configuration/include/configuration.hpp b/implementation/configuration/include/configuration.hpp index dc445b4c2..1c5dfe51f 100644 --- a/implementation/configuration/include/configuration.hpp +++ b/implementation/configuration/include/configuration.hpp @@ -179,6 +179,8 @@ class configuration { virtual ttl_t get_sd_ttl() const = 0; virtual int32_t get_sd_cyclic_offer_delay() const = 0; virtual int32_t get_sd_request_response_delay() const = 0; + virtual std::uint32_t get_sd_find_initial_debounce_reps() const = 0; + virtual std::uint32_t get_sd_find_initial_debounce_time() const = 0; virtual std::uint32_t get_sd_offer_debounce_time() const = 0; virtual std::uint32_t get_sd_find_debounce_time() const = 0; diff --git a/implementation/configuration/include/configuration_impl.hpp b/implementation/configuration/include/configuration_impl.hpp index da8cf2e74..e4061092f 100644 --- a/implementation/configuration/include/configuration_impl.hpp +++ b/implementation/configuration/include/configuration_impl.hpp @@ -195,6 +195,8 @@ class configuration_impl: VSOMEIP_EXPORT ttl_t get_sd_ttl() const; VSOMEIP_EXPORT int32_t get_sd_cyclic_offer_delay() const; VSOMEIP_EXPORT int32_t get_sd_request_response_delay() const; + VSOMEIP_EXPORT std::uint32_t get_sd_find_initial_debounce_reps() const; + VSOMEIP_EXPORT std::uint32_t get_sd_find_initial_debounce_time() const; VSOMEIP_EXPORT std::uint32_t get_sd_offer_debounce_time() const; VSOMEIP_EXPORT std::uint32_t get_sd_find_debounce_time() const; @@ -539,6 +541,8 @@ class configuration_impl: int32_t sd_request_response_delay_; std::uint32_t sd_offer_debounce_time_; std::uint32_t sd_find_debounce_time_; + uint8_t sd_find_initial_debounce_reps_; + std::uint32_t sd_find_initial_debounce_time_; std::map > magic_cookies_; @@ -587,6 +591,8 @@ class configuration_impl: ET_WATCHDOG_ALLOWED_MISSING_PONGS, ET_TRACING_ENABLE, ET_TRACING_SD_ENABLE, + ET_SERVICE_DISCOVERY_FIND_INITIAL_DEBOUNCE_REPS, + ET_SERVICE_DISCOVERY_FIND_INITIAL_DEBOUNCE_TIME, ET_SERVICE_DISCOVERY_OFFER_DEBOUNCE_TIME, ET_SERVICE_DISCOVERY_FIND_DEBOUNCE_TIME, ET_SERVICE_DISCOVERY_TTL_FACTOR_OFFERS, @@ -608,7 +614,7 @@ class configuration_impl: ET_SECURITY_AUDIT_MODE, ET_SECURITY_REMOTE_ACCESS, ET_INITIAL_ROUTING_STATE, - ET_MAX = 47 + ET_MAX = 49 }; bool is_configured_[ET_MAX]; diff --git a/implementation/configuration/src/configuration_impl.cpp b/implementation/configuration/src/configuration_impl.cpp index 21c708b60..0b8f6e52a 100644 --- a/implementation/configuration/src/configuration_impl.cpp +++ b/implementation/configuration/src/configuration_impl.cpp @@ -59,6 +59,8 @@ configuration_impl::configuration_impl(const std::string& _path) : sd_request_response_delay_ {VSOMEIP_SD_DEFAULT_REQUEST_RESPONSE_DELAY}, sd_offer_debounce_time_ {VSOMEIP_SD_DEFAULT_OFFER_DEBOUNCE_TIME}, sd_find_debounce_time_ {VSOMEIP_SD_DEFAULT_FIND_DEBOUNCE_TIME}, + sd_find_initial_debounce_reps_(VSOMEIP_SD_INITIAL_FIND_DEBOUNCE_REPS), + sd_find_initial_debounce_time_(VSOMEIP_SD_INITIAL_FIND_DEBOUNCE_TIME), max_configured_message_size_ {0}, max_local_message_size_ {0}, max_reliable_message_size_ {0}, max_unreliable_message_size_ {0}, buffer_shrink_threshold_ {VSOMEIP_DEFAULT_BUFFER_SHRINK_THRESHOLD}, @@ -154,6 +156,8 @@ configuration_impl::configuration_impl(const configuration_impl& _other) : sd_ttl_ = _other.sd_ttl_; sd_cyclic_offer_delay_= _other.sd_cyclic_offer_delay_; sd_request_response_delay_= _other.sd_request_response_delay_; + sd_find_initial_debounce_reps_ = _other.sd_find_initial_debounce_reps_; + sd_find_initial_debounce_time_ = _other.sd_find_initial_debounce_time_; sd_offer_debounce_time_ = _other.sd_offer_debounce_time_; sd_find_debounce_time_ = _other.sd_find_debounce_time_; @@ -1800,6 +1804,24 @@ void configuration_impl::load_service_discovery( its_converter >> sd_request_response_delay_; is_configured_[ET_SERVICE_DISCOVERY_REQUEST_RESPONSE_DELAY] = true; } + } else if (its_key == "find_initial_debounce_reps") { + if (is_configured_[ET_SERVICE_DISCOVERY_FIND_INITIAL_DEBOUNCE_REPS]) { + VSOMEIP_WARNING << "Multiple definitions for service_discovery.find_initial_debounce_reps." + " Ignoring definition from " << _element.name_; + } else { + its_converter << its_value; + its_converter >> sd_find_initial_debounce_reps_; + is_configured_[ET_SERVICE_DISCOVERY_FIND_INITIAL_DEBOUNCE_REPS] = true; + } + } else if (its_key == "find_initial_debounce_time") { + if (is_configured_[ET_SERVICE_DISCOVERY_FIND_INITIAL_DEBOUNCE_TIME]) { + VSOMEIP_WARNING << "Multiple definitions for service_discovery.find_initial_debounce_time." + " Ignoring definition from " << _element.name_; + } else { + its_converter << its_value; + its_converter >> sd_find_initial_debounce_time_; + is_configured_[ET_SERVICE_DISCOVERY_FIND_INITIAL_DEBOUNCE_TIME] = true; + } } else if (its_key == "offer_debounce_time") { if (is_configured_[ET_SERVICE_DISCOVERY_OFFER_DEBOUNCE_TIME]) { VSOMEIP_WARNING << "Multiple definitions for service_discovery.offer_debounce." @@ -3677,6 +3699,14 @@ int32_t configuration_impl::get_sd_request_response_delay() const { return sd_request_response_delay_; } +std::uint32_t configuration_impl::get_sd_find_initial_debounce_reps() const { + return sd_find_initial_debounce_reps_; +} + +std::uint32_t configuration_impl::get_sd_find_initial_debounce_time() const { + return sd_find_initial_debounce_time_; +} + std::uint32_t configuration_impl::get_sd_offer_debounce_time() const { return sd_offer_debounce_time_; } diff --git a/implementation/service_discovery/include/defines.hpp b/implementation/service_discovery/include/defines.hpp index b7642f122..2f92012ec 100644 --- a/implementation/service_discovery/include/defines.hpp +++ b/implementation/service_discovery/include/defines.hpp @@ -47,6 +47,7 @@ #define VSOMEIP_SD_DEFAULT_REQUEST_RESPONSE_DELAY 2000 #define VSOMEIP_SD_DEFAULT_OFFER_DEBOUNCE_TIME 500 #define VSOMEIP_SD_DEFAULT_FIND_DEBOUNCE_TIME 500 - +#define VSOMEIP_SD_INITIAL_FIND_DEBOUNCE_TIME 200 +#define VSOMEIP_SD_INITIAL_FIND_DEBOUNCE_REPS 0 #endif // VSOMEIP_SD_DEFINES_HPP diff --git a/implementation/service_discovery/include/service_discovery_impl.hpp b/implementation/service_discovery/include/service_discovery_impl.hpp index d07fcb1f7..66c4c28a9 100644 --- a/implementation/service_discovery/include/service_discovery_impl.hpp +++ b/implementation/service_discovery/include/service_discovery_impl.hpp @@ -434,6 +434,12 @@ class service_discovery_impl: public service_discovery, std::mutex collected_offers_mutex_; services_t collected_offers_; + // configurable debounce time for a configuarble number of inital debounce repetitions + std::uint32_t find_initial_debounce_reps_; + std::chrono::milliseconds find_initial_debounce_time_; + // counter of remaining find initial debounce repetitions + std::uint32_t remaining_find_initial_debounce_reps_; + std::chrono::milliseconds find_debounce_time_; std::mutex find_debounce_timer_mutex_; boost::asio::steady_timer find_debounce_timer_; diff --git a/implementation/service_discovery/src/service_discovery_impl.cpp b/implementation/service_discovery/src/service_discovery_impl.cpp index 72a2517a4..0a273f747 100644 --- a/implementation/service_discovery/src/service_discovery_impl.cpp +++ b/implementation/service_discovery/src/service_discovery_impl.cpp @@ -148,6 +148,10 @@ service_discovery_impl::init() { repetitions_max_ = configuration_->get_sd_repetitions_max(); cyclic_offer_delay_ = std::chrono::milliseconds( configuration_->get_sd_cyclic_offer_delay()); + remaining_find_initial_debounce_reps_ = 0; + find_initial_debounce_reps_ = configuration_->get_sd_find_initial_debounce_reps(); + find_initial_debounce_time_ = std::chrono::milliseconds( + configuration_->get_sd_find_initial_debounce_time()); offer_debounce_time_ = std::chrono::milliseconds( configuration_->get_sd_offer_debounce_time()); ttl_timer_runtime_ = cyclic_offer_delay_ / 2; @@ -2892,6 +2896,8 @@ service_discovery_impl::start_find_debounce_timer(bool _first_start) { boost::system::error_code ec; if (_first_start) { find_debounce_timer_.expires_from_now(initial_delay_, ec); + } else if (remaining_find_initial_debounce_reps_ > 0) { + find_debounce_timer_.expires_from_now(find_initial_debounce_time_, ec); } else { find_debounce_timer_.expires_from_now(find_debounce_time_, ec); } @@ -2899,6 +2905,17 @@ service_discovery_impl::start_find_debounce_timer(bool _first_start) { VSOMEIP_ERROR<< "service_discovery_impl::start_find_debounce_timer " "setting expiry time of timer failed: " << ec.message(); } + + if (_first_start) { + // Reset the number of remaining initial debounce cycles for find + remaining_find_initial_debounce_reps_ = find_initial_debounce_reps_; + } else { + if (remaining_find_initial_debounce_reps_ > 0) { + // Decrement the number of remaining initial debounce cycles for find + remaining_find_initial_debounce_reps_--; + } + } + find_debounce_timer_.async_wait( std::bind( &service_discovery_impl::on_find_debounce_timer_expired, From 791ab41c231eb2ce5efeb2207de8535e40a1d968 Mon Sep 17 00:00:00 2001 From: Tommy Andersson Date: Wed, 19 Jun 2024 11:44:40 +0200 Subject: [PATCH 2/2] Simplify "Add and expose settings for SD find debounce as config options" Changed find_initial_debounce_reps from uint32_t to uint8_t Simplified propsed logic change in service_discovery_impl This commit should be squashed into previous. --- documentation/vsomeipConfiguration.md | 2 ++ .../configuration/include/configuration.hpp | 2 +- .../include/configuration_impl.hpp | 2 +- .../configuration/src/configuration_impl.cpp | 12 ++++++++++-- .../include/service_discovery_impl.hpp | 7 +++---- .../src/service_discovery_impl.cpp | 17 ++++------------- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/documentation/vsomeipConfiguration.md b/documentation/vsomeipConfiguration.md index 600bc4d2f..e085910d4 100644 --- a/documentation/vsomeipConfiguration.md +++ b/documentation/vsomeipConfiguration.md @@ -625,6 +625,8 @@ The general filter rules are: - **offer_debounce_time** - Time which the stack collects new service offers before they enter the repetition phase. This can be used to reduce the number of sent messages during startup. The default value is `500` ms. - **find_debounce_time** - Time which the stack collects non local service requests before sending find messages. The default value is `500` ms. - **max_remote_subscribers** - Maximum possible number of different remote subscribers. Additional remote subscribers will not be acknowledged. The default value is `3`. + - **find_initial_debounce_reps** - Number of initial debounces using find_initial_debounce_time. This can be used to modify the number of sent messages during initial part of startup (valid values: `0 - 2^8-1`). The default setting is `0`. + - **find_initial_debounce_time** - Time which the stack collects new service requests before they enter the repetition phase. This can be used to modify the number of sent messages during initial part of startup. The default setting is `200` ms.
Service Discovery configuration diff --git a/implementation/configuration/include/configuration.hpp b/implementation/configuration/include/configuration.hpp index 1c5dfe51f..6b37339c2 100644 --- a/implementation/configuration/include/configuration.hpp +++ b/implementation/configuration/include/configuration.hpp @@ -179,7 +179,7 @@ class configuration { virtual ttl_t get_sd_ttl() const = 0; virtual int32_t get_sd_cyclic_offer_delay() const = 0; virtual int32_t get_sd_request_response_delay() const = 0; - virtual std::uint32_t get_sd_find_initial_debounce_reps() const = 0; + virtual uint8_t get_sd_find_initial_debounce_reps() const = 0; virtual std::uint32_t get_sd_find_initial_debounce_time() const = 0; virtual std::uint32_t get_sd_offer_debounce_time() const = 0; virtual std::uint32_t get_sd_find_debounce_time() const = 0; diff --git a/implementation/configuration/include/configuration_impl.hpp b/implementation/configuration/include/configuration_impl.hpp index e4061092f..53848ec5a 100644 --- a/implementation/configuration/include/configuration_impl.hpp +++ b/implementation/configuration/include/configuration_impl.hpp @@ -195,7 +195,7 @@ class configuration_impl: VSOMEIP_EXPORT ttl_t get_sd_ttl() const; VSOMEIP_EXPORT int32_t get_sd_cyclic_offer_delay() const; VSOMEIP_EXPORT int32_t get_sd_request_response_delay() const; - VSOMEIP_EXPORT std::uint32_t get_sd_find_initial_debounce_reps() const; + VSOMEIP_EXPORT uint8_t get_sd_find_initial_debounce_reps() const; VSOMEIP_EXPORT std::uint32_t get_sd_find_initial_debounce_time() const; VSOMEIP_EXPORT std::uint32_t get_sd_offer_debounce_time() const; VSOMEIP_EXPORT std::uint32_t get_sd_find_debounce_time() const; diff --git a/implementation/configuration/src/configuration_impl.cpp b/implementation/configuration/src/configuration_impl.cpp index 0b8f6e52a..de6f53a38 100644 --- a/implementation/configuration/src/configuration_impl.cpp +++ b/implementation/configuration/src/configuration_impl.cpp @@ -1809,8 +1809,16 @@ void configuration_impl::load_service_discovery( VSOMEIP_WARNING << "Multiple definitions for service_discovery.find_initial_debounce_reps." " Ignoring definition from " << _element.name_; } else { + int tmp; its_converter << its_value; - its_converter >> sd_find_initial_debounce_reps_; + its_converter >> tmp; + if (tmp == static_cast(tmp)) { + sd_find_initial_debounce_reps_ = static_cast(tmp); + } + else { + VSOMEIP_WARNING << "Invalid value for service_discovery.find_initial_debounce_reps: " << tmp; + sd_find_initial_debounce_reps_ = std::numeric_limits::max(); + } is_configured_[ET_SERVICE_DISCOVERY_FIND_INITIAL_DEBOUNCE_REPS] = true; } } else if (its_key == "find_initial_debounce_time") { @@ -3699,7 +3707,7 @@ int32_t configuration_impl::get_sd_request_response_delay() const { return sd_request_response_delay_; } -std::uint32_t configuration_impl::get_sd_find_initial_debounce_reps() const { +uint8_t configuration_impl::get_sd_find_initial_debounce_reps() const { return sd_find_initial_debounce_reps_; } diff --git a/implementation/service_discovery/include/service_discovery_impl.hpp b/implementation/service_discovery/include/service_discovery_impl.hpp index 66c4c28a9..32b7f5475 100644 --- a/implementation/service_discovery/include/service_discovery_impl.hpp +++ b/implementation/service_discovery/include/service_discovery_impl.hpp @@ -434,11 +434,10 @@ class service_discovery_impl: public service_discovery, std::mutex collected_offers_mutex_; services_t collected_offers_; - // configurable debounce time for a configuarble number of inital debounce repetitions - std::uint32_t find_initial_debounce_reps_; + // interval between debounces during the initial debounce phase of the finds std::chrono::milliseconds find_initial_debounce_time_; - // counter of remaining find initial debounce repetitions - std::uint32_t remaining_find_initial_debounce_reps_; + // tracks number of remaining debounces for the initial debounce phase of the finds + uint8_t remaining_find_initial_debounce_reps_; std::chrono::milliseconds find_debounce_time_; std::mutex find_debounce_timer_mutex_; diff --git a/implementation/service_discovery/src/service_discovery_impl.cpp b/implementation/service_discovery/src/service_discovery_impl.cpp index 0a273f747..b2a073c42 100644 --- a/implementation/service_discovery/src/service_discovery_impl.cpp +++ b/implementation/service_discovery/src/service_discovery_impl.cpp @@ -68,6 +68,8 @@ service_discovery_impl::service_discovery_impl( repetitions_max_(VSOMEIP_SD_DEFAULT_REPETITIONS_MAX), cyclic_offer_delay_(VSOMEIP_SD_DEFAULT_CYCLIC_OFFER_DELAY), offer_debounce_timer_(_host->get_io()), + find_initial_debounce_time_(VSOMEIP_SD_INITIAL_FIND_DEBOUNCE_TIME), + remaining_find_initial_debounce_reps_(VSOMEIP_SD_INITIAL_FIND_DEBOUNCE_REPS), find_debounce_time_(VSOMEIP_SD_DEFAULT_FIND_DEBOUNCE_TIME), find_debounce_timer_(_host->get_io()), main_phase_timer_(_host->get_io()), @@ -148,8 +150,7 @@ service_discovery_impl::init() { repetitions_max_ = configuration_->get_sd_repetitions_max(); cyclic_offer_delay_ = std::chrono::milliseconds( configuration_->get_sd_cyclic_offer_delay()); - remaining_find_initial_debounce_reps_ = 0; - find_initial_debounce_reps_ = configuration_->get_sd_find_initial_debounce_reps(); + remaining_find_initial_debounce_reps_ = configuration_->get_sd_find_initial_debounce_reps(); find_initial_debounce_time_ = std::chrono::milliseconds( configuration_->get_sd_find_initial_debounce_time()); offer_debounce_time_ = std::chrono::milliseconds( @@ -2898,6 +2899,7 @@ service_discovery_impl::start_find_debounce_timer(bool _first_start) { find_debounce_timer_.expires_from_now(initial_delay_, ec); } else if (remaining_find_initial_debounce_reps_ > 0) { find_debounce_timer_.expires_from_now(find_initial_debounce_time_, ec); + --remaining_find_initial_debounce_reps_; } else { find_debounce_timer_.expires_from_now(find_debounce_time_, ec); } @@ -2905,17 +2907,6 @@ service_discovery_impl::start_find_debounce_timer(bool _first_start) { VSOMEIP_ERROR<< "service_discovery_impl::start_find_debounce_timer " "setting expiry time of timer failed: " << ec.message(); } - - if (_first_start) { - // Reset the number of remaining initial debounce cycles for find - remaining_find_initial_debounce_reps_ = find_initial_debounce_reps_; - } else { - if (remaining_find_initial_debounce_reps_ > 0) { - // Decrement the number of remaining initial debounce cycles for find - remaining_find_initial_debounce_reps_--; - } - } - find_debounce_timer_.async_wait( std::bind( &service_discovery_impl::on_find_debounce_timer_expired,