164 lines
4.6 KiB
SQL
164 lines
4.6 KiB
SQL
# ==== Purpose ====
|
|
#
|
|
# Enables thread stage events for the auto-rejoin process.
|
|
# Adds the following SQL functions to easily monitor auto-rejoins in GR:
|
|
#
|
|
# IS_AUTOREJOIN_RUNNING()
|
|
# + Returns a flag indicating whether or not an auto-rejoin process is
|
|
# currently running.
|
|
#
|
|
# GET_NUMBER_RETRIES()
|
|
# + Returns the number of retries that have been attempted in a running
|
|
# auto-rejoin process.
|
|
#
|
|
# GET_TIME_UNTIL_NEXT_RETRY()
|
|
# + Returns the time remaining until the next retry in seconds, for a
|
|
# running auto-rejoin process. If no auto-rejoin process is running, it
|
|
# returns -1.
|
|
#
|
|
# GET_LAST_AUTOREJOIN()
|
|
# + Returns the UNIX timestamp of the last auto-rejoin process that was
|
|
# run. If no auto-rejoin process has been attempted yet, returns -1.
|
|
#
|
|
# GET_COUNT_AUTOREJOIN()
|
|
# + Returns the number of times the auto-rejoin process has been run.
|
|
#
|
|
# ==== Usage ====
|
|
#
|
|
# --source include/gr_autorejoin_monitoring.inc
|
|
#
|
|
# NOTE: The functions created in this include can be dropped by sourcing the
|
|
# include/gr_end_autorejoin_monitoring.inc file.
|
|
#
|
|
--let $include_filename = gr_autorejoin_monitoring.inc
|
|
--source include/begin_include_file.inc
|
|
|
|
--disable_query_log
|
|
SET SESSION sql_log_bin = 0;
|
|
|
|
DELIMITER //;
|
|
CREATE FUNCTION IS_AUTOREJOIN_RUNNING() RETURNS BOOLEAN
|
|
BEGIN
|
|
DECLARE autorejoin_running INTEGER;
|
|
DECLARE ret BOOL;
|
|
SET autorejoin_running = -1;
|
|
SET ret = FALSE;
|
|
|
|
-- There is only one auto-rejoin thread. If there is a thread stage event
|
|
-- with the auto-rejoin name, then an auto-rejoin process is being run.
|
|
SELECT COUNT(*) FROM performance_schema.events_stages_current
|
|
WHERE EVENT_NAME LIKE '%auto-rejoin%'
|
|
INTO autorejoin_running;
|
|
|
|
IF autorejoin_running = 1 THEN
|
|
SET ret = TRUE;
|
|
END IF;
|
|
|
|
RETURN ret;
|
|
END //
|
|
|
|
CREATE FUNCTION GET_NUMBER_RETRIES()
|
|
RETURNS INT
|
|
BEGIN
|
|
DECLARE ret INT;
|
|
DECLARE autorejoin_running BOOL;
|
|
SET ret = -1;
|
|
SET autorejoin_running = FALSE;
|
|
|
|
SELECT IS_AUTOREJOIN_RUNNING() INTO autorejoin_running;
|
|
|
|
-- The WORK_COMPLETED field of the events_stage_current performance schema
|
|
-- table contains the number of attempts within a running auto-rejoin process.
|
|
IF autorejoin_running = TRUE THEN
|
|
SELECT WORK_COMPLETED FROM performance_schema.events_stages_current
|
|
WHERE EVENT_NAME LIKE '%auto-rejoin%'
|
|
INTO ret;
|
|
END IF;
|
|
|
|
RETURN ret;
|
|
END //
|
|
|
|
CREATE FUNCTION GET_TIME_UNTIL_NEXT_RETRY(wait_interval INTEGER)
|
|
RETURNS DOUBLE
|
|
BEGIN
|
|
DECLARE ret DOUBLE;
|
|
DECLARE autorejoin_running BOOL;
|
|
DECLARE time_in_secs DOUBLE;
|
|
DECLARE num_retries INT;
|
|
DECLARE sleep_interval INT;
|
|
SET ret = -1;
|
|
SET autorejoin_running = FALSE;
|
|
SET time_in_secs = 0;
|
|
SET num_retries = 0;
|
|
SET sleep_interval = wait_interval;
|
|
|
|
SELECT IS_AUTOREJOIN_RUNNING() INTO autorejoin_running;
|
|
|
|
IF autorejoin_running = TRUE THEN
|
|
-- If -1 is passed as interval, we default to 5 mins (300 secs)
|
|
IF sleep_interval = -1 THEN
|
|
SET sleep_interval = 300;
|
|
END IF;
|
|
|
|
-- We obtain the number of retries so far, so we can calculate the time
|
|
-- that has been spent up until the last retry.
|
|
SELECT GET_NUMBER_RETRIES() INTO num_retries;
|
|
SET num_retries = num_retries - 1;
|
|
|
|
-- We then obtain the time spent up until now and scale it to seconds.
|
|
SELECT TIMER_WAIT FROM performance_schema.events_stages_current
|
|
WHERE EVENT_NAME LIKE '%auto-rejoin%'
|
|
INTO time_in_secs;
|
|
SET time_in_secs = time_in_secs * 10e-13;
|
|
|
|
-- We then estimate the remaining time in seconds. Note: 300sec = 5 mins.
|
|
SET ret = sleep_interval - (time_in_secs - sleep_interval * num_retries);
|
|
END IF;
|
|
|
|
RETURN ret;
|
|
END //
|
|
|
|
CREATE FUNCTION GET_LAST_AUTOREJOIN()
|
|
RETURNS INT
|
|
BEGIN
|
|
DECLARE ret INT;
|
|
DECLARE num_autorejoins INT;
|
|
SET ret = -1;
|
|
SET num_autorejoins = 0;
|
|
|
|
-- We first verify if there have been any auto-rejoin up until now.
|
|
SELECT GET_COUNT_AUTOREJOIN() INTO num_autorejoins;
|
|
IF num_autorejoins > 0 THEN
|
|
SELECT
|
|
UNIX_TIMESTAMP() - ((SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='UPTIME') - TIMER_END * 10e-13)
|
|
FROM performance_schema.events_stages_history_long
|
|
WHERE EVENT_NAME LIKE '%auto-rejoin%'
|
|
ORDER BY TIMER_END DESC
|
|
LIMIT 1
|
|
INTO ret;
|
|
END IF;
|
|
|
|
RETURN ret;
|
|
END //
|
|
|
|
CREATE FUNCTION GET_COUNT_AUTOREJOIN()
|
|
RETURNS INT
|
|
BEGIN
|
|
DECLARE ret INT;
|
|
SET ret = 0;
|
|
|
|
SELECT COUNT_STAR
|
|
FROM performance_schema.events_stages_summary_global_by_event_name
|
|
WHERE EVENT_NAME LIKE '%auto-rejoin%'
|
|
INTO ret;
|
|
|
|
RETURN ret;
|
|
END //
|
|
DELIMITER ;//
|
|
|
|
SET SESSION sql_log_bin = 1;
|
|
--enable_query_log
|
|
|
|
--let $include_filename = gr_autorejoin_monitoring.inc
|
|
--source include/end_include_file.inc
|