1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
CREATE PROCEDURE @extschema@.run_maintenance_proc(
p_wait int DEFAULT 0
-- Keep these defaults in sync with `run_maintenance`!
, p_analyze boolean DEFAULT false
, p_jobmon boolean DEFAULT true
)
LANGUAGE plpgsql
AS $$
DECLARE
v_adv_lock boolean;
v_parent_table text;
v_sql text;
BEGIN
v_adv_lock := pg_try_advisory_lock(hashtext('pg_partman run_maintenance_proc'));
IF v_adv_lock = false THEN
RAISE NOTICE 'Advisory lock notice (pg_partman run_maintenance_proc): Partman maintenance procedure already running or another session has not released its advisory lock.';
RETURN;
END IF;
IF pg_is_in_recovery() THEN
RAISE DEBUG 'pg_partmain maintenance procedure called on replica. Doing nothing.';
RETURN;
END IF;
FOR v_parent_table IN
SELECT parent_table
FROM @extschema@.part_config
WHERE undo_in_progress = false
AND automatic_maintenance = 'on'
ORDER BY maintenance_order ASC NULLS LAST
LOOP
/*
* Run maintenance with a commit between each partition set
*/
v_sql := format('SELECT %s.run_maintenance(%L, p_jobmon := %L',
'@extschema@', v_parent_table, p_jobmon);
IF p_analyze IS NOT NULL THEN
v_sql := v_sql || format(', p_analyze := %L', p_analyze);
END IF;
v_sql := v_sql || ')';
RAISE DEBUG 'v_sql run_maintenance_proc: %', v_sql;
EXECUTE v_sql;
COMMIT;
PERFORM pg_sleep(p_wait);
END LOOP;
PERFORM pg_advisory_unlock(hashtext('pg_partman run_maintenance_proc'));
END
$$;
|