mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-16 02:23:49 +08:00
Right now `bgw_log_level` requires `ALTER SYSTEM` since it is using `PGC_SIGHUP` but we want to make sure that it is possible to set the scheduler log level using `ALTER DATABASE` which allows it to be replicated and also allows the database owner to set the value rather than requiring superuser privileges or explicit grants. Since we want to allow configuration to be reloaded without restarting the server, we are limited to `PGC_SUSET` and `PGC_SIGHUP` and tests are added for PG15 and later to make sure that we can grant privileges to use `ALTER SYSTEM` and `ALTER DATABASE` to set the parameter.
103 lines
3.4 KiB
SQL
103 lines
3.4 KiB
SQL
-- This file and its contents are licensed under the Timescale License.
|
|
-- Please see the included NOTICE for copyright information and
|
|
-- LICENSE-TIMESCALE for a copy of the license.
|
|
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
CREATE FUNCTION ts_bgw_db_scheduler_test_run_and_wait_for_scheduler_finish(INT, INT) RETURNS VOID
|
|
AS :MODULE_PATHNAME LANGUAGE C VOLATILE;
|
|
|
|
CREATE FUNCTION ts_bgw_params_create() RETURNS VOID
|
|
AS :MODULE_PATHNAME LANGUAGE C VOLATILE;
|
|
|
|
CREATE FUNCTION ts_bgw_params_destroy() RETURNS VOID
|
|
AS :MODULE_PATHNAME LANGUAGE C VOLATILE;
|
|
|
|
CREATE FUNCTION ts_bgw_params_reset_time(set_time BIGINT, wait BOOLEAN) RETURNS VOID
|
|
AS :MODULE_PATHNAME LANGUAGE C VOLATILE;
|
|
|
|
ALTER DATABASE :TEST_DBNAME OWNER TO :ROLE_DEFAULT_PERM_USER;
|
|
GRANT EXECUTE ON FUNCTION pg_reload_conf TO :ROLE_DEFAULT_PERM_USER;
|
|
GRANT ALTER SYSTEM, SET ON PARAMETER timescaledb.bgw_log_level TO :ROLE_DEFAULT_PERM_USER;
|
|
|
|
-- These are needed to set up the test scheduler
|
|
CREATE TABLE public.bgw_dsm_handle_store(handle BIGINT);
|
|
INSERT INTO public.bgw_dsm_handle_store VALUES (0);
|
|
SELECT ts_bgw_params_create();
|
|
|
|
-- Test scheduler automatically writes to this table by name, so
|
|
-- create it.
|
|
CREATE TABLE public.bgw_log(
|
|
msg_no INT,
|
|
mock_time BIGINT,
|
|
application_name TEXT,
|
|
msg TEXT
|
|
);
|
|
|
|
CREATE VIEW cleaned_bgw_log AS
|
|
SELECT msg_no, application_name,
|
|
regexp_replace(regexp_replace(msg, '(Wait until|started at|execution time|database) [0-9]+(\.[0-9]+)?', '\1 (RANDOM)', 'g'), 'background worker "[^"]+"','connection') AS msg
|
|
FROM bgw_log ORDER BY mock_time, application_name COLLATE "C", msg_no;
|
|
|
|
-- Remove all default jobs
|
|
DELETE FROM _timescaledb_config.bgw_job WHERE TRUE;
|
|
TRUNCATE _timescaledb_internal.bgw_job_stat;
|
|
|
|
--
|
|
-- Set bgw log level and reload config.
|
|
--
|
|
-- Debug messages should be in log now which it wasn't before.
|
|
--
|
|
-- We change user to make sure that granting SET and ALTER SYSTEM
|
|
-- privileges to the default user actually works.
|
|
--
|
|
SET ROLE :ROLE_DEFAULT_PERM_USER;
|
|
ALTER DATABASE :TEST_DBNAME SET timescaledb.bgw_log_level = 'DEBUG1';
|
|
SELECT pg_reload_conf();
|
|
|
|
RESET ROLE;
|
|
SELECT ts_bgw_params_reset_time(0, false);
|
|
INSERT INTO _timescaledb_config.bgw_job(
|
|
application_name,
|
|
schedule_interval,
|
|
max_runtime,
|
|
max_retries,
|
|
retry_period,
|
|
proc_schema,
|
|
proc_name,
|
|
owner,
|
|
scheduled,
|
|
fixed_schedule
|
|
) VALUES (
|
|
'test_job_1b', --application_name
|
|
INTERVAL '100ms', --schedule_interval
|
|
INTERVAL '100s', --max_runtime
|
|
5, --max_retries
|
|
INTERVAL '1s', --retry_period
|
|
'public', --proc_schema
|
|
'bgw_test_job_1', --proc_name
|
|
CURRENT_ROLE::regrole, --owner
|
|
TRUE, --scheduled
|
|
FALSE --fixed_schedule
|
|
) RETURNING id AS job_id \gset
|
|
|
|
SELECT ts_bgw_db_scheduler_test_run_and_wait_for_scheduler_finish(25, 0);
|
|
SELECT * FROM cleaned_bgw_log;
|
|
|
|
ALTER DATABASE :TEST_DBNAME RESET timescaledb.bgw_log_level;
|
|
SELECT pg_reload_conf();
|
|
|
|
TRUNCATE bgw_log;
|
|
SELECT ts_bgw_params_reset_time(0, false);
|
|
SELECT ts_bgw_db_scheduler_test_run_and_wait_for_scheduler_finish(25, 0);
|
|
SELECT * FROM cleaned_bgw_log;
|
|
|
|
SELECT delete_job(:job_id);
|
|
|
|
SET ROLE :ROLE_DEFAULT_PERM_USER;
|
|
|
|
-- Make sure we can set the variable using ALTER SYSTEM using the
|
|
-- previous grants. We don't bother about checking that it has an
|
|
-- effect here since we already knows it works from the above code.
|
|
ALTER SYSTEM SET timescaledb.bgw_log_level TO 'DEBUG2';
|
|
ALTER SYSTEM RESET timescaledb.bgw_log_level;
|