On Monday, November 12, 2018 1:08:37 PM EST Tom Lane wrote: > Looking through the thread, it seems like there's a pretty fundamental > design issue that hasn't been resolved, namely whether and how this > ought to interact with default_transaction_read_only. The patch as > it stands seems to be trying to implement the definition that the > transmittable variable session_read_only is equal to > "!(DefaultXactReadOnly || RecoveryInProgress())". I doubt that > that's a good idea. In the first place, it's not at all clear that > such a flag is sufficient for all use-cases. In the second, it's > somewhere between difficult and impossible to correctly implement > GUCs that are interdependent in that way; the current patch certainly > fails to do so. (It will not correctly track intra-session changes > to DefaultXactReadOnly, for instance.) > > I think that we'd be better off maintaining a strict separation > between "in hot standby" and default_transaction_read_only. If there > are use cases in which people would like to reject connections based > on either one being true, let's handle that by marking them both > GUC_REPORT, and having libpq check both. (So there need to be two > flavors of target-session-attrs libpq parameter, depending on whether > you want "in hot standby" or "currently read only" to be checked.)
I agree that the original design with the separate "in_hot_standby" GUC is better. Hot standby and read-only session are distinct modes, not all commands that are OK in a read-only session will succeed on a hot- standby backend. > I'm also not terribly happy with the patch adding a whole new > cross-backend signaling mechanism for this; surely we don't really > need that. Perhaps it'd be sufficient to transmit SIGHUP and embed > the check for "just exited hot standby" in the handling for that? That seems doable. Is there an existing check that is a good candidate for "just exited hot standby"? Elvis