Skip to content

Commit f5ef1bd

Browse files
committed
Fix stats_updates_frequency router option in ClusterSets
WL#15601 added support for stats_updates_frequency in Clusters and ReplicaSets, but inadvertently changed how the default value of the option is used in ClusterSets, when the metadata version is older than 2.2. This is due to how the Router treats the default value of the option. This patch fixes this by making sure that, when the metadata has a version older than 2.2, the default value of stats_updates_frequency is 0 rather than null. Change-Id: Ia07f9c94d6432a97930ff094194e549c62f930ef
1 parent f3056c0 commit f5ef1bd

File tree

7 files changed

+351
-101
lines changed

7 files changed

+351
-101
lines changed

modules/adminapi/cluster_set/cluster_set_impl.cc

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1915,26 +1915,24 @@ void Cluster_set_impl::record_in_metadata(
19151915
// delete unrelated records if there are any
19161916
metadata->cleanup_for_cluster(seed_cluster_id);
19171917

1918-
Cluster_set_id csid = metadata->create_cluster_set_record(
1919-
this, seed_cluster_id, shcore::make_dict());
1920-
1921-
m_id = csid;
1918+
m_id = metadata->create_cluster_set_record(this, seed_cluster_id,
1919+
shcore::make_dict());
19221920

19231921
// Record the ClusterSet SSL mode in the Metadata
19241922
metadata->update_cluster_set_attribute(
1925-
csid, k_cluster_set_attribute_ssl_mode,
1923+
m_id, k_cluster_set_attribute_ssl_mode,
19261924
shcore::Value(to_string(options.ssl_mode)));
19271925

19281926
metadata->update_cluster_set_attribute(
1929-
csid, k_cluster_set_attribute_member_auth_type,
1927+
m_id, k_cluster_set_attribute_member_auth_type,
19301928
shcore::Value(to_string(auth_type)));
19311929

19321930
metadata->update_cluster_set_attribute(
1933-
csid, k_cluster_set_attribute_cert_issuer,
1931+
m_id, k_cluster_set_attribute_cert_issuer,
19341932
shcore::Value(member_auth_cert_issuer));
19351933

19361934
metadata->update_cluster_set_attribute(
1937-
csid, k_cluster_attribute_replication_allowed_host,
1935+
m_id, k_cluster_attribute_replication_allowed_host,
19381936
options.replication_allowed_host.empty()
19391937
? shcore::Value("%")
19401938
: shcore::Value(options.replication_allowed_host));
@@ -1946,9 +1944,16 @@ void Cluster_set_impl::record_in_metadata(
19461944
metadata->migrate_routers_to_clusterset(seed_cluster_id, get_id());
19471945

19481946
// Set and store the default Routing Options
1949-
for (const auto &i : k_default_clusterset_router_options)
1950-
metadata->set_global_routing_option(Cluster_type::REPLICATED_CLUSTER, csid,
1951-
i.first, i.second);
1947+
for (const auto &[name, value] : k_default_clusterset_router_options) {
1948+
if ((name == k_router_option_stats_updates_frequency) &&
1949+
(metadata->installed_version() < mysqlshdk::utils::Version(2, 2))) {
1950+
metadata->set_global_routing_option(Cluster_type::REPLICATED_CLUSTER,
1951+
m_id, name, shcore::Value(0));
1952+
} else {
1953+
metadata->set_global_routing_option(Cluster_type::REPLICATED_CLUSTER,
1954+
m_id, name, value);
1955+
}
1956+
}
19521957

19531958
// Migrate the Read Only Targets setting from Cluster to ClusterSet
19541959
log_info(

modules/adminapi/common/metadata_management_mysql.cc

Lines changed: 98 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,20 @@ bool schema_exists(const std::shared_ptr<Instance> &group_server,
119119

120120
return row ? true : false;
121121
}
122+
123+
void adjust_data(const Instance &group_server, const Version &version) {
124+
// the option "stats_updates_frequency" should be upgraded to "null", if
125+
// previous value is 0
126+
if (version >= Version(2, 2, 0))
127+
group_server.execute(
128+
"UPDATE mysql_innodb_cluster_metadata.clustersets SET router_options = "
129+
"JSON_SET(router_options, '$.stats_updates_frequency', CAST(NULL as "
130+
"JSON)) WHERE "
131+
"(NULLIF(router_options->>'$.stats_updates_frequency','null') IS NOT "
132+
"NULL) AND (CAST(router_options->>'$.stats_updates_frequency' AS "
133+
"SIGNED INTEGER) = 0)");
134+
}
135+
122136
} // namespace
123137

124138
namespace scripts {
@@ -797,10 +811,8 @@ void do_upgrade_schema(const std::shared_ptr<Instance> &group_server,
797811

798812
auto console = mysqlsh::current_console();
799813

800-
std::string instance_data = group_server->descr();
801-
auto path = get_upgrade_path(installed_ver);
802814
if (!dry_run) {
803-
console->print_info("Upgrading metadata at '" + instance_data +
815+
console->print_info("Upgrading metadata at '" + group_server->descr() +
804816
"' from version " + installed_ver.get_base() +
805817
" to version " + last_ver.get_base() + ".");
806818
}
@@ -824,114 +836,117 @@ void do_upgrade_schema(const std::shared_ptr<Instance> &group_server,
824836
kMetadataSchemaPreviousName));
825837
}
826838

839+
auto path = get_upgrade_path(installed_ver);
827840
size_t total = path.size();
841+
828842
if (path.size() > 1) {
829843
console->print_info(shcore::str_format(
830844
"Upgrade %s require %zu steps", (dry_run ? "would" : "will"), total));
831845
}
832846

833-
if (!dry_run) {
834-
mysqlshdk::utils::nullable<upgrade::Stage> stage;
835-
Version actual_version = installed_ver;
847+
if (dry_run) return;
836848

837-
std::vector<std::string> tables;
838-
Instance_list locked_instances;
839-
try {
840-
// Acquires the upgrade locks
841-
locked_instances = upgrade::get_locks(group_server);
849+
mysqlshdk::utils::nullable<upgrade::Stage> stage;
850+
Version actual_version = installed_ver;
842851

843-
console->print_info("Creating backup of the metadata schema...");
852+
std::vector<std::string> tables;
853+
Instance_list locked_instances;
854+
try {
855+
// Acquires the upgrade locks
856+
locked_instances = upgrade::get_locks(group_server);
844857

845-
backup(installed_ver, kMetadataSchemaName, kMetadataSchemaBackupName,
846-
group_server, "creating backup of the metadata");
858+
console->print_info("Creating backup of the metadata schema...");
847859

848-
DBUG_EXECUTE_IF("dba_FAIL_metadata_upgrade_at_BACKING_UP_METADATA", {
849-
throw std::logic_error(
850-
"Debug emulation of failed metadata upgrade "
851-
"BACKING_UP_METADATA.");
852-
});
860+
backup(installed_ver, kMetadataSchemaName, kMetadataSchemaBackupName,
861+
group_server, "creating backup of the metadata");
853862

854-
// Sets the upgrading version
855-
DBUG_EXECUTE_IF("dba_limit_lock_wait_timeout",
856-
{ group_server->execute("SET lock_wait_timeout=1"); });
863+
DBUG_EXECUTE_IF("dba_FAIL_metadata_upgrade_at_BACKING_UP_METADATA", {
864+
throw std::logic_error(
865+
"Debug emulation of failed metadata upgrade BACKING_UP_METADATA.");
866+
});
857867

858-
stage = upgrade::save_stage(group_server,
859-
upgrade::Stage::SETTING_UPGRADE_VERSION);
860-
actual_version = set_schema_version(group_server, kUpgradingVersion);
868+
// Sets the upgrading version
869+
DBUG_EXECUTE_IF("dba_limit_lock_wait_timeout",
870+
{ group_server->execute("SET lock_wait_timeout=1"); });
861871

862-
stage = upgrade::save_stage(group_server, upgrade::Stage::UPGRADING);
872+
stage = upgrade::save_stage(group_server,
873+
upgrade::Stage::SETTING_UPGRADE_VERSION);
874+
actual_version = set_schema_version(group_server, kUpgradingVersion);
863875

864-
DBUG_EXECUTE_IF("dba_CRASH_metadata_upgrade_at_UPGRADING", {
865-
// On a CRASH the cleanup logic would not be executed letting the
866-
// metadata in UPGRADING stage, however the locks would be released
867-
upgrade::release_locks(locked_instances);
868-
return;
869-
});
876+
stage = upgrade::save_stage(group_server, upgrade::Stage::UPGRADING);
870877

871-
group_server->execute("SET FOREIGN_KEY_CHECKS=0");
878+
DBUG_EXECUTE_IF("dba_CRASH_metadata_upgrade_at_UPGRADING", {
879+
// On a CRASH the cleanup logic would not be executed letting the
880+
// metadata in UPGRADING stage, however the locks would be released
881+
upgrade::release_locks(locked_instances);
882+
return;
883+
});
872884

873-
size_t count = 1;
874-
for (const auto &step : path) {
875-
console->print_info(shcore::str_format(
876-
"Step %zu of %zu: upgrading from %s to %s...", count++, total,
877-
step->source_version.get_base().c_str(),
878-
step->target_version.get_base().c_str()));
885+
group_server->execute("SET FOREIGN_KEY_CHECKS=0");
879886

880-
// Inter step backup so upgrade can perform the required upgrade
881-
// operations
882-
backup(step->source_version, kMetadataSchemaName,
883-
kMetadataSchemaPreviousName, group_server,
884-
"creating step backup of the metadata");
887+
size_t count = 1;
888+
for (const auto &step : path) {
889+
console->print_info(shcore::str_format(
890+
"Step %zu of %zu: upgrading from %s to %s...", count++, total,
891+
step->source_version.get_base().c_str(),
892+
step->target_version.get_base().c_str()));
885893

886-
step->function(group_server);
894+
// Inter step backup so upgrade can perform the required upgrade
895+
// operations
896+
backup(step->source_version, kMetadataSchemaName,
897+
kMetadataSchemaPreviousName, group_server,
898+
"creating step backup of the metadata");
887899

888-
// Removing temporary step backup
889-
group_server->execute(std::string("DROP SCHEMA ") +
890-
kMetadataSchemaPreviousName);
891-
}
900+
step->function(group_server);
892901

893-
stage = upgrade::save_stage(group_server, upgrade::Stage::DONE);
902+
// Removing temporary step backup
903+
group_server->execute(std::string("DROP SCHEMA ") +
904+
kMetadataSchemaPreviousName);
905+
}
894906

895-
upgrade::drop_metadata_backups(group_server, false);
907+
stage = upgrade::save_stage(group_server, upgrade::Stage::DONE);
896908

897-
actual_version = set_schema_version(group_server, last_ver);
909+
upgrade::drop_metadata_backups(group_server, false);
898910

899-
group_server->execute("SET FOREIGN_KEY_CHECKS=1");
911+
actual_version = set_schema_version(group_server, last_ver);
900912

901-
upgrade::release_locks(locked_instances);
913+
group_server->execute("SET FOREIGN_KEY_CHECKS=1");
902914

903-
installed_ver = installed_version(group_server);
904-
console->print_info(
905-
shcore::str_format("Upgrade process successfully finished, metadata "
906-
"schema is now on version %s",
907-
installed_ver.get_base().c_str()));
908-
} catch (const std::exception &e) {
909-
console->print_error(e.what());
910-
911-
// Only if the error happened after the upgrade started the data is
912-
// restored and the backup deleted
913-
upgrade::cleanup(
914-
group_server,
915-
upgrade::compute_failed_upgrade_stage(
916-
stage, actual_version,
917-
schema_exists(group_server, kMetadataSchemaBackupName)));
918-
919-
// Finally enables foreign key checks
920-
group_server->execute("SET FOREIGN_KEY_CHECKS=1");
915+
adjust_data(*group_server, actual_version);
921916

922-
upgrade::release_locks(locked_instances);
917+
upgrade::release_locks(locked_instances);
923918

924-
// Get the version after the restore to notify the final version
925-
installed_ver = installed_version(group_server);
919+
installed_ver = installed_version(group_server);
920+
console->print_info(
921+
shcore::str_format("Upgrade process successfully finished, metadata "
922+
"schema is now on version %s",
923+
installed_ver.get_base().c_str()));
924+
} catch (const std::exception &e) {
925+
console->print_error(e.what());
926926

927-
if (stage == upgrade::Stage::UPGRADING) {
928-
throw shcore::Exception::runtime_error(
929-
"Upgrade process failed, metadata has been restored to version " +
930-
installed_ver.get_base() + ".");
931-
} else {
932-
throw shcore::Exception::runtime_error(
933-
"Upgrade process failed, metadata was not modified.");
934-
}
927+
// Only if the error happened after the upgrade started the data is
928+
// restored and the backup deleted
929+
upgrade::cleanup(
930+
group_server,
931+
upgrade::compute_failed_upgrade_stage(
932+
stage, actual_version,
933+
schema_exists(group_server, kMetadataSchemaBackupName)));
934+
935+
// Finally enables foreign key checks
936+
group_server->execute("SET FOREIGN_KEY_CHECKS=1");
937+
938+
upgrade::release_locks(locked_instances);
939+
940+
// Get the version after the restore to notify the final version
941+
installed_ver = installed_version(group_server);
942+
943+
if (stage == upgrade::Stage::UPGRADING) {
944+
throw shcore::Exception::runtime_error(
945+
"Upgrade process failed, metadata has been restored to version " +
946+
installed_ver.get_base() + ".");
947+
} else {
948+
throw shcore::Exception::runtime_error(
949+
"Upgrade process failed, metadata was not modified.");
935950
}
936951
}
937952
}

modules/adminapi/common/metadata_storage.cc

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2556,6 +2556,13 @@ Router_options_metadata MetadataStorage::get_routing_options(
25562556
option_defaults = {k_default_clusterset_router_options.begin(),
25572557
k_default_clusterset_router_options.end()};
25582558

2559+
if (installed_version() < mysqlshdk::utils::Version(2, 2)) {
2560+
assert(option_defaults.find(k_router_option_stats_updates_frequency) !=
2561+
option_defaults.end());
2562+
option_defaults[k_router_option_stats_updates_frequency] =
2563+
shcore::Value(0);
2564+
}
2565+
25592566
query =
25602567
"SELECT concat(r.address, '::', r.router_name) AS router_label" +
25612568
router_opt_select_items("r.options", k_clusterset_router_options) +
@@ -2887,7 +2894,15 @@ void MetadataStorage::set_global_routing_option(Cluster_type type,
28872894
shcore::Value value_copy = value;
28882895
std::string option_name = option;
28892896

2890-
if (value.type == shcore::Null) value_copy = option_defaults->at(option);
2897+
if (value.type == shcore::Null) {
2898+
if ((type == Cluster_type::REPLICATED_CLUSTER) &&
2899+
(option == k_router_option_stats_updates_frequency) &&
2900+
(installed_version() < mysqlshdk::utils::Version(2, 2))) {
2901+
value_copy = shcore::Value(0);
2902+
} else {
2903+
value_copy = option_defaults->at(option);
2904+
}
2905+
}
28912906

28922907
if (type == Cluster_type::REPLICATED_CLUSTER) {
28932908
if (value_copy.type == shcore::Null) {

modules/adminapi/common/router.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,22 @@ shcore::Dictionary_t router_options(MetadataStorage *md, Cluster_type type,
211211
auto router_options = shcore::make_dict();
212212
auto romd = md->get_routing_options(type, id);
213213

214+
if (Cluster_set_id cs_id;
215+
(type == Cluster_type::GROUP_REPLICATION) &&
216+
md->check_cluster_set(nullptr, nullptr, nullptr, &cs_id)) {
217+
// if the Cluster belongs to a ClusterSet, we need to replace the options in
218+
// the Cluster with the options in the ClusterSet
219+
auto cs_romd =
220+
md->get_routing_options(Cluster_type::REPLICATED_CLUSTER, cs_id);
221+
222+
for (const auto &[option, value] : cs_romd.global) {
223+
if (option == "tags") continue;
224+
225+
auto it = romd.global.find(option);
226+
if (it != romd.global.end()) it->second = value;
227+
}
228+
}
229+
214230
const auto get_options_dict =
215231
[](const std::map<std::string, shcore::Value> &entry) {
216232
auto ret = shcore::make_dict();

modules/adminapi/common/router.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
#include <array>
2828
#include <string>
29+
#include <string_view>
2930
#include <utility>
3031

3132
#include "modules/adminapi/common/base_cluster_impl.h"
@@ -71,10 +72,9 @@ inline constexpr std::array<decltype(k_router_option_target_cluster), 6>
7172
extern const std::map<std::string, shcore::Value>
7273
k_default_clusterset_router_options;
7374

74-
inline constexpr std::array<decltype(k_router_option_target_cluster), 3>
75-
k_cluster_router_options = {k_router_option_tags,
76-
k_router_option_read_only_targets,
77-
k_router_option_stats_updates_frequency};
75+
inline constexpr std::array<std::string_view, 3> k_cluster_router_options = {
76+
k_router_option_tags, k_router_option_read_only_targets,
77+
k_router_option_stats_updates_frequency};
7878

7979
extern const std::map<std::string, shcore::Value>
8080
k_default_cluster_router_options;

0 commit comments

Comments
 (0)