Skip to content

Commit 9b89d3d

Browse files
Tomasz Stepniakdahlerlend
authored andcommitted
Bug#37372020 Routing Guideline destination based on custom server label not working
Issue: Label used for guideline matching is not fetched from metadata but instead it is created like the md default label. Custom labels do not work. Fix: Fetch server label from metadata as part of instance information. Change-Id: Idf4c109e587ac31a14d73487e49af1ba01e66612
1 parent 8e069f2 commit 9b89d3d

File tree

12 files changed

+81
-57
lines changed

12 files changed

+81
-57
lines changed

router/src/metadata_cache/include/mysqlrouter/metadata_cache_datatypes.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class METADATA_CACHE_EXPORT ManagedInstance {
107107
const std::string &p_mysql_server_uuid,
108108
const ServerMode p_mode, const ServerRole p_role,
109109
const std::string &p_host, const uint16_t p_port,
110-
const uint16_t p_xport);
110+
const uint16_t p_xport, std::string label);
111111

112112
ManagedInstance(const ManagedInstance &) = default;
113113
ManagedInstance &operator=(const ManagedInstance &) = default;
@@ -149,7 +149,9 @@ class METADATA_CACHE_EXPORT ManagedInstance {
149149
/** Server tags as defined in the metadata, parsed as a key-value pairs */
150150
std::map<std::string, std::string, std::less<>> tags{};
151151

152-
uint32_t version;
152+
uint32_t version{0};
153+
154+
std::string label;
153155

154156
std::string to_string() const {
155157
std::string result = "uuid: " + mysql_server_uuid + "\n";

router/src/metadata_cache/src/cluster_metadata.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ void ClusterMetadata::report_guideline_name(
370370
sqlstring query(
371371
"UPDATE mysql_innodb_cluster_metadata.v2_routers SET "
372372
"attributes = JSON_SET(attributes, '$.CurrentRoutingGuideline', ?) "
373-
"where router_id = ? ");
373+
"WHERE router_id = ? ");
374374

375375
if (guideline_name.empty()) {
376376
query << sqlstring::null;

router/src/metadata_cache/src/cluster_metadata_ar.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ metadata_cache::ClusterTopology ARClusterMetadata::fetch_topology_from_member(
181181
// comparing to other members view of the world
182182
std::string query =
183183
"select C.cluster_id, C.cluster_name, M.member_id, I.endpoint, "
184-
"I.xendpoint, M.member_role, I.attributes from "
184+
"I.xendpoint, M.member_role, I.attributes, I.label from "
185185
"mysql_innodb_cluster_metadata.v2_ar_members M join "
186186
"mysql_innodb_cluster_metadata.v2_instances I on I.instance_id = "
187187
"M.instance_id join mysql_innodb_cluster_metadata.v2_ar_clusters C on "
@@ -192,10 +192,10 @@ metadata_cache::ClusterTopology ARClusterMetadata::fetch_topology_from_member(
192192
}
193193

194194
auto result_processor = [&cluster](const MySQLSession::Row &row) -> bool {
195-
if (row.size() != 7) {
195+
if (row.size() != 8) {
196196
throw metadata_cache::metadata_error(
197197
"Unexpected number of fields in the resultset. "
198-
"Expected = 7, got = " +
198+
"Expected = 8, got = " +
199199
std::to_string(row.size()));
200200
}
201201

@@ -218,6 +218,7 @@ metadata_cache::ClusterTopology ARClusterMetadata::fetch_topology_from_member(
218218
}
219219

220220
set_instance_attributes(instance, as_string(row[6]));
221+
instance.label = as_string(row[7]);
221222

222223
std::string warning;
223224
if (instance.type == mysqlrouter::InstanceType::AsyncMember) {

router/src/metadata_cache/src/cluster_metadata_gr.cc

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,7 @@ GRMetadataBackendV2::fetch_instances_from_metadata_server(
10441044
// obtained from one of the nodes belonging to a quorum.
10451045
std::string query(
10461046
"select C.cluster_id, C.cluster_name, I.mysql_server_uuid, I.endpoint, "
1047-
"I.xendpoint, I.attributes "
1047+
"I.xendpoint, I.attributes, I.label "
10481048
"from "
10491049
"mysql_innodb_cluster_metadata.v2_instances I join "
10501050
"mysql_innodb_cluster_metadata.v2_gr_clusters C on I.cluster_id = "
@@ -1053,10 +1053,10 @@ GRMetadataBackendV2::fetch_instances_from_metadata_server(
10531053

10541054
metadata_cache::ManagedCluster cluster;
10551055
auto result_processor = [&cluster](const MySQLSession::Row &row) -> bool {
1056-
if (row.size() != 6) {
1056+
if (row.size() != 7) {
10571057
throw metadata_cache::metadata_error(
10581058
"Unexpected number of fields in the resultset. "
1059-
"Expected = 6, got = " +
1059+
"Expected = 7, got = " +
10601060
std::to_string(row.size()));
10611061
}
10621062

@@ -1067,6 +1067,7 @@ GRMetadataBackendV2::fetch_instances_from_metadata_server(
10671067
return true; // next row
10681068
}
10691069
set_instance_attributes(instance, as_string(row[5]));
1070+
instance.label = as_string(row[6]);
10701071

10711072
cluster.id = as_string(row[0]);
10721073
cluster.name = as_string(row[1]);
@@ -1224,6 +1225,7 @@ GRClusterSetMetadataBackend::update_clusterset_topology_from_metadata_server(
12241225

12251226
std::string query =
12261227
"select I.mysql_server_uuid, I.endpoint, I.xendpoint, I.attributes, "
1228+
"I.label, "
12271229
"C.cluster_id, C.cluster_name, CSM.member_role, CSM.invalidated, "
12281230
"CS.domain_name "
12291231
"from mysql_innodb_cluster_metadata.v2_instances I join "
@@ -1246,10 +1248,11 @@ GRClusterSetMetadataBackend::update_clusterset_topology_from_metadata_server(
12461248
const std::string node_addr_classic = as_string(row[1]);
12471249
const std::string node_addr_x = as_string(row[2]);
12481250
const std::string node_attributes = as_string(row[3]);
1249-
const std::string cluster_id = as_string(row[4]);
1250-
const std::string cluster_name = as_string(row[5]);
1251-
const bool cluster_is_primary = as_string(row[6]) == "PRIMARY";
1252-
const bool cluster_is_invalidated = strtoui_checked(row[7]) == 1;
1251+
const std::string label = as_string(row[4]);
1252+
const std::string cluster_id = as_string(row[5]);
1253+
const std::string cluster_name = as_string(row[6]);
1254+
const bool cluster_is_primary = as_string(row[7]) == "PRIMARY";
1255+
const bool cluster_is_invalidated = strtoui_checked(row[8]) == 1;
12531256

12541257
if (result.clusters_data.empty() ||
12551258
result.clusters_data.back().name != cluster_name) {
@@ -1271,15 +1274,16 @@ GRClusterSetMetadataBackend::update_clusterset_topology_from_metadata_server(
12711274
metadata_cache::ServerRole::Secondary,
12721275
uri_classic.host,
12731276
uri_classic.port,
1274-
uri_x.port};
1277+
uri_x.port,
1278+
label};
12751279

12761280
set_instance_attributes(instance, node_attributes);
12771281

12781282
if (instance.type == mysqlrouter::InstanceType::GroupMember ||
12791283
instance.type == mysqlrouter::InstanceType::ReadReplica) {
12801284
result.clusters_data.back().members.push_back(instance);
12811285
if (result.name.empty()) {
1282-
result.name = as_string(row[8]);
1286+
result.name = as_string(row[9]);
12831287
}
12841288
} else {
12851289
log_warning("Ignoring unsupported instance %s:%d, type: %s",

router/src/metadata_cache/src/metadata_cache.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -250,13 +250,13 @@ bool metadata_cache::ManagedInstance::operator==(
250250
disconnect_existing_sessions_when_hidden ==
251251
other.disconnect_existing_sessions_when_hidden &&
252252
ignore == other.ignore && tags == other.tags &&
253-
version == other.version;
253+
version == other.version && label == other.label;
254254
}
255255

256256
metadata_cache::ManagedInstance::ManagedInstance(
257257
mysqlrouter::InstanceType p_type, const std::string &p_mysql_server_uuid,
258258
const ServerMode p_mode, const ServerRole p_role, const std::string &p_host,
259-
const uint16_t p_port, const uint16_t p_xport)
259+
const uint16_t p_port, const uint16_t p_xport, std::string label)
260260
: type(p_type),
261261
mysql_server_uuid(p_mysql_server_uuid),
262262
mode(p_mode),
@@ -266,7 +266,8 @@ metadata_cache::ManagedInstance::ManagedInstance(
266266
xport(p_xport),
267267
hidden(mysqlrouter::kNodeTagHiddenDefault),
268268
disconnect_existing_sessions_when_hidden(
269-
mysqlrouter::kNodeTagDisconnectWhenHiddenDefault) {}
269+
mysqlrouter::kNodeTagDisconnectWhenHiddenDefault),
270+
label(std::move(label)) {}
270271

271272
metadata_cache::ManagedInstance::ManagedInstance(
272273
mysqlrouter::InstanceType p_type)

router/src/metadata_cache/tests/helper/mock_metadata.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,24 @@ MockNG::MockNG(
4444
ms1.port = 3306;
4545
ms1.xport = 33060;
4646
ms1.mode = metadata_cache::ServerMode::ReadWrite;
47+
ms1.label = ms1.host + ":" + std::to_string(ms1.port);
48+
ms1.tags = {};
4749

4850
ms2.mysql_server_uuid = "instance-2";
4951
ms2.host = "host-2";
5052
ms2.port = 3306;
5153
ms2.xport = 33060;
5254
ms2.mode = metadata_cache::ServerMode::ReadOnly;
55+
ms2.label = ms2.host + ":" + std::to_string(ms2.port);
56+
ms2.tags = {};
5357

5458
ms3.mysql_server_uuid = "instance-3";
5559
ms3.host = "host-3";
5660
ms3.port = 3306;
5761
ms3.xport = 33060;
5862
ms3.mode = metadata_cache::ServerMode::ReadOnly;
63+
ms3.label = ms3.host + ":" + std::to_string(ms3.port);
64+
ms3.tags = {};
5965

6066
cluster_instances_vector.push_back(ms1);
6167
cluster_instances_vector.push_back(ms2);

router/src/router/src/cluster_metadata.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,7 +1027,7 @@ static std::vector<std::string> do_get_routing_mode_queries(
10271027
MySQLSession *mysql) {
10281028
const std::string fetch_instances_query =
10291029
"select C.cluster_id, C.cluster_name, I.mysql_server_uuid, "
1030-
"I.endpoint, I.xendpoint, I.attributes "
1030+
"I.endpoint, I.xendpoint, I.attributes, I.label "
10311031
"from mysql_innodb_cluster_metadata.v2_instances I join "
10321032
"mysql_innodb_cluster_metadata.v2_gr_clusters C on I.cluster_id = "
10331033
"C.cluster_id where C.cluster_name = " +
@@ -1122,7 +1122,7 @@ std::string ClusterMetadataAR::get_cluster_type_specific_id() {
11221122
std::vector<std::string> ClusterMetadataAR::get_routing_mode_queries() {
11231123
return {// source: ClusterMetadata::fetch_instances_from_metadata_server()
11241124
"select C.cluster_id, C.cluster_name, I.mysql_server_uuid, "
1125-
"I.endpoint, I.xendpoint, I.attributes from "
1125+
"I.endpoint, I.xendpoint, I.attributes, I.label from "
11261126
"mysql_innodb_cluster_metadata.v2_instances I join "
11271127
"mysql_innodb_cluster_metadata.v2_gr_clusters C on I.cluster_id = "
11281128
"C.cluster_id where C.cluster_name = " +

router/src/routing/src/dest_metadata_cache.cc

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -291,10 +291,7 @@ DestMetadataCacheManager::get_nodes_from_topology(
291291
instance_info.cluster_set_name = clusterset_name;
292292
instance_info.cluster_role = cluster_role;
293293
instance_info.cluster_name = cluster_name;
294-
const auto label_port =
295-
cluster_member.port == 0 ? cluster_member.xport : cluster_member.port;
296-
instance_info.label =
297-
cluster_member.host + ":" + std::to_string(label_port);
294+
instance_info.label = cluster_member.label;
298295
instance_info.cluster_is_invalidated = cluster.is_invalidated;
299296
instance_info.version = cluster_member.version;
300297

router/src/routing/tests/test_metadata_cache_group.cc

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -203,9 +203,9 @@ TEST_F(DestMetadataCacheTest, AllowedNodesNoPrimary) {
203203

204204
fill_instance_vector({
205205
{GR, "uuid1", ServerMode::ReadWrite, ServerRole::Primary, "3306", 3306,
206-
33060},
206+
33060, "label"},
207207
{GR, "uuid2", ServerMode::ReadOnly, ServerRole::Secondary, "3307", 3307,
208-
33070},
208+
33070, "label"},
209209
});
210210

211211
EXPECT_CALL(metadata_cache_api_, add_acceptor_handler_listener(_));
@@ -215,9 +215,9 @@ TEST_F(DestMetadataCacheTest, AllowedNodesNoPrimary) {
215215
// new metadata - no primary
216216
fill_instance_vector({
217217
{GR, "uuid1", ServerMode::ReadOnly, ServerRole::Secondary, "3306", 3306,
218-
33060},
218+
33060, "label"},
219219
{GR, "uuid2", ServerMode::ReadOnly, ServerRole::Secondary, "3307", 3307,
220-
33070},
220+
33070, "label"},
221221
});
222222

223223
bool callback_called{false};
@@ -255,9 +255,9 @@ TEST_F(DestMetadataCacheTest, AllowedNodes2Primaries) {
255255

256256
InstanceVector instances{
257257
{GR, "uuid1", ServerMode::ReadWrite, ServerRole::Primary, "3306", 3306,
258-
33060},
258+
33060, "label"},
259259
{GR, "uuid2", ServerMode::ReadOnly, ServerRole::Secondary, "3307", 3307,
260-
33070},
260+
33070, "label"},
261261
};
262262

263263
fill_instance_vector(instances);
@@ -315,9 +315,9 @@ TEST_F(DestMetadataCacheTest, AllowedNodesNoSecondaries) {
315315

316316
InstanceVector instances{
317317
{GR, "uuid1", ServerMode::ReadWrite, ServerRole::Primary, "3306", 3306,
318-
33060},
318+
33060, "label"},
319319
{GR, "uuid2", ServerMode::ReadOnly, ServerRole::Secondary, "3307", 3307,
320-
33070},
320+
33070, "label"},
321321
};
322322

323323
fill_instance_vector(instances);
@@ -372,9 +372,9 @@ TEST_F(DestMetadataCacheTest, AllowedNodesSecondaryDisconnectToPromoted) {
372372

373373
InstanceVector instances{
374374
{GR, "uuid1", ServerMode::ReadWrite, ServerRole::Primary, "3306", 3306,
375-
33060},
375+
33060, "label"},
376376
{GR, "uuid2", ServerMode::ReadOnly, ServerRole::Secondary, "3307", 3307,
377-
33070},
377+
33070, "label"},
378378
};
379379

380380
fill_instance_vector(instances);
@@ -434,9 +434,9 @@ TEST_F(DestMetadataCacheTest, AllowedNodesSecondaryDisconnectToPromotedTwice) {
434434

435435
InstanceVector instances{
436436
{GR, "uuid1", ServerMode::ReadWrite, ServerRole::Primary, "3306", 3306,
437-
33060},
437+
33060, "label"},
438438
{GR, "uuid2", ServerMode::ReadOnly, ServerRole::Secondary, "3307", 3307,
439-
33070},
439+
33070, "label"},
440440
};
441441

442442
fill_instance_vector(instances);
@@ -488,9 +488,9 @@ TEST_F(DestMetadataCacheTest,
488488

489489
fill_instance_vector({
490490
{GR, "uuid1", ServerMode::ReadWrite, ServerRole::Primary, "3306", 3306,
491-
33060},
491+
33060, "label"},
492492
{GR, "uuid2", ServerMode::ReadOnly, ServerRole::Secondary, "3307", 3307,
493-
33070},
493+
33070, "label"},
494494
});
495495

496496
EXPECT_CALL(metadata_cache_api_, add_acceptor_handler_listener(_));
@@ -542,9 +542,9 @@ TEST_F(DestMetadataCacheTest,
542542

543543
fill_instance_vector({
544544
{GR, "uuid1", ServerMode::ReadWrite, ServerRole::Primary, "3306", 3306,
545-
33060},
545+
33060, "label"},
546546
{GR, "uuid2", ServerMode::ReadOnly, ServerRole::Secondary, "3307", 3307,
547-
33070},
547+
33070, "label"},
548548
});
549549

550550
EXPECT_CALL(metadata_cache_api_, add_acceptor_handler_listener(_));

0 commit comments

Comments
 (0)