Skip to content

Commit

Permalink
cluster: drop redundant set_status config updates
Browse files Browse the repository at this point in the history
If a follower isn't seeing controller log updates
promptly, it may issue many set_status RPCs while
it's waiting.  The controller leader should not
turn all of these into log writes: if the status
of the node already matches what it is reporting,
then do not write anything.

Fixes redpanda-data#4923
  • Loading branch information
jcsp committed May 25, 2022
1 parent 2949fc3 commit 0a2b991
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/v/cluster/config_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,14 @@ class config_manager final {

config_version get_version() const noexcept { return _seen_version; }

bool needs_update(const config_status& new_status) {
if (auto s = status.find(new_status.node); s != status.end()) {
return s->second != new_status;
} else {
return true;
}
}

private:
void merge_apply_result(
config_status&,
Expand Down
1 change: 1 addition & 0 deletions src/v/cluster/fwd.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class security_frontend;
class controller_api;
class members_frontend;
class config_frontend;
class config_manager;
class members_backend;
class data_policy_frontend;
class tx_gateway;
Expand Down
6 changes: 6 additions & 0 deletions src/v/cluster/service.cc
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ service::service(
ss::sharded<controller_api>& api,
ss::sharded<members_frontend>& members_frontend,
ss::sharded<config_frontend>& config_frontend,
ss::sharded<config_manager>& config_manager,
ss::sharded<feature_manager>& feature_manager,
ss::sharded<feature_table>& feature_table,
ss::sharded<health_monitor_frontend>& hm_frontend,
Expand All @@ -55,6 +56,7 @@ service::service(
, _api(api)
, _members_frontend(members_frontend)
, _config_frontend(config_frontend)
, _config_manager(config_manager)
, _feature_manager(feature_manager)
, _feature_table(feature_table)
, _hm_frontend(hm_frontend)
Expand Down Expand Up @@ -355,6 +357,10 @@ service::hello(hello_request&& req, rpc::streaming_context&) {

ss::future<config_status_reply>
service::config_status(config_status_request&& req, rpc::streaming_context&) {
if (!_config_manager.local().needs_update(req.status)) {
co_return config_status_reply{.error = errc::success};
}

auto ec = co_await _config_frontend.local().set_status(
req.status,
config::shard_local_cfg().replicate_append_timeout_ms()
Expand Down
2 changes: 2 additions & 0 deletions src/v/cluster/service.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class service : public controller_service {
ss::sharded<controller_api>&,
ss::sharded<members_frontend>&,
ss::sharded<config_frontend>&,
ss::sharded<config_manager>&,
ss::sharded<feature_manager>&,
ss::sharded<feature_table>&,
ss::sharded<health_monitor_frontend>&,
Expand Down Expand Up @@ -130,6 +131,7 @@ class service : public controller_service {
ss::sharded<controller_api>& _api;
ss::sharded<members_frontend>& _members_frontend;
ss::sharded<config_frontend>& _config_frontend;
ss::sharded<config_manager>& _config_manager;
ss::sharded<feature_manager>& _feature_manager;
ss::sharded<feature_table>& _feature_table;
ss::sharded<health_monitor_frontend>& _hm_frontend;
Expand Down
1 change: 1 addition & 0 deletions src/v/redpanda/application.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1204,6 +1204,7 @@ void application::start_redpanda(::stop_signal& app_signal) {
std::ref(controller->get_api()),
std::ref(controller->get_members_frontend()),
std::ref(controller->get_config_frontend()),
std::ref(controller->get_config_manager()),
std::ref(controller->get_feature_manager()),
std::ref(controller->get_feature_table()),
std::ref(controller->get_health_monitor()),
Expand Down

0 comments on commit 0a2b991

Please sign in to comment.