blob: 5ddb26fa0b3f6a3c1341f83e139bc679e62d1a1a (
plain)
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
create or replace function pgq.maint_operations(out func_name text, out func_arg text)
returns setof record as $$
-- ----------------------------------------------------------------------
-- Function: pgq.maint_operations(0)
--
-- Returns list of functions to call for maintenance.
--
-- The goal is to avoid hardcoding them into maintenance process.
--
-- Function signature:
-- Function should take either 1 or 0 arguments and return 1 if it wants
-- to be called immediately again, 0 if not.
--
-- Returns:
-- func_name - Function to call
-- func_arg - Optional argument to function (queue name)
-- ----------------------------------------------------------------------
declare
ops text[];
nrot int4;
begin
-- rotate step 1
nrot := 0;
func_name := 'pgq.maint_rotate_tables_step1';
for func_arg in
select queue_name from pgq.queue
where queue_rotation_period is not null
and queue_switch_step2 is not null
and queue_switch_time + queue_rotation_period < current_timestamp
order by 1
loop
nrot := nrot + 1;
return next;
end loop;
-- rotate step 2
if nrot = 0 then
select count(1) from pgq.queue
where queue_rotation_period is not null
and queue_switch_step2 is null
into nrot;
end if;
if nrot > 0 then
func_name := 'pgq.maint_rotate_tables_step2';
func_arg := NULL;
return next;
end if;
-- check if extra field exists
perform 1 from pg_attribute
where attrelid = 'pgq.queue'::regclass
and attname = 'queue_extra_maint';
if found then
-- add extra ops
for func_arg, ops in
select q.queue_name, queue_extra_maint from pgq.queue q
where queue_extra_maint is not null
order by 1
loop
for i in array_lower(ops, 1) .. array_upper(ops, 1)
loop
func_name = ops[i];
return next;
end loop;
end loop;
end if;
-- vacuum tables
func_name := 'vacuum';
for func_arg in
select * from pgq.maint_tables_to_vacuum()
loop
return next;
end loop;
--
-- pgq_node & londiste
--
-- although they belong to queue_extra_maint, they are
-- common enough so its more effective to handle them here.
--
perform 1 from pg_proc p, pg_namespace n
where p.pronamespace = n.oid
and n.nspname = 'pgq_node'
and p.proname = 'maint_watermark';
if found then
func_name := 'pgq_node.maint_watermark';
for func_arg in
select n.queue_name
from pgq_node.node_info n
where n.node_type = 'root'
loop
return next;
end loop;
end if;
perform 1 from pg_proc p, pg_namespace n
where p.pronamespace = n.oid
and n.nspname = 'londiste'
and p.proname = 'root_check_seqs';
if found then
func_name := 'londiste.root_check_seqs';
for func_arg in
select distinct s.queue_name
from londiste.seq_info s, pgq_node.node_info n
where s.local
and n.node_type = 'root'
and n.queue_name = s.queue_name
loop
return next;
end loop;
end if;
perform 1 from pg_proc p, pg_namespace n
where p.pronamespace = n.oid
and n.nspname = 'londiste'
and p.proname = 'periodic_maintenance';
if found then
func_name := 'londiste.periodic_maintenance';
func_arg := NULL;
return next;
end if;
return;
end;
$$ language plpgsql;
|