mirror of
https://github.com/postgres/postgres.git
synced 2025-04-24 10:47:04 +03:00
Ignore CatalogSnapshot when checking COPY FREEZE prerequisites.
This restores the ability, essentially lost in commit ffaa44cb559db332baeee7d25dedd74a61974203, to use COPY FREEZE under REPEATABLE READ isolation. Back-patch to 9.4, like that commit. Reviewed by Tom Lane. Discussion: https://postgr.es/m/CA+TgmoahWDm-7fperBxzU9uZ99LPMUmEpSXLTw9TmrOgzwnORw@mail.gmail.com
This commit is contained in:
parent
86bc521811
commit
bab3a714b6
@ -2394,13 +2394,25 @@ CopyFrom(CopyState cstate)
|
||||
/*
|
||||
* Optimize if new relfilenode was created in this subxact or one of its
|
||||
* committed children and we won't see those rows later as part of an
|
||||
* earlier scan or command. This ensures that if this subtransaction
|
||||
* aborts then the frozen rows won't be visible after xact cleanup. Note
|
||||
* earlier scan or command. The subxact test ensures that if this subxact
|
||||
* aborts then the frozen rows won't be visible after xact cleanup. Note
|
||||
* that the stronger test of exactly which subtransaction created it is
|
||||
* crucial for correctness of this optimization.
|
||||
* crucial for correctness of this optimization. The test for an earlier
|
||||
* scan or command tolerates false negatives. FREEZE causes other sessions
|
||||
* to see rows they would not see under MVCC, and a false negative merely
|
||||
* spreads that anomaly to the current session.
|
||||
*/
|
||||
if (cstate->freeze)
|
||||
{
|
||||
/*
|
||||
* Tolerate one registration for the benefit of FirstXactSnapshot.
|
||||
* Scan-bearing queries generally create at least two registrations,
|
||||
* though relying on that is fragile, as is ignoring ActiveSnapshot.
|
||||
* Clear CatalogSnapshot to avoid counting its registration. We'll
|
||||
* still detect ongoing catalog scans, each of which separately
|
||||
* registers the snapshot it uses.
|
||||
*/
|
||||
InvalidateCatalogSnapshot();
|
||||
if (!ThereAreNoPriorRegisteredSnapshots() || !ThereAreNoReadyPortals())
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_TRANSACTION_STATE),
|
||||
|
@ -1645,6 +1645,14 @@ DeleteAllExportedSnapshotFiles(void)
|
||||
FreeDir(s_dir);
|
||||
}
|
||||
|
||||
/*
|
||||
* ThereAreNoPriorRegisteredSnapshots
|
||||
* Is the registered snapshot count less than or equal to one?
|
||||
*
|
||||
* Don't use this to settle important decisions. While zero registrations and
|
||||
* no ActiveSnapshot would confirm a certain idleness, the system makes no
|
||||
* guarantees about the significance of one registered snapshot.
|
||||
*/
|
||||
bool
|
||||
ThereAreNoPriorRegisteredSnapshots(void)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user