Add helper functions for server creation/destruction in hostgroup

v2.x-aurora_autodiscovery_shunned_promotion
Javier Jaramago Fernández 3 years ago
parent bf5d8cbc73
commit 9e3ab519e8

@ -432,6 +432,27 @@ enum REPLICATION_LAG_SERVER_T {
RLS__SIZE
};
/**
* @brief Contains the minimal info for server creation.
*/
struct srv_info_t {
/* @brief Server address */
string addr;
/* @brief Server port */
uint16_t port;
/* @brief Server type identifier, used for logging, e.g: 'Aurora AWS', 'GR', etc... */
string kind;
};
/**
* @brief Contains options to be specified during server creation.
*/
struct srv_opts_t {
int64_t weigth;
int64_t max_conns;
int32_t use_ssl;
};
class MySQL_HostGroups_Manager {
private:
SQLite3DB *admindb;
@ -801,6 +822,34 @@ class MySQL_HostGroups_Manager {
MyHGC * MyHGC_lookup(unsigned int);
void MyConn_add_to_pool(MySQL_Connection *);
/**
* @brief Creates a new server in the target hostgroup if isn't already present.
* @details If the server is found already in the target hostgroup, no action is taken, unless its status
* is 'OFFLINE_HARD'. In case of finding it as 'OFFLINE_HARD':
* 1. Server hostgroup attributes are reset to known values, so they can be updated.
* 2. Server attributes are updated to either table definition values, or hostgroup 'servers_defaults'.
* 3. Server is bring back as 'ONLINE'.
* @param hid The hostgroup in which the server is to be created (or to bring it back as 'ONLINE').
* @param srv_info Basic server info to be used during creation.
* @param srv_opts Server creation options.
* @return 0 in case of success, -1 in case of failure.
*/
int create_new_server_in_hg(uint32_t hid, const srv_info_t& srv_info, const srv_opts_t& srv_opts);
/**
* @brief Completely removes server from the target hostgroup if found.
* @details Several actions are taken if server is found:
* - Set the server as 'OFFLINE_HARD'.
* - Drop all current FREE connections to the server.
* - Delete the server from the 'myhgm.mysql_servers' table.
*
* This later step is not required if the caller is already going to perform a full deletion of the
* servers in the target hostgroup. Which is a common operation during table regeneration.
* @param hid Target hostgroup id.
* @param addr Target server address.
* @param port Target server port.
* @return 0 in case of success, -1 in case of failure.
*/
int remove_server_in_hg(uint32_t hid, const string& addr, uint16_t port);
MySQL_Connection * get_MyConn_from_pool(unsigned int hid, MySQL_Session *sess, bool ff, char * gtid_uuid, uint64_t gtid_trxid, int max_lag_ms);

@ -7558,6 +7558,86 @@ bool MySQL_HostGroups_Manager::aws_aurora_replication_lag_action(int _whid, int
return ret;
}
int MySQL_HostGroups_Manager::create_new_server_in_hg(
uint32_t hid, const srv_info_t& srv_info, const srv_opts_t& srv_opts
) {
int32_t res = -1;
MySrvC* mysrvc = find_server_in_hg(hid, srv_info.addr, srv_info.port);
if (mysrvc == nullptr) {
char* c_hostname { const_cast<char*>(srv_info.addr.c_str()) };
MySrvC* mysrvc = new MySrvC(
c_hostname, srv_info.port, 0, srv_opts.weigth, MYSQL_SERVER_STATUS_ONLINE, 0, srv_opts.max_conns, 0,
srv_opts.use_ssl, 0, const_cast<char*>("")
);
add(mysrvc,hid);
proxy_info(
"Adding new discovered %s node %s:%d with: hostgroup=%d, weight=%ld, max_connections=%ld, use_ssl=%d\n",
srv_info.kind.c_str(), c_hostname, srv_info.port, hid, mysrvc->weight, mysrvc->max_connections,
mysrvc->use_ssl
);
res = 0;
} else {
// If the server is found as 'OFFLINE_HARD' we reset the 'MySrvC' values corresponding with the
// 'servers_defaults' (as in a new 'MySrvC' creation). We then later update these values with the
// 'servers_defaults' attributes from its corresponding 'MyHGC'. This way we ensure uniform behavior
// of new servers, and 'OFFLINE_HARD' ones when a user update 'servers_defaults' values, and reloads
// the servers to runtime.
if (mysrvc && mysrvc->status == MYSQL_SERVER_STATUS_OFFLINE_HARD) {
reset_hg_attrs_server_defaults(mysrvc);
update_hg_attrs_server_defaults(mysrvc, mysrvc->myhgc);
mysrvc->status = MYSQL_SERVER_STATUS_ONLINE;
proxy_info(
"Found healthy previously discovered %s node %s:%d as 'OFFLINE_HARD', setting back as 'ONLINE' with:"
" hostgroup=%d, weight=%ld, max_connections=%ld, use_ssl=%d\n",
srv_info.kind.c_str(), srv_info.addr.c_str(), srv_info.port, hid, mysrvc->weight,
mysrvc->max_connections, mysrvc->use_ssl
);
res = 0;
}
}
return res;
}
int MySQL_HostGroups_Manager::remove_server_in_hg(uint32_t hid, const string& addr, uint16_t port) {
MySrvC* mysrvc = find_server_in_hg(hid, addr, port);
if (mysrvc == nullptr) {
return -1;
}
uint64_t mysrvc_addr = reinterpret_cast<uint64_t>(mysrvc);
proxy_warning(
"Removed server at address %ld, hostgroup %d, address %s port %d."
" Setting status OFFLINE HARD and immediately dropping all free connections."
" Used connections will be dropped when trying to use them\n",
mysrvc_addr, hid, mysrvc->address, mysrvc->port
);
// Set the server status
mysrvc->status=MYSQL_SERVER_STATUS_OFFLINE_HARD;
mysrvc->ConnectionsFree->drop_all_connections();
// TODO-NOTE: This is only required in case the caller isn't going to perform:
// - Full deletion of servers in the target 'hid'.
// - Table regeneration for the servers in the target 'hid'.
// This is a very common pattern when further operations have been performed over the
// servers, e.g. a set of servers additions and deletions over the target hostgroups.
// ////////////////////////////////////////////////////////////////////////
// Remove the server from the table
const string del_srv_query { "DELETE FROM mysql_servers WHERE mem_pointer=" + std::to_string(mysrvc_addr) };
mydb->execute(del_srv_query.c_str());
// ////////////////////////////////////////////////////////////////////////
return 0;
}
// FIXME: complete this!!
void MySQL_HostGroups_Manager::update_aws_aurora_set_writer(int _whid, int _rhid, char *_server_id, bool verbose) {
int cols=0;

Loading…
Cancel
Save