Race condition between hot_standby_feedback and wal_receiver_status_interval ? - Mailing list pgsql-general

From Stuart Bishop
Subject Race condition between hot_standby_feedback and wal_receiver_status_interval ?
Date
Msg-id CADmi=6MpObz-wtLiQ3PjDe0AWyFoJNEujZnW3in23YdnGYKTOw@mail.gmail.com
Whole thread Raw
List pgsql-general
Hi.

I am running streaming replication with PostgreSQL 9.1.5, and using
hot_standby_feedback=on.

Per previous messages, I'm still experiencing query cancellations on
the hot standbys triggered by vacuums on the primary

(http://postgresql.1045698.n5.nabble.com/pg-dump-on-hot-standby-canceled-despite-hot-standby-feedback-on-td5719753.html).

pg_dump: Error message from server: ERROR:  canceling statement due to
conflict with recovery
DETAIL:  User was holding shared buffer pin for too long.
pg_dump: The command was: COPY public.webcatalog_machine (id,
owner_id, uuid, hostname, packages_checksum, package_list,
logo_checksum) TO stdout;

pg_dump: Error message from server: ERROR:  canceling statement due to
conflict with recovery
DETAIL:  User was holding a relation lock for too long.


Looking at the documentation for hot_standby_feedback, "this parameter
can be used to eliminate query cancels caused by cleanup records", but
"feedback messages will not be sent more frequently than once per
wal_receiver_status_interval".

I'm wondering if there is a race condition here, where if vacuum kicks
in on the primary before feedback information has been sent, then
records could be removed that are still needed on the hot standby.

My initial thought was vacuum_defer_cleanup_age could be used to check
this, but it describes itself correctly as fairly useless since it is
set in transactions rather than with a time interval and recommends
using hot_standby_feedback as an alternative.




--
Stuart Bishop <stuart@stuartbishop.net>
http://www.stuartbishop.net/


pgsql-general by date:

Previous
From: Devrim GÜNDÜZ
Date:
Subject: Re: CentOS initd Script
Next
From: Devrim GÜNDÜZ
Date:
Subject: Re: CentOS initd Script