1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-02 09:02:37 +03:00

Update comments on rd_newRelfilenodeSubid.

Ensure comments accurately reflect state of code
given new understanding, and recent changes.
Include example code from Noah Misch to
illustrate how rd_newRelfilenodeSubid can be
reset deterministically. No code changes.
This commit is contained in:
Simon Riggs
2012-12-24 17:07:06 +00:00
parent ae9aba69a8
commit c2b3218064
2 changed files with 26 additions and 8 deletions

View File

@ -1963,8 +1963,18 @@ CopyFrom(CopyState cstate)
* routine first.
*
* As mentioned in comments in utils/rel.h, the in-same-transaction test
* is not completely reliable, since in rare cases rd_createSubid or
* rd_newRelfilenodeSubid can be cleared before the end of the transaction.
* is not always set correctly, since in rare cases rd_newRelfilenodeSubid
* can be cleared before the end of the transaction. The exact case is
* when a relation sets a new relfilenode twice in same transaction, yet
* the second one fails in an aborted subtransaction, e.g.
*
* BEGIN;
* TRUNCATE t;
* SAVEPOINT save;
* TRUNCATE t;
* ROLLBACK TO save;
* COPY ...
*
* However this is OK since at worst we will fail to make the optimization.
*
* Also, if the target file is new-in-transaction, we assume that checking
@ -1994,10 +2004,9 @@ CopyFrom(CopyState cstate)
* which subtransaction created it is crucial for correctness
* of this optimisation.
*
* Note that because the test is unreliable in case of relcache reset
* we cannot guarantee that we can honour the request to FREEZE.
* If we cannot honour the request we do so silently, firstly to
* avoid noise for the user and also to avoid obscure test failures.
* As noted above rd_newRelfilenodeSubid is not set in all cases
* where we can apply the optimization, so in those rare cases
* where we cannot honour the request we do so silently.
*/
if (cstate->freeze &&
ThereAreNoPriorRegisteredSnapshots() &&