diff --git a/server/core/server.c b/server/core/server.c index e39c605a8..4de4e4d64 100644 --- a/server/core/server.c +++ b/server/core/server.c @@ -81,7 +81,6 @@ server_alloc(char *servname, char *protocol, unsigned short port) server->rlag = -2; server->master_id = -1; server->depth = -1; - server->slaves = NULL; server->parameters = NULL; server->server_string = NULL; spinlock_init(&server->lock); diff --git a/server/include/monitor.h b/server/include/monitor.h index 00f6457c2..97f717958 100644 --- a/server/include/monitor.h +++ b/server/include/monitor.h @@ -129,7 +129,6 @@ typedef enum #define MONITOR_INTERVAL 10000 // in milliseconds #define MONITOR_DEFAULT_ID 1UL // unsigned long value -#define MONITOR_MAX_NUM_SLAVES 20 //number of MySQL slave servers associated to a MySQL master server /* * Create declarations of the enum for monitor events and also the array of diff --git a/server/include/server.h b/server/include/server.h index d8b3e1af5..81a6a2313 100644 --- a/server/include/server.h +++ b/server/include/server.h @@ -45,6 +45,7 @@ */ #define MAX_SERVER_NAME_LEN 1024 +#define MAX_NUM_SLAVES 128 /**< Maximum number of slaves under a single server*/ /** * The server parameters used for weighting routing decissions @@ -99,7 +100,7 @@ typedef struct server SERVER_PARAM *parameters; /**< Parameters of a server that may be used to weight routing decisions */ long master_id; /**< Master server id of this node */ int depth; /**< Replication level in the tree */ - long *slaves; /**< Slaves of this node */ + long slaves[MAX_NUM_SLAVES]; /**< Slaves of this node */ bool master_err_is_logged; /*< If node failed, this indicates whether it is logged */ DCB *persistent; /**< List of unused persistent connections to the server */ SPINLOCK persistlock; /**< Lock for adjusting the persistent connections list */ diff --git a/server/modules/monitor/mysql_mon.c b/server/modules/monitor/mysql_mon.c index d2f8b099c..6948175c1 100644 --- a/server/modules/monitor/mysql_mon.c +++ b/server/modules/monitor/mysql_mon.c @@ -550,7 +550,7 @@ static MONITOR_SERVERS *build_mysql51_replication_tree(MONITOR *mon) if (mysql_num_rows(result) > 0) { ismaster = true; - while (nslaves < MONITOR_MAX_NUM_SLAVES && (row = mysql_fetch_row(result))) + while (nslaves < MAX_NUM_SLAVES && (row = mysql_fetch_row(result))) { /* get Slave_IO_Running and Slave_SQL_Running values*/ database->server->slaves[nslaves] = atol(row[0]); @@ -838,12 +838,7 @@ monitorMain(void *arg) monitorDatabase(mon, ptr); /* reset the slave list of current node */ - if (ptr->server->slaves) - { - free(ptr->server->slaves); - } - /* create a new slave list */ - ptr->server->slaves = (long *) calloc(MONITOR_MAX_NUM_SLAVES, sizeof(long)); + memset(&ptr->server->slaves, 0, sizeof(ptr->server->slaves)); num_servers++; @@ -1450,7 +1445,8 @@ static MONITOR_SERVERS *get_replication_tree(MONITOR *mon, int num_servers) master = getServerByNodeId(mon->databases, current->master_id); if (master && master->server && master->server->node_id > 0) { - add_slave_to_master(master->server->slaves, MONITOR_MAX_NUM_SLAVES, current->node_id); + add_slave_to_master(master->server->slaves, sizeof(master->server->slaves), + current->node_id); master->server->depth = current->depth - 1; monitor_set_pending_status(master, SERVER_MASTER); handle->master = master; @@ -1511,7 +1507,7 @@ static int add_slave_to_master(long *slaves_list, int list_size, long node_id) { if (slaves_list[i] == 0) { - memcpy(&slaves_list[i], &node_id, sizeof(long)); + slaves_list[i] = node_id; return 1; } }