summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Kreen2010-11-12 14:18:13 +0000
committerMarko Kreen2010-11-26 11:03:12 +0000
commit9dd82854ff8e1b15dedec5504315c99cb48f795e (patch)
treea1867016f1fd109888b5191a5d5453c838bb2418
parent7d10b10c682f58751239c9bd81207a634a60e6a8 (diff)
sql/pgq: sanity check against incorrect db state
-rw-r--r--sql/pgq/functions/pgq.next_batch.sql5
-rw-r--r--sql/pgq/functions/pgq.ticker.sql8
2 files changed, 12 insertions, 1 deletions
diff --git a/sql/pgq/functions/pgq.next_batch.sql b/sql/pgq/functions/pgq.next_batch.sql
index dbbefad4..017fe8ff 100644
--- a/sql/pgq/functions/pgq.next_batch.sql
+++ b/sql/pgq/functions/pgq.next_batch.sql
@@ -152,6 +152,11 @@ begin
raise exception '%', errmsg;
end if;
+ -- sanity check
+ if prev_tick_id is null then
+ raise exception 'PgQ corruption: Consumer % on queue % does not see tick %', i_consumer_name, i_queue_name, prev_tick_id;
+ end if;
+
-- has already active batch
if batch_id is not null then
return;
diff --git a/sql/pgq/functions/pgq.ticker.sql b/sql/pgq/functions/pgq.ticker.sql
index 01391e77..f8a27ed9 100644
--- a/sql/pgq/functions/pgq.ticker.sql
+++ b/sql/pgq/functions/pgq.ticker.sql
@@ -77,7 +77,7 @@ begin
-- load state from last tick
select now() - tick_time as lag,
q.event_seq - tick_event_seq as new_events,
- tick_id, tick_time
+ tick_id, tick_time, txid_snapshot_xmax(tick_snapshot) as sxmax
into state
from pgq.tick
where tick_queue = q.queue_id
@@ -85,6 +85,12 @@ begin
limit 1;
if found then
+ if state.new_events < 0 or
+ state.sxmax > txid_snapshot_xmax(txid_current_snapshot())
+ then
+ raise exception 'Invalid PgQ state, event seq or txids backwards';
+ end if;
+
if state.new_events > 0 then
-- there are new events, should we wait a bit?
if state.new_events < q.queue_ticker_max_count