Re: snapbuild woes
Petr Jelinek <petr.jelinek@2ndquadrant.com>
From: Petr Jelinek <petr.jelinek@2ndquadrant.com>
To: Andres Freund <andres@anarazel.de>
Cc: PostgreSQL-development <pgsql-hackers@postgresql.org>,
Erik Rijkers <er@xs4all.nl>, Robert Haas <robertmhaas@gmail.com>,
Craig Ringer <craig@2ndquadrant.com>
Date: 2017-05-01T09:09:44Z
Lists: pgsql-hackers
On 01/05/17 10:03, Andres Freund wrote: > On 2017-05-01 03:54:49 +0200, Petr Jelinek wrote: >> I agree with adding running, I think that's good thing even for the per >> transaction tracking and snapshot exports - we could use the newly added >> field to get rid of the issue we have with 'snapshot too large' when >> there were many aborted transactions while we waited for running ones to >> finish. > > I'm not sure of that - what I was proposing would only track this for > the ->running substructure. How'd that help? > Well not as is, but it's a building block for it. > >> But, I still think we need to restart the tracking after new >> xl_running_xacts. Reason for that is afaics any of the catalog snapshots >> that we assigned to transactions at the end of SnapBuildCommitTxn might >> be corrupted otherwise as they were built before we knew one of the >> supposedly running txes was actually already committed and that >> transaction might have done catalog changes. > > I'm afraid you're right. But I think this is even more complicated: The > argument in your version that this can only happen once, seems to also > be holey: Just imagine a pg_usleep(3000 * 1000000) right before > ProcArrayEndTransaction() and enjoy the picture. > Well yes, transaction can in theory have written commit/abort xlog record and stayed in proc for more than single xl_running_xacts write. But then the condition which we test that the new xl_running_xacts has bigger xmin than the previously tracked one's xmax would not be satisfied and we would not enter the relevant code path yet. So I think we should not be able to get any xids we didn't see. But we have to restart tracking from beginning (after first checking if we didn't already see anything that the xl_running_xacts considers as running), that's what my code did. > Wonder if we should just (re-)add a stage between SNAPBUILD_START and > SNAPBUILD_FULL_SNAPSHOT. Enter SNAPBUILD_BUILD_INITIAL_SNAPSHOT at the > first xl_running_xacts, wait for all transactions to end with my > approach, while populating SnapBuild->committed, only then start > collecting changes for transactions (i.e. return true from > SnapBuildProcessChange()), return true once all xacts have finished > again. That'd presumably be a bit easier to understand, more robust - > and slower. > That would also work, but per above, I don't understand why it's needed. -- Petr Jelinek http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
Commits
-
Fix thinko introduced in 2bef06d516460 et al.
- d68742562ca4 9.4.13 landed
- 869a5869e5ba 9.5.8 landed
- 32d7480e02ee 9.6.4 landed
- 5af4456a5647 10.0 landed
-
Avoid superfluous work for commits during logical slot creation.
- fa9207c7415c 9.5.8 landed
- bd619fcfe046 9.6.4 landed
- 524dbc14335c 10.0 landed
- 2dca50b764d4 9.4.13 landed
-
Fix race condition leading to hanging logical slot creation.
- b64a68e3680a 9.5.8 landed
- 955a684e0401 10.0 landed
- 79abd23db1e9 9.4.13 landed
- 75784859cda2 9.6.4 landed
-
Don't use on-disk snapshots for exported logical decoding snapshot.
- b6ecf26ccc2b 9.4.12 landed
- 54270d7ebcdc 9.5.7 landed
- 29e8c881dd07 9.6.3 landed
- 56e19d938dd1 10.0 landed
-
Preserve required !catalog tuples while computing initial decoding snapshot.
- 5da64613875d 9.4.12 landed
- 47f896b5c2ec 9.5.7 landed
- 2bef06d51646 10.0 landed
- 28afff347a5d 9.6.3 landed