From 7da092843f6a59d7618a7db2783f622b02012d6f Mon Sep 17 00:00:00 2001 From: MassimilianoPinto Date: Wed, 9 Aug 2017 17:09:50 +0200 Subject: [PATCH] MXS-1343: send hostname to master with COM_REGISTER_SLAVE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A new option ‘slave_hostname’ allows the setting of hostname in COM_REGISTER_SLAVE. SHOW SLAVES HOSTS; in master server can show the hostname set in binlog router: MariaDB [(none)]> SHOW SLAVE HOSTS; +-----------+-----------------------------+------+-----------+ | Server_id | Host | Port | Master_id | +-----------+-----------------------------+------+-----------+ | 93 | maxscale-blr-1.mydomain.net | 8808 | 10124 | +-----------+-----------------------------+------+-----------+ --- server/modules/routing/binlogrouter/blr.c | 10 +++- server/modules/routing/binlogrouter/blr.h | 1 + .../modules/routing/binlogrouter/blr_master.c | 53 +++++++++++++++---- 3 files changed, 52 insertions(+), 12 deletions(-) diff --git a/server/modules/routing/binlogrouter/blr.c b/server/modules/routing/binlogrouter/blr.c index 7501972db..e9f1daf17 100644 --- a/server/modules/routing/binlogrouter/blr.c +++ b/server/modules/routing/binlogrouter/blr.c @@ -184,6 +184,7 @@ MXS_MODULE* MXS_CREATE_MODULE() {"master_uuid", MXS_MODULE_PARAM_STRING}, {"master_version", MXS_MODULE_PARAM_STRING}, {"master_hostname", MXS_MODULE_PARAM_STRING}, + {"slave_hostname", MXS_MODULE_PARAM_STRING}, {"mariadb10-compatibility", MXS_MODULE_PARAM_BOOL, "false"}, {"filestem", MXS_MODULE_PARAM_STRING, BINLOG_NAME_ROOT}, {"file", MXS_MODULE_PARAM_COUNT, "1"}, @@ -334,6 +335,7 @@ createInstance(SERVICE *service, char **options) inst->trx_safe = config_get_bool(params, "transaction_safety"); inst->set_master_version = config_copy_string(params, "master_version"); inst->set_master_hostname = config_copy_string(params, "master_hostname"); + inst->set_slave_hostname = config_copy_string(params, "slave_hostname"); inst->fileroot = config_copy_string(params, "filestem"); inst->serverid = config_get_integer(params, "server_id"); @@ -344,8 +346,6 @@ createInstance(SERVICE *service, char **options) inst->master_uuid = config_copy_string(params, "master_uuid"); inst->set_master_uuid = inst->master_uuid != NULL; - inst->set_master_version = NULL; - inst->set_master_hostname = NULL; inst->send_slave_heartbeat = config_get_bool(params, "send_slave_heartbeat"); /* Semi-Sync support */ @@ -482,6 +482,11 @@ createInstance(SERVICE *service, char **options) MXS_FREE(inst->set_master_hostname); inst->set_master_hostname = MXS_STRDUP_A(value); } + else if (strcmp(options[i], "slave_hostname") == 0) + { + MXS_FREE(inst->set_slave_hostname); + inst->set_slave_hostname = MXS_STRDUP_A(value); + } else if (strcmp(options[i], "mariadb10-compatibility") == 0) { inst->mariadb10_compat = config_truth_value(value); @@ -938,6 +943,7 @@ free_instance(ROUTER_INSTANCE *instance) MXS_FREE(instance->password); MXS_FREE(instance->set_master_version); MXS_FREE(instance->set_master_hostname); + MXS_FREE(instance->set_slave_hostname); MXS_FREE(instance->fileroot); MXS_FREE(instance->binlogdir); /* SSL options */ diff --git a/server/modules/routing/binlogrouter/blr.h b/server/modules/routing/binlogrouter/blr.h index 68962536d..67c986430 100644 --- a/server/modules/routing/binlogrouter/blr.h +++ b/server/modules/routing/binlogrouter/blr.h @@ -592,6 +592,7 @@ typedef struct router_instance int master_semi_sync; /*< Semi-Sync replication status of master server */ BINLOG_ENCRYPTION_SETUP encryption; /*< Binlog encryption setup */ void *encryption_ctx; /*< Encryption context */ + char *set_slave_hostname; /*< Send custom Hostname to Master */ struct router_instance *next; } ROUTER_INSTANCE; diff --git a/server/modules/routing/binlogrouter/blr_master.c b/server/modules/routing/binlogrouter/blr_master.c index 5d7fc04b0..c2e8234f8 100644 --- a/server/modules/routing/binlogrouter/blr_master.c +++ b/server/modules/routing/binlogrouter/blr_master.c @@ -885,28 +885,55 @@ blr_make_registration(ROUTER_INSTANCE *router) { GWBUF *buf; unsigned char *data; - int len = 18; + int len = 18; // Min size of COM_REGISTER_SLAVE payload int port = 3306; + int hostname_len = 0; - if ((buf = gwbuf_alloc(len + 4)) == NULL) + // Send router->set_slave_hostname + if (router->set_slave_hostname && router->set_slave_hostname[0]) + { + hostname_len = strlen(router->set_slave_hostname); + } + + // Add hostname len + len += hostname_len; + + if ((buf = gwbuf_alloc(len + MYSQL_HEADER_LEN)) == NULL) { return NULL; } + data = GWBUF_DATA(buf); encode_value(&data[0], len, 24); // Payload length data[3] = 0; // Sequence ID data[4] = COM_REGISTER_SLAVE; // Command encode_value(&data[5], router->serverid, 32); // Slave Server ID - data[9] = 0; // Slave hostname length - data[10] = 0; // Slave username length - data[11] = 0; // Slave password length + + // Point to hostname len offset + data += 9; + + *data++ = hostname_len; // Slave hostname length + + // Copy hostname + if (hostname_len) + { + memcpy(data, router->set_slave_hostname, hostname_len); + } + + // Point to user + data += hostname_len; + // Set empty user + *data++ = 0; // Slave username length + // Set empty password + *data++ = 0; // Slave password length + // Add port if (router->service->ports) { port = router->service->ports->port; } - encode_value(&data[12], port, 16); // Slave master port - encode_value(&data[14], 0, 32); // Replication rank - encode_value(&data[18], router->masterid, 32); // Master server-id + encode_value(&data[0], port, 16); // Slave master port, 2 bytes + encode_value(&data[2], 0, 32); // Replication rank, 4 bytes + encode_value(&data[6], router->masterid, 32); // Master server-id, 4 bytes // This is hack to get the result set processing in order for binlogrouter MySQLProtocol *proto = (MySQLProtocol*)router->master->protocol; @@ -2202,9 +2229,15 @@ static void blr_log_identity(ROUTER_INSTANCE *router) /* Seen by the master */ MXS_NOTICE("%s: identity seen by the master: " - "server_id: %d, uuid: %s", + "Server_id: %d, Slave_UUID: %s, Host: %s", router->service->name, - router->serverid, (router->uuid == NULL ? "not available" : router->uuid)); + router->serverid, + router->uuid == NULL ? + "not available" : + router->uuid, + (router->set_slave_hostname && router->set_slave_hostname[0]) ? + router->set_slave_hostname : + "not set"); /* Seen by the slaves */