From 6846b0b6b63969a29e1862ed12c046f26ccf900d Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Mon, 16 Nov 2015 14:03:42 +0200 Subject: [PATCH] Mmmon formatting changes Fixed indentation, bracket alignment and other minor things. --- server/modules/monitor/mmmon.c | 983 +++++++++++++++++---------------- 1 file changed, 515 insertions(+), 468 deletions(-) diff --git a/server/modules/monitor/mmmon.c b/server/modules/monitor/mmmon.c index 7029c4691..4d18fa5ce 100644 --- a/server/modules/monitor/mmmon.c +++ b/server/modules/monitor/mmmon.c @@ -33,28 +33,30 @@ #include #include -static void monitorMain(void *); +static void monitorMain(void *); static char *version_str = "V1.1.1"; -MODULE_INFO info = { - MODULE_API_MONITOR, - MODULE_BETA_RELEASE, - MONITOR_VERSION, - "A Multi-Master Multi Master monitor" +MODULE_INFO info = +{ + MODULE_API_MONITOR, + MODULE_BETA_RELEASE, + MONITOR_VERSION, + "A Multi-Master Multi Master monitor" }; -static void *startMonitor(void *,void*); -static void stopMonitor(void *); -static void diagnostics(DCB *, void *); -static void detectStaleMaster(void *, int); +static void *startMonitor(void *, void*); +static void stopMonitor(void *); +static void diagnostics(DCB *, void *); +static void detectStaleMaster(void *, int); static MONITOR_SERVERS *get_current_master(MONITOR *); bool isMySQLEvent(monitor_event_t event); -static MONITOR_OBJECT MyObject = { - startMonitor, - stopMonitor, - diagnostics +static MONITOR_OBJECT MyObject = +{ + startMonitor, + stopMonitor, + diagnostics }; /** @@ -65,7 +67,7 @@ static MONITOR_OBJECT MyObject = { char * version() { - return version_str; + return version_str; } /** @@ -75,10 +77,10 @@ version() void ModuleInit() { - LOGIF(LM, (skygw_log_write( - LOGFILE_MESSAGE, - "Initialise the Multi-Master Monitor module %s.", - version_str))); + LOGIF(LM, (skygw_log_write( + LOGFILE_MESSAGE, + "Initialise the Multi-Master Monitor module %s.", + version_str))); } /** @@ -92,7 +94,7 @@ ModuleInit() MONITOR_OBJECT * GetModuleObject() { - return &MyObject; + return &MyObject; } /** @@ -103,71 +105,78 @@ GetModuleObject() * @param arg The current handle - NULL if first start * @return A handle to use when interacting with the monitor */ -static void * -startMonitor(void *arg,void* opt) +static void * +startMonitor(void *arg, void* opt) { - MONITOR* mon = (MONITOR*)arg; + MONITOR* mon = (MONITOR*) arg; MM_MONITOR *handle = mon->handle; - CONFIG_PARAMETER* params = (CONFIG_PARAMETER*)opt; - bool have_events = false,script_error = false; + CONFIG_PARAMETER* params = (CONFIG_PARAMETER*) opt; + bool have_events = false, script_error = false; if (handle) { - handle->shutdown = 0; + handle->shutdown = 0; } else { - if ((handle = (MM_MONITOR *)malloc(sizeof(MM_MONITOR))) == NULL) - return NULL; - handle->shutdown = 0; - handle->id = MONITOR_DEFAULT_ID; - handle->master = NULL; - handle->script = NULL; - handle->detectStaleMaster = false; - memset(handle->events,false,sizeof(handle->events)); - spinlock_init(&handle->lock); + if ((handle = (MM_MONITOR *) malloc(sizeof(MM_MONITOR))) == NULL) + { + return NULL; + } + handle->shutdown = 0; + handle->id = MONITOR_DEFAULT_ID; + handle->master = NULL; + handle->script = NULL; + handle->detectStaleMaster = false; + memset(handle->events, false, sizeof(handle->events)); + spinlock_init(&handle->lock); } - while(params) + while (params) { - if(!strcmp(params->name,"detect_stale_master")) - { - handle->detectStaleMaster = config_truth_value(params->value); - } - else if(!strcmp(params->name,"script")) - { - if (externcmd_can_execute(params->value)) + if (!strcmp(params->name, "detect_stale_master")) { - free(handle->script); - handle->script = strdup(params->value); + handle->detectStaleMaster = config_truth_value(params->value); } - else + else if (!strcmp(params->name, "script")) { - script_error = true; + if (externcmd_can_execute(params->value)) + { + free(handle->script); + handle->script = strdup(params->value); + } + else + { + script_error = true; + } } - } - else if(!strcmp(params->name,"events")) - { - if(mon_parse_event_string((bool*)&handle->events,sizeof(handle->events),params->value) != 0) - script_error = true; - else - have_events = true; - } - params = params->next; + else if (!strcmp(params->name, "events")) + { + if (mon_parse_event_string((bool*) & handle->events, + sizeof(handle->events), params->value) != 0) + { + script_error = true; + } + else + { + have_events = true; + } + } + params = params->next; } - if(script_error) + if (script_error) { - skygw_log_write(LE,"Error: Errors were found in the script configuration parameters " - "for the monitor '%s'. The script will not be used.",mon->name); - free(handle->script); - handle->script = NULL; + skygw_log_write(LE, "Error: Errors were found in the script configuration parameters " + "for the monitor '%s'. The script will not be used.", mon->name); + free(handle->script); + handle->script = NULL; } /** If no specific events are given, enable them all */ - if(!have_events) + if (!have_events) { - memset(handle->events,true,sizeof(handle->events)); + memset(handle->events, true, sizeof(handle->events)); } - handle->tid = (THREAD)thread_start(monitorMain, mon); + handle->tid = (THREAD) thread_start(monitorMain, mon); return handle; } @@ -176,14 +185,14 @@ startMonitor(void *arg,void* opt) * * @param arg Handle on thr running monior */ -static void +static void stopMonitor(void *arg) { MONITOR* mon = arg; - MM_MONITOR *handle = (MM_MONITOR *)mon->handle; + MM_MONITOR *handle = (MM_MONITOR *) mon->handle; - handle->shutdown = 1; - thread_wait((void *)handle->tid); + handle->shutdown = 1; + thread_wait((void *) handle->tid); } /** @@ -194,41 +203,41 @@ stopMonitor(void *arg) */ static void diagnostics(DCB *dcb, void *arg) { - MONITOR* mon = (MONITOR*)arg; -MM_MONITOR *handle = (MM_MONITOR *)mon->handle; -MONITOR_SERVERS *db; -char *sep; + MONITOR* mon = (MONITOR*) arg; + MM_MONITOR *handle = (MM_MONITOR *) mon->handle; + MONITOR_SERVERS *db; + char *sep; - switch (handle->status) - { - case MONITOR_RUNNING: - dcb_printf(dcb, "\tMonitor running\n"); - break; - case MONITOR_STOPPING: - dcb_printf(dcb, "\tMonitor stopping\n"); - break; - case MONITOR_STOPPED: - dcb_printf(dcb, "\tMonitor stopped\n"); - break; - } + switch (handle->status) + { + case MONITOR_RUNNING: + dcb_printf(dcb, "\tMonitor running\n"); + break; + case MONITOR_STOPPING: + dcb_printf(dcb, "\tMonitor stopping\n"); + break; + case MONITOR_STOPPED: + dcb_printf(dcb, "\tMonitor stopped\n"); + break; + } - dcb_printf(dcb,"\tSampling interval:\t%lu milliseconds\n", mon->interval); - dcb_printf(dcb,"\tDetect Stale Master:\t%s\n", (handle->detectStaleMaster == 1) ? "enabled" : "disabled"); - dcb_printf(dcb, "\tMonitored servers: "); + dcb_printf(dcb, "\tSampling interval:\t%lu milliseconds\n", mon->interval); + dcb_printf(dcb, "\tDetect Stale Master:\t%s\n", (handle->detectStaleMaster == 1) ? "enabled" : "disabled"); + dcb_printf(dcb, "\tMonitored servers: "); - db = mon->databases; - sep = ""; - while (db) - { - dcb_printf(dcb, - "%s%s:%d", - sep, - db->server->name, - db->server->port); - sep = ", "; - db = db->next; - } - dcb_printf(dcb, "\n"); + db = mon->databases; + sep = ""; + while (db) + { + dcb_printf(dcb, + "%s%s:%d", + sep, + db->server->name, + db->server->port); + sep = ", "; + db = db->next; + } + dcb_printf(dcb, "\n"); } /** @@ -240,16 +249,18 @@ char *sep; static void monitorDatabase(MONITOR* mon, MONITOR_SERVERS *database) { -MYSQL_ROW row; -MYSQL_RES *result; -int isslave = 0; -int ismaster = 0; -unsigned long int server_version = 0; -char *server_string; + MYSQL_ROW row; + MYSQL_RES *result; + int isslave = 0; + int ismaster = 0; + unsigned long int server_version = 0; + char *server_string; /* Don't probe servers in maintenance mode */ if (SERVER_IN_MAINT(database->server)) + { return; + } /** Store previous status */ database->mon_prev_status = database->server->status; @@ -288,208 +299,228 @@ char *server_string; } /* Store current status in both server and monitor server pending struct */ - server_set_status(database->server, SERVER_RUNNING); - monitor_set_pending_status(database, SERVER_RUNNING); + server_set_status(database->server, SERVER_RUNNING); + monitor_set_pending_status(database, SERVER_RUNNING); - /* get server version from current server */ - server_version = mysql_get_server_version(database->con); + /* get server version from current server */ + server_version = mysql_get_server_version(database->con); - /* get server version string */ - server_string = (char *)mysql_get_server_info(database->con); + /* get server version string */ + server_string = (char *) mysql_get_server_info(database->con); if (server_string) { server_set_version_string(database->server, server_string); } - /* get server_id form current node */ - if (mysql_query(database->con, "SELECT @@server_id") == 0 - && (result = mysql_store_result(database->con)) != NULL) + /* get server_id form current node */ + if (mysql_query(database->con, "SELECT @@server_id") == 0 + && (result = mysql_store_result(database->con)) != NULL) + { + long server_id = -1; + + if (mysql_field_count(database->con) != 1) { - long server_id = -1; + mysql_free_result(result); + skygw_log_write(LE, "Error: Unexpected result for 'SELECT @@server_id'. Expected 1 column." + " MySQL Version: %s", version_str); + return; + } - if(mysql_field_count(database->con) != 1) - { - mysql_free_result(result); - skygw_log_write(LE,"Error: Unexpected result for 'SELECT @@server_id'. Expected 1 column." - " MySQL Version: %s",version_str); - return; - } + while ((row = mysql_fetch_row(result))) + { + server_id = strtol(row[0], NULL, 10); + if ((errno == ERANGE && (server_id == LONG_MAX + || server_id == LONG_MIN)) || (errno != 0 && server_id == 0)) + { + server_id = -1; + } + database->server->node_id = server_id; + } + mysql_free_result(result); + } - while ((row = mysql_fetch_row(result))) - { - server_id = strtol(row[0], NULL, 10); - if ((errno == ERANGE && (server_id == LONG_MAX - || server_id == LONG_MIN)) || (errno != 0 && server_id == 0)) - { - server_id = -1; - } - database->server->node_id = server_id; - } + /* Check if the Slave_SQL_Running and Slave_IO_Running status is + * set to Yes + */ + + /* Check first for MariaDB 10.x.x and get status for multimaster replication */ + if (server_version >= 100000) + { + + if (mysql_query(database->con, "SHOW ALL SLAVES STATUS") == 0 + && (result = mysql_store_result(database->con)) != NULL) + { + int i = 0; + long master_id = -1; + + if (mysql_field_count(database->con) < 42) + { mysql_free_result(result); + skygw_log_write(LE, "Error: \"SHOW ALL SLAVES STATUS\" " + "returned less than the expected amount of columns. Expected 42 columns" + " MySQL Version: %s", version_str); + return; + } + + while ((row = mysql_fetch_row(result))) + { + /* get Slave_IO_Running and Slave_SQL_Running values*/ + if (strncmp(row[12], "Yes", 3) == 0 + && strncmp(row[13], "Yes", 3) == 0) + { + isslave += 1; + } + + /* If Slave_IO_Running = Yes, assign the master_id to current server: this allows building + * the replication tree, slaves ids will be added to master(s) and we will have at least the + * root master server. + * Please note, there could be no slaves at all if Slave_SQL_Running == 'No' + */ + if (strncmp(row[12], "Yes", 3) == 0) + { + /* get Master_Server_Id values */ + master_id = atol(row[41]); + if (master_id == 0) + { + master_id = -1; + } + } + + i++; + } + /* store master_id of current node */ + memcpy(&database->server->master_id, &master_id, sizeof(long)); + + mysql_free_result(result); + + /* If all configured slaves are running set this node as slave */ + if (isslave > 0 && isslave == i) + { + isslave = 1; + } + else + { + isslave = 0; + } } - - /* Check if the Slave_SQL_Running and Slave_IO_Running status is - * set to Yes - */ - - /* Check first for MariaDB 10.x.x and get status for multimaster replication */ - if (server_version >= 100000) { - - if (mysql_query(database->con, "SHOW ALL SLAVES STATUS") == 0 - && (result = mysql_store_result(database->con)) != NULL) - { - int i = 0; - long master_id = -1; - - if(mysql_field_count(database->con) < 42) - { - mysql_free_result(result); - skygw_log_write(LE,"Error: \"SHOW ALL SLAVES STATUS\" " - "returned less than the expected amount of columns. Expected 42 columns" - " MySQL Version: %s",version_str); - return; - } - - while ((row = mysql_fetch_row(result))) - { - /* get Slave_IO_Running and Slave_SQL_Running values*/ - if (strncmp(row[12], "Yes", 3) == 0 - && strncmp(row[13], "Yes", 3) == 0) { - isslave += 1; - } - - /* If Slave_IO_Running = Yes, assign the master_id to current server: this allows building - * the replication tree, slaves ids will be added to master(s) and we will have at least the - * root master server. - * Please note, there could be no slaves at all if Slave_SQL_Running == 'No' - */ - if (strncmp(row[12], "Yes", 3) == 0) { - /* get Master_Server_Id values */ - master_id = atol(row[41]); - if (master_id == 0) - master_id = -1; - } - - i++; - } - /* store master_id of current node */ - memcpy(&database->server->master_id, &master_id, sizeof(long)); - - mysql_free_result(result); - - /* If all configured slaves are running set this node as slave */ - if (isslave > 0 && isslave == i) - isslave = 1; - else - isslave = 0; - } - } else { - if (mysql_query(database->con, "SHOW SLAVE STATUS") == 0 - && (result = mysql_store_result(database->con)) != NULL) - { - long master_id = -1; - - if(mysql_field_count(database->con) < 40) - { - mysql_free_result(result); - - if(server_version < 5*10000 + 5*100) - { - if(database->log_version_err) - { - skygw_log_write(LE,"Error: \"SHOW SLAVE STATUS\" " - " for versions less than 5.5 does not have master_server_id, " - "replication tree cannot be resolved for server %s." - " MySQL Version: %s",database->server->unique_name,version_str); - database->log_version_err = false; - } - } - else - { - skygw_log_write(LE,"Error: \"SHOW SLAVE STATUS\" " - "returned less than the expected amount of columns. Expected 40 columns." - " MySQL Version: %s",version_str); - } - return; - } - - while ((row = mysql_fetch_row(result))) - { - /* get Slave_IO_Running and Slave_SQL_Running values*/ - if (strncmp(row[10], "Yes", 3) == 0 - && strncmp(row[11], "Yes", 3) == 0) { - isslave = 1; - } - - /* If Slave_IO_Running = Yes, assign the master_id to current server: this allows building - * the replication tree, slaves ids will be added to master(s) and we will have at least the - * root master server. - * Please note, there could be no slaves at all if Slave_SQL_Running == 'No' - */ - if (strncmp(row[10], "Yes", 3) == 0) { - /* get Master_Server_Id values */ - master_id = atol(row[39]); - if (master_id == 0) - master_id = -1; - } - } - /* store master_id of current node */ - memcpy(&database->server->master_id, &master_id, sizeof(long)); - - mysql_free_result(result); - } - } - - /* get variable 'read_only' set by an external component */ - if (mysql_query(database->con, "SHOW GLOBAL VARIABLES LIKE 'read_only'") == 0 - && (result = mysql_store_result(database->con)) != NULL) - { - if(mysql_field_count(database->con) < 2) - { - mysql_free_result(result); - skygw_log_write(LE,"Error: Unexpected result for \"SHOW GLOBAL VARIABLES LIKE 'read_only'\". Expected 2 columns." - " MySQL Version: %s",version_str); - return; - } - - while ((row = mysql_fetch_row(result))) - { - if (strncasecmp(row[1], "OFF", 3) == 0) { - ismaster = 1; - } else { - isslave = 1; - } - } - mysql_free_result(result); - } - - /* Remove addition info */ - monitor_clear_pending_status(database, SERVER_STALE_STATUS); - - /* Set the Slave Role */ - if (isslave) - { - monitor_set_pending_status(database, SERVER_SLAVE); - /* Avoid any possible stale Master state */ - monitor_clear_pending_status(database, SERVER_MASTER); - - /* Set replication depth to 1 */ - database->server->depth = 1; - } else { - /* Avoid any possible Master/Slave stale state */ - monitor_clear_pending_status(database, SERVER_SLAVE); - monitor_clear_pending_status(database, SERVER_MASTER); - } - - /* Set the Master role */ - if (ismaster) + } + else + { + if (mysql_query(database->con, "SHOW SLAVE STATUS") == 0 + && (result = mysql_store_result(database->con)) != NULL) { - monitor_clear_pending_status(database, SERVER_SLAVE); - monitor_set_pending_status(database, SERVER_MASTER); + long master_id = -1; - /* Set replication depth to 0 */ - database->server->depth = 0; + if (mysql_field_count(database->con) < 40) + { + mysql_free_result(result); + + if (server_version < 5 * 10000 + 5 * 100) + { + if (database->log_version_err) + { + skygw_log_write(LE, "Error: \"SHOW SLAVE STATUS\" " + " for versions less than 5.5 does not have master_server_id, " + "replication tree cannot be resolved for server %s." + " MySQL Version: %s", database->server->unique_name, version_str); + database->log_version_err = false; + } + } + else + { + skygw_log_write(LE, "Error: \"SHOW SLAVE STATUS\" " + "returned less than the expected amount of columns. Expected 40 columns." + " MySQL Version: %s", version_str); + } + return; + } + + while ((row = mysql_fetch_row(result))) + { + /* get Slave_IO_Running and Slave_SQL_Running values*/ + if (strncmp(row[10], "Yes", 3) == 0 + && strncmp(row[11], "Yes", 3) == 0) + { + isslave = 1; + } + + /* If Slave_IO_Running = Yes, assign the master_id to current server: this allows building + * the replication tree, slaves ids will be added to master(s) and we will have at least the + * root master server. + * Please note, there could be no slaves at all if Slave_SQL_Running == 'No' + */ + if (strncmp(row[10], "Yes", 3) == 0) + { + /* get Master_Server_Id values */ + master_id = atol(row[39]); + if (master_id == 0) + { + master_id = -1; + } + } + } + /* store master_id of current node */ + memcpy(&database->server->master_id, &master_id, sizeof(long)); + + mysql_free_result(result); } + } + + /* get variable 'read_only' set by an external component */ + if (mysql_query(database->con, "SHOW GLOBAL VARIABLES LIKE 'read_only'") == 0 + && (result = mysql_store_result(database->con)) != NULL) + { + if (mysql_field_count(database->con) < 2) + { + mysql_free_result(result); + skygw_log_write(LE, "Error: Unexpected result for \"SHOW GLOBAL VARIABLES LIKE 'read_only'\". Expected 2 columns." + " MySQL Version: %s", version_str); + return; + } + + while ((row = mysql_fetch_row(result))) + { + if (strncasecmp(row[1], "OFF", 3) == 0) + { + ismaster = 1; + } + else + { + isslave = 1; + } + } + mysql_free_result(result); + } + + /* Remove addition info */ + monitor_clear_pending_status(database, SERVER_STALE_STATUS); + + /* Set the Slave Role */ + if (isslave) + { + monitor_set_pending_status(database, SERVER_SLAVE); + /* Avoid any possible stale Master state */ + monitor_clear_pending_status(database, SERVER_MASTER); + + /* Set replication depth to 1 */ + database->server->depth = 1; + } + else + { + /* Avoid any possible Master/Slave stale state */ + monitor_clear_pending_status(database, SERVER_SLAVE); + monitor_clear_pending_status(database, SERVER_MASTER); + } + + /* Set the Master role */ + if (ismaster) + { + monitor_clear_pending_status(database, SERVER_SLAVE); + monitor_set_pending_status(database, SERVER_MASTER); + + /* Set replication depth to 0 */ + database->server->depth = 0; + } } @@ -501,140 +532,144 @@ char *server_string; static void monitorMain(void *arg) { - MONITOR* mon = (MONITOR*)arg; -MM_MONITOR *handle; -MONITOR_SERVERS *ptr; -int detect_stale_master = false; -MONITOR_SERVERS *root_master = NULL; -size_t nrounds = 0; + MONITOR* mon = (MONITOR*) arg; + MM_MONITOR *handle; + MONITOR_SERVERS *ptr; + int detect_stale_master = false; + MONITOR_SERVERS *root_master = NULL; + size_t nrounds = 0; -spinlock_acquire(&mon->lock); -handle = (MM_MONITOR *)mon->handle; -spinlock_release(&mon->lock); -detect_stale_master = handle->detectStaleMaster; + spinlock_acquire(&mon->lock); + handle = (MM_MONITOR *) mon->handle; + spinlock_release(&mon->lock); + detect_stale_master = handle->detectStaleMaster; - if (mysql_thread_init()) - { - LOGIF(LE, (skygw_log_write_flush( - LOGFILE_ERROR, - "Fatal : mysql_thread_init failed in monitor " - "module. Exiting.\n"))); - return; - } + if (mysql_thread_init()) + { + LOGIF(LE, (skygw_log_write_flush( + LOGFILE_ERROR, + "Fatal : mysql_thread_init failed in monitor " + "module. Exiting.\n"))); + return; + } - handle->status = MONITOR_RUNNING; - while (1) - { - if (handle->shutdown) - { - handle->status = MONITOR_STOPPING; - mysql_thread_end(); - handle->status = MONITOR_STOPPED; - return; - } + handle->status = MONITOR_RUNNING; + while (1) + { + if (handle->shutdown) + { + handle->status = MONITOR_STOPPING; + mysql_thread_end(); + handle->status = MONITOR_STOPPED; + return; + } - /** Wait base interval */ - thread_millisleep(MON_BASE_INTERVAL_MS); - /** - * Calculate how far away the monitor interval is from its full - * cycle and if monitor interval time further than the base - * interval, then skip monitoring checks. Excluding the first - * round. - */ - if (nrounds != 0 && - ((nrounds*MON_BASE_INTERVAL_MS)%mon->interval) >= - MON_BASE_INTERVAL_MS) + /** Wait base interval */ + thread_millisleep(MON_BASE_INTERVAL_MS); + /** + * Calculate how far away the monitor interval is from its full + * cycle and if monitor interval time further than the base + * interval, then skip monitoring checks. Excluding the first + * round. + */ + if (nrounds != 0 && + ((nrounds * MON_BASE_INTERVAL_MS) % mon->interval) >= + MON_BASE_INTERVAL_MS) + { + nrounds += 1; + continue; + } + nrounds += 1; + + /* start from the first server in the list */ + ptr = mon->databases; + + while (ptr) + { + /* copy server status into monitor pending_status */ + ptr->pending_status = ptr->server->status; + + /* monitor current node */ + monitorDatabase(mon, ptr); + + if (mon_status_changed(ptr)) + { + dcb_hangup_foreach(ptr->server); + } + + if (mon_status_changed(ptr) || + mon_print_fail_status(ptr)) + { + LOGIF(LD, (skygw_log_write_flush( + LOGFILE_DEBUG, + "Backend server %s:%d state : %s", + ptr->server->name, + ptr->server->port, + STRSRVSTATUS(ptr->server)))); + } + if (SERVER_IS_DOWN(ptr->server)) + { + /** Increase this server'e error count */ + ptr->mon_err_count += 1; + } + else + { + /** Reset this server's error count */ + ptr->mon_err_count = 0; + } + + ptr = ptr->next; + } + + /* Get Master server pointer */ + root_master = get_current_master(mon); + + /* Update server status from monitor pending status on that server*/ + + ptr = mon->databases; + while (ptr) + { + if (!SERVER_IN_MAINT(ptr->server)) + { + /* If "detect_stale_master" option is On, let's use the previus master */ + if (detect_stale_master && root_master && (!strcmp(ptr->server->name, root_master->server->name) && ptr->server->port == root_master->server->port) && (ptr->server->status & SERVER_MASTER) && !(ptr->pending_status & SERVER_MASTER)) { - nrounds += 1; - continue; + /* in this case server->status will not be updated from pending_status */ + LOGIF(LM, (skygw_log_write_flush( + LOGFILE_MESSAGE, "[mysql_mon]: root server [%s:%i] is no longer Master, let's use it again even if it could be a stale master, you have been warned!", ptr->server->name, ptr->server->port))); + /* Set the STALE bit for this server in server struct */ + server_set_status(ptr->server, SERVER_STALE_STATUS); } - nrounds += 1; + else + { + ptr->server->status = ptr->pending_status; + } + } + ptr = ptr->next; + } - /* start from the first server in the list */ - ptr = mon->databases; - - while (ptr) - { - /* copy server status into monitor pending_status */ - ptr->pending_status = ptr->server->status; - - /* monitor current node */ - monitorDatabase(mon, ptr); - - if (mon_status_changed(ptr)) - { - dcb_hangup_foreach(ptr->server); - } - - if (mon_status_changed(ptr) || - mon_print_fail_status(ptr)) - { - LOGIF(LD, (skygw_log_write_flush( - LOGFILE_DEBUG, - "Backend server %s:%d state : %s", - ptr->server->name, - ptr->server->port, - STRSRVSTATUS(ptr->server)))); - } - if (SERVER_IS_DOWN(ptr->server)) - { - /** Increase this server'e error count */ - ptr->mon_err_count += 1; - } - else - { - /** Reset this server's error count */ - ptr->mon_err_count = 0; - } - - ptr = ptr->next; - } - - /* Get Master server pointer */ - root_master = get_current_master(mon); - - /* Update server status from monitor pending status on that server*/ - - ptr = mon->databases; - while (ptr) - { - if (! SERVER_IN_MAINT(ptr->server)) { - /* If "detect_stale_master" option is On, let's use the previus master */ - if (detect_stale_master && root_master && (!strcmp(ptr->server->name, root_master->server->name) && ptr->server->port == root_master->server->port) && (ptr->server->status & SERVER_MASTER) && !(ptr->pending_status & SERVER_MASTER)) { - /* in this case server->status will not be updated from pending_status */ - LOGIF(LM, (skygw_log_write_flush( - LOGFILE_MESSAGE, "[mysql_mon]: root server [%s:%i] is no longer Master, let's use it again even if it could be a stale master, you have been warned!", ptr->server->name, ptr->server->port))); - /* Set the STALE bit for this server in server struct */ - server_set_status(ptr->server, SERVER_STALE_STATUS); - } else { - ptr->server->status = ptr->pending_status; - } - } - ptr = ptr->next; - } - - ptr = mon->databases; - monitor_event_t evtype; - while(ptr) - { - if(mon_status_changed(ptr)) - { - evtype = mon_get_event_type(ptr); - if(isMySQLEvent(evtype)) - { - skygw_log_write(LOGFILE_TRACE,"Server changed state: %s[%s:%u]: %s", - ptr->server->unique_name, - ptr->server->name,ptr->server->port, - mon_get_event_name(ptr)); - if(handle->script && handle->events[evtype]) - { - monitor_launch_script(mon,ptr,handle->script); - } - } - } - ptr = ptr->next; - } - } + ptr = mon->databases; + monitor_event_t evtype; + while (ptr) + { + if (mon_status_changed(ptr)) + { + evtype = mon_get_event_type(ptr); + if (isMySQLEvent(evtype)) + { + skygw_log_write(LOGFILE_TRACE, "Server changed state: %s[%s:%u]: %s", + ptr->server->unique_name, + ptr->server->name, ptr->server->port, + mon_get_event_name(ptr)); + if (handle->script && handle->events[evtype]) + { + monitor_launch_script(mon, ptr, handle->script); + } + } + } + ptr = ptr->next; + } + } } /** @@ -648,9 +683,9 @@ detect_stale_master = handle->detectStaleMaster; static void detectStaleMaster(void *arg, int enable) { - MONITOR* mon = (MONITOR*)arg; -MM_MONITOR *handle = (MM_MONITOR *)mon->handle; - memcpy(&handle->detectStaleMaster, &enable, sizeof(int)); + MONITOR* mon = (MONITOR*) arg; + MM_MONITOR *handle = (MM_MONITOR *) mon->handle; + memcpy(&handle->detectStaleMaster, &enable, sizeof(int)); } /******* @@ -663,61 +698,71 @@ MM_MONITOR *handle = (MM_MONITOR *)mon->handle; * @return The server at root level with SERVER_MASTER bit */ -static MONITOR_SERVERS *get_current_master(MONITOR *mon) { +static MONITOR_SERVERS *get_current_master(MONITOR *mon) +{ MM_MONITOR* handle = mon->handle; -MONITOR_SERVERS *ptr; + MONITOR_SERVERS *ptr; - ptr = mon->databases; + ptr = mon->databases; - while (ptr) - { - /* The server could be in SERVER_IN_MAINT - * that means SERVER_IS_RUNNING returns 0 - * Let's check only for SERVER_IS_DOWN: server is not running - */ - if (SERVER_IS_DOWN(ptr->server)) { - ptr = ptr->next; - continue; - } + while (ptr) + { + /* The server could be in SERVER_IN_MAINT + * that means SERVER_IS_RUNNING returns 0 + * Let's check only for SERVER_IS_DOWN: server is not running + */ + if (SERVER_IS_DOWN(ptr->server)) + { + ptr = ptr->next; + continue; + } - if (ptr->server->depth == 0) { - handle->master = ptr; - } + if (ptr->server->depth == 0) + { + handle->master = ptr; + } - ptr = ptr->next; - } + ptr = ptr->next; + } - /* - * Return the root master - */ + /* + * Return the root master + */ - if (handle->master != NULL) { - /* If the root master is in MAINT, return NULL */ - if (SERVER_IN_MAINT(handle->master->server)) { - return NULL; - } else { - return handle->master; - } - } else { - return NULL; - } + if (handle->master != NULL) + { + /* If the root master is in MAINT, return NULL */ + if (SERVER_IN_MAINT(handle->master->server)) + { + return NULL; + } + else + { + return handle->master; + } + } + else + { + return NULL; + } } static monitor_event_t mysql_events[] = { - MASTER_DOWN_EVENT, - MASTER_UP_EVENT, - SLAVE_DOWN_EVENT, - SLAVE_UP_EVENT, - SERVER_DOWN_EVENT, - SERVER_UP_EVENT, - LOST_MASTER_EVENT, - LOST_SLAVE_EVENT, - NEW_MASTER_EVENT, - NEW_SLAVE_EVENT, - MAX_MONITOR_EVENT + MASTER_DOWN_EVENT, + MASTER_UP_EVENT, + SLAVE_DOWN_EVENT, + SLAVE_UP_EVENT, + SERVER_DOWN_EVENT, + SERVER_UP_EVENT, + LOST_MASTER_EVENT, + LOST_SLAVE_EVENT, + NEW_MASTER_EVENT, + NEW_SLAVE_EVENT, + MAX_MONITOR_EVENT }; + /** * Check if the MM monitor is monitoring this event type. * @param event Event to check @@ -726,10 +771,12 @@ static monitor_event_t mysql_events[] = { bool isMySQLEvent(monitor_event_t event) { int i; - for(i = 0;mysql_events[i] != MAX_MONITOR_EVENT;i++) + for (i = 0; mysql_events[i] != MAX_MONITOR_EVENT; i++) { - if(event == mysql_events[i]) - return true; + if (event == mysql_events[i]) + { + return true; + } } return false; }