summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Pihlak2009-04-08 15:37:45 +0000
committerMartin Pihlak2009-04-08 15:37:45 +0000
commit17a1ad8e3639e882ad779486e14b4dbc89889277 (patch)
tree6d4ec4c5ec6e927254ea04dbd33b3b2e067363a1
parent3893df17c4ad5cefd148448b5c2d17c6f1ac6fed (diff)
Separated queue pause from external ticker.
-rwxr-xr-xpython/newadm.py4
-rw-r--r--sql/pgq/functions/pgq.force_tick.sql3
-rw-r--r--sql/pgq/functions/pgq.get_queue_info.sql19
-rw-r--r--sql/pgq/functions/pgq.set_queue_config.sql1
-rw-r--r--sql/pgq/functions/pgq.ticker.sql15
-rw-r--r--sql/pgq/structure/tables.sql2
-rw-r--r--sql/ticker/connection.c4
7 files changed, 32 insertions, 16 deletions
diff --git a/python/newadm.py b/python/newadm.py
index bbe91a9d..01f1e00e 100755
--- a/python/newadm.py
+++ b/python/newadm.py
@@ -282,7 +282,7 @@ w_qargs = WList(
SWord('idle_period', EQ(Value(w_qargs2, name = 'ticker_idle_period'))),
SWord('max_count', EQ(Value(w_qargs2, name = 'ticker_max_count'))),
SWord('max_lag', EQ(Value(w_qargs2, name = 'ticker_max_lag'))),
- SWord('paused', EQ(Value(w_qargs2, name = 'external_ticker'))))
+ SWord('paused', EQ(Value(w_qargs2, name = 'ticker_paused'))))
w_qargs2.set_real(WList(
w_done,
@@ -716,7 +716,7 @@ class AdminConsole:
"queue_ticker_max_count as max_cnt",
"queue_ticker_max_lag as max_lag",
"queue_ticker_idle_period as idle_period",
- "queue_external_ticker as paused",
+ "queue_ticker_paused as paused",
"ticker_lag",
]
pfx = "select " + ",".join(fields)
diff --git a/sql/pgq/functions/pgq.force_tick.sql b/sql/pgq/functions/pgq.force_tick.sql
index c1550d9a..6cd1ecc9 100644
--- a/sql/pgq/functions/pgq.force_tick.sql
+++ b/sql/pgq/functions/pgq.force_tick.sql
@@ -30,7 +30,8 @@ begin
+ queue_ticker_max_count * 2 + 1000) as tmp
into q from pgq.queue
where queue_name = i_queue_name
- and not queue_external_ticker;
+ and not queue_external_ticker
+ and not queue_ticker_paused;
--if not found then
-- raise notice 'queue not found or ticks not allowed';
diff --git a/sql/pgq/functions/pgq.get_queue_info.sql b/sql/pgq/functions/pgq.get_queue_info.sql
index 14906770..dcc34c2c 100644
--- a/sql/pgq/functions/pgq.get_queue_info.sql
+++ b/sql/pgq/functions/pgq.get_queue_info.sql
@@ -5,6 +5,7 @@ create or replace function pgq.get_queue_info(
out queue_rotation_period interval,
out queue_switch_time timestamptz,
out queue_external_ticker boolean,
+ out queue_ticker_paused boolean,
out queue_ticker_max_count integer,
out queue_ticker_max_lag interval,
out queue_ticker_idle_period interval,
@@ -20,12 +21,14 @@ returns setof record as $$
-- ----------------------------------------------------------------------
begin
for queue_name, queue_ntables, queue_cur_table, queue_rotation_period,
- queue_switch_time, queue_external_ticker, queue_ticker_max_count,
- queue_ticker_max_lag, queue_ticker_idle_period, ticker_lag
+ queue_switch_time, queue_external_ticker, queue_ticker_paused,
+ queue_ticker_max_count, queue_ticker_max_lag, queue_ticker_idle_period,
+ ticker_lag
in select
f.queue_name, f.queue_ntables, f.queue_cur_table, f.queue_rotation_period,
- f.queue_switch_time, f.queue_external_ticker, f.queue_ticker_max_count,
- f.queue_ticker_max_lag, f.queue_ticker_idle_period, f.ticker_lag
+ f.queue_switch_time, f.queue_external_ticker, f.queue_ticker_paused,
+ f.queue_ticker_max_count, f.queue_ticker_max_lag, f.queue_ticker_idle_period,
+ f.ticker_lag
from pgq.get_queue_info(null) f
loop
return next;
@@ -42,6 +45,7 @@ create or replace function pgq.get_queue_info(
out queue_rotation_period interval,
out queue_switch_time timestamptz,
out queue_external_ticker boolean,
+ out queue_ticker_paused boolean,
out queue_ticker_max_count integer,
out queue_ticker_max_lag interval,
out queue_ticker_idle_period interval,
@@ -57,12 +61,13 @@ returns setof record as $$
-- ----------------------------------------------------------------------
begin
for queue_name, queue_ntables, queue_cur_table, queue_rotation_period,
- queue_switch_time, queue_external_ticker, queue_ticker_max_count,
- queue_ticker_max_lag, queue_ticker_idle_period, ticker_lag
+ queue_switch_time, queue_external_ticker, queue_ticker_paused,
+ queue_ticker_max_count, queue_ticker_max_lag, queue_ticker_idle_period,
+ ticker_lag
in select
q.queue_name, q.queue_ntables, q.queue_cur_table,
q.queue_rotation_period, q.queue_switch_time,
- q.queue_external_ticker,
+ q.queue_external_ticker, q.queue_ticker_paused,
q.queue_ticker_max_count, q.queue_ticker_max_lag,
q.queue_ticker_idle_period,
(select current_timestamp - tick_time
diff --git a/sql/pgq/functions/pgq.set_queue_config.sql b/sql/pgq/functions/pgq.set_queue_config.sql
index dce20f89..7a14f005 100644
--- a/sql/pgq/functions/pgq.set_queue_config.sql
+++ b/sql/pgq/functions/pgq.set_queue_config.sql
@@ -38,6 +38,7 @@ begin
'queue_ticker_max_count',
'queue_ticker_max_lag',
'queue_ticker_idle_period',
+ 'queue_ticker_paused',
'queue_rotation_period',
'queue_external_ticker')
then
diff --git a/sql/pgq/functions/pgq.ticker.sql b/sql/pgq/functions/pgq.ticker.sql
index ebfc907c..01391e77 100644
--- a/sql/pgq/functions/pgq.ticker.sql
+++ b/sql/pgq/functions/pgq.ticker.sql
@@ -17,9 +17,10 @@ begin
select queue_id, i_tick_id, i_orig_timestamp, i_event_seq
from pgq.queue
where queue_name = i_queue_name
- and queue_external_ticker;
+ and queue_external_ticker
+ and not queue_ticker_paused;
if not found then
- raise exception 'queue not found or external ticker disabled: %', i_queue_name;
+ raise exception 'queue not found or ticker disabled: %', i_queue_name;
end if;
-- make sure seqs stay current
@@ -57,7 +58,8 @@ begin
select queue_id, queue_tick_seq, queue_external_ticker,
queue_ticker_max_count, queue_ticker_max_lag,
queue_ticker_idle_period, queue_event_seq,
- pgq.seq_getval(queue_event_seq) as event_seq
+ pgq.seq_getval(queue_event_seq) as event_seq,
+ queue_ticker_paused
into q
from pgq.queue where queue_name = i_queue_name;
if not found then
@@ -68,6 +70,10 @@ begin
raise exception 'This queue has external tick source.';
end if;
+ if q.queue_ticker_paused then
+ raise exception 'Ticker has been paused for this queue';
+ end if;
+
-- load state from last tick
select now() - tick_time as lag,
q.event_seq - tick_event_seq as new_events,
@@ -120,7 +126,7 @@ create or replace function pgq.ticker() returns bigint as $$
-- ----------------------------------------------------------------------
-- Function: pgq.ticker(0)
--
--- Creates ticks for all queues which dont have external ticker.
+-- Creates ticks for all unpaused queues which dont have external ticker.
--
-- Returns:
-- Number of queues that were processed.
@@ -133,6 +139,7 @@ begin
for q in
select queue_name from pgq.queue
where not queue_external_ticker
+ and not queue_ticker_paused
order by queue_name
loop
if pgq.ticker(q.queue_name) > 0 then
diff --git a/sql/pgq/structure/tables.sql b/sql/pgq/structure/tables.sql
index 6e88c7c5..f1a2db3c 100644
--- a/sql/pgq/structure/tables.sql
+++ b/sql/pgq/structure/tables.sql
@@ -59,6 +59,7 @@ create table pgq.consumer (
-- queue_switch_step2 - tx after rotation was committed
-- queue_switch_time - time when switch happened
-- queue_external_ticker - ticks come from some external sources
+-- queue_ticker_paused - ticker is paused
-- queue_disable_insert - disallow pgq.insert_event()
-- queue_ticker_max_count - batch should not contain more events
-- queue_ticker_max_lag - events should not age more
@@ -81,6 +82,7 @@ create table pgq.queue (
queue_external_ticker boolean not null default false,
queue_disable_insert boolean not null default false,
+ queue_ticker_paused boolean not null default false,
queue_ticker_max_count integer not null default 500,
queue_ticker_max_lag interval not null default '3 seconds',
diff --git a/sql/ticker/connection.c b/sql/ticker/connection.c
index bdd3a4d7..20a5c217 100644
--- a/sql/ticker/connection.c
+++ b/sql/ticker/connection.c
@@ -12,6 +12,8 @@
#define W_SOCK 1
#define W_TIME 2
+typedef void (*libev_cb)(int sock, short flags, void *arg);
+
struct PgSocket {
struct event ev;
@@ -22,8 +24,6 @@ struct PgSocket {
void *handler_arg;
};
-typedef void (*libev_cb)(int sock, short flags, void *arg);
-
static void send_event(struct PgSocket *db, enum PgEvent ev)
{
db->handler_func(db, db->handler_arg, ev, NULL);