diff options
author | Marko Kreen | 2010-11-12 14:18:13 +0000 |
---|---|---|
committer | Marko Kreen | 2010-11-26 11:03:12 +0000 |
commit | 9dd82854ff8e1b15dedec5504315c99cb48f795e (patch) | |
tree | a1867016f1fd109888b5191a5d5453c838bb2418 | |
parent | 7d10b10c682f58751239c9bd81207a634a60e6a8 (diff) |
sql/pgq: sanity check against incorrect db state
-rw-r--r-- | sql/pgq/functions/pgq.next_batch.sql | 5 | ||||
-rw-r--r-- | sql/pgq/functions/pgq.ticker.sql | 8 |
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 |