summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Kreen2010-10-12 11:58:29 +0000
committerMarko Kreen2010-10-12 11:58:29 +0000
commit4c02f4d0ba3efad7d5b50ce4ce46d79a905547ca (patch)
tree54e8b0466a078ffaac9e27463451965756a6e80a
parent283c6e0135ba6f0c06d30725497fe4d81d05aae9 (diff)
move londiste & pgq_node maint into pgq.maint_operations
-rw-r--r--sql/pgq/functions/pgq.maint_operations.sql39
-rw-r--r--sql/pgq_node/expected/pgq_node_test.out12
-rw-r--r--sql/pgq_node/functions/pgq_node.maint_watermark.sql31
-rw-r--r--sql/pgq_node/sql/pgq_node_test.sql3
-rw-r--r--sql/pgq_node/structure/functions.sql3
5 files changed, 88 insertions, 0 deletions
diff --git a/sql/pgq/functions/pgq.maint_operations.sql b/sql/pgq/functions/pgq.maint_operations.sql
index d03b5bd6..f3b84420 100644
--- a/sql/pgq/functions/pgq.maint_operations.sql
+++ b/sql/pgq/functions/pgq.maint_operations.sql
@@ -67,6 +67,45 @@ begin
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 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 n
+ where s.local
+ and n.node_type = 'root'
+ and n.queue_name = s.queue_name
+ loop
+ return next;
+ end loop;
+ end if;
+
return;
end;
$$ language plpgsql;
diff --git a/sql/pgq_node/expected/pgq_node_test.out b/sql/pgq_node/expected/pgq_node_test.out
index e7c74d8c..47195a2a 100644
--- a/sql/pgq_node/expected/pgq_node_test.out
+++ b/sql/pgq_node/expected/pgq_node_test.out
@@ -84,6 +84,18 @@ select * from pgq_node.register_subscriber('aqueue', 'node3', 'node3_worker', nu
200 | Subscriber registered: node3 | 1
(1 row)
+select * from pgq_node.maint_watermark('aqueue');
+ maint_watermark
+-----------------
+ 0
+(1 row)
+
+select * from pgq_node.maint_watermark('aqueue-x');
+ maint_watermark
+-----------------
+ 0
+(1 row)
+
select * from pgq_node.get_consumer_info('aqueue');
consumer_name | provider_node | last_tick_id | paused | uptodate | cur_error
---------------+---------------+--------------+--------+----------+-----------
diff --git a/sql/pgq_node/functions/pgq_node.maint_watermark.sql b/sql/pgq_node/functions/pgq_node.maint_watermark.sql
new file mode 100644
index 00000000..cdf0c0c2
--- /dev/null
+++ b/sql/pgq_node/functions/pgq_node.maint_watermark.sql
@@ -0,0 +1,31 @@
+
+create or replace function pgq_node.maint_watermark(i_queue_name text)
+returns int4 as $$
+-- ----------------------------------------------------------------------
+-- Function: pgq_node.maint_watermark(1)
+--
+-- Move global watermark on root node.
+--
+-- Returns:
+-- 0 - tells pgqd to call just once
+-- ----------------------------------------------------------------------
+declare
+ _lag interval;
+begin
+ perform 1 from pgq_node.node_info
+ where queue_name = i_queue_name
+ and node_type = 'root'
+ for update;
+ if not found then
+ return 0;
+ end if;
+
+ select lag into _lag from pgq.get_consumer_info(i_queue_name, '.global_watermark');
+ if _lag >= '5 minutes'::interval then
+ perform pgq_node.set_global_watermark(i_queue_name, NULL);
+ end if;
+
+ return 0;
+end;
+$$ language plpgsql;
+
diff --git a/sql/pgq_node/sql/pgq_node_test.sql b/sql/pgq_node/sql/pgq_node_test.sql
index 3fc0b557..abe138a8 100644
--- a/sql/pgq_node/sql/pgq_node_test.sql
+++ b/sql/pgq_node/sql/pgq_node_test.sql
@@ -20,6 +20,9 @@ select * from pgq_node.create_node('aqueue', 'root', 'node1', 'node1_worker', nu
select * from pgq_node.register_subscriber('aqueue', 'node2', 'node2_worker', null);
select * from pgq_node.register_subscriber('aqueue', 'node3', 'node3_worker', null);
+select * from pgq_node.maint_watermark('aqueue');
+select * from pgq_node.maint_watermark('aqueue-x');
+
select * from pgq_node.get_consumer_info('aqueue');
select * from pgq_node.unregister_subscriber('aqueue', 'node3');
select queue_name, consumer_name, last_tick from pgq.get_consumer_info();
diff --git a/sql/pgq_node/structure/functions.sql b/sql/pgq_node/structure/functions.sql
index 9c77a4fb..74df04c3 100644
--- a/sql/pgq_node/structure/functions.sql
+++ b/sql/pgq_node/structure/functions.sql
@@ -39,3 +39,6 @@
\i functions/pgq_node.set_consumer_completed.sql
\i functions/pgq_node.set_consumer_error.sql
+-- Group: Maintenance operations
+\i functions/pgq_node.maint_watermark.sql
+