Re: WAL logging problem in 9.4.3?
Andres Freund <andres@anarazel.de>
On 2015-07-10 11:50:33 +0300, Heikki Linnakangas wrote: > On 07/10/2015 02:06 AM, Tom Lane wrote: > >Andres Freund <andres@anarazel.de> writes: > >>On 2015-07-06 11:49:54 -0400, Tom Lane wrote: > >>>Rather than reverting cab9a0656c36739f, which would re-introduce a > >>>different performance problem, perhaps we could have COPY create a new > >>>relfilenode when it does this. That should be safe if the table was > >>>previously empty. > > > >>I'm not convinced that cab9a0656c36739f needs to survive in that > >>form. To me only allowing one COPY to benefit from the wal_level = > >>minimal optimization has a significantly higher cost than > >>cab9a0656c36739f. > > > >What evidence have you got to base that value judgement on? > > > >cab9a0656c36739f was based on an actual user complaint, so we have good > >evidence that there are people out there who care about the cost of > >truncating a table many times in one transaction. > > Yeah, if we specifically made that case cheap, in response to a complaint, > it would be a regression to make it expensive again. We might get away with > it in a major version, but would hate to backpatch that. Sure. But making COPY slower would also be one. Of a longer standing behaviour, with massively bigger impact if somebody relies on it? I mean a new relfilenode includes a couple heap and storage options. Missing the skip wal optimization can easily double or triple COPY durations. I generally find it to be very dubious to re-use a relfilenode after a truncation. I bet most hackers didn't ever know we ever did that, and the rest probably forgot it. We can still retain a portion of the optimizations from cab9a0656c36739f - there's no need to keep the old relfilenode's contents around after all. > >>My tentative guess is that the best course is to > >>a) Make heap_truncate_one_rel() create a new relfeilnode. That fixes the > >> truncation replay issue. > >>b) Force new pages to be used when using the heap_sync mode in > >> COPY. That avoids the INIT danger you found. It seems rather > >> reasonable to avoid using pages that have already been the target of > >> WAL logging here in general. > > > >And what reason is there to think that this would fix all the problems? > >We know of those two, but we've not exactly looked hard for other cases. > > Hmm. Perhaps that could be made to work, but it feels pretty fragile. It does. I'm not very happy about this mess. > For > example, you could have an insert trigger on the table that inserts > additional rows to the same table, and those inserts would be intermixed > with the rows inserted by COPY. That should be fine? As long as copy only uses new pages INSERT can use the same ones without problem. I think... > Full-page images in general are a problem. With the above rules I don't think it'd be. They'd contain the previous contents, and we'll not target them again with COPY. > I think we should > 1. reliably and explicitly keep track of whether we've WAL-logged any > TRUNCATE, INSERT/UPDATE+INIT, or any other full-page-logging operations on > the relation, and > 2. make sure we never skip WAL-logging again if we have. > > Let's add a flag, rd_skip_wal_safe, to RelationData that's initially set > when a new relfilenode is created, i.e. whenever rd_createSubid or > rd_newRelfilenodeSubid is set. Whenever a TRUNCATE or a full-page image > (including INSERT/UPDATE+INIT) is WAL-logged, clear the flag. In copy.c, > only skip WAL-logging if the flag is still set. To deal with the case that > the flag gets cleared in the middle of COPY, also check the flag whenever > we're about to skip WAL-logging in heap_insert, and if it's been cleared, > ignore the HEAP_INSERT_SKIP_WAL option and WAL-log anyway. Am I missing something or will this break the BEGIN; TRUNCATE; COPY; pattern we use ourselves and have suggested a number of times ? Andres
Commits
-
Add perl2host call missing from a new test file.
- 70de4e950c3b 13.0 landed
-
Skip WAL for new relfilenodes, under wal_level=minimal.
- c6b92041d385 13.0 landed
- 9db4b9da2801 9.5.22 landed
- a653bd8aa76e 9.6.18 landed
- 9d6215205e5a 10.13 landed
- 03b89f1949a9 11.8 landed
- e4b0a02ef8c8 12.3 landed
- cb2fd7eac285 13.0 landed
-
Revert "Skip WAL for new relfilenodes, under wal_level=minimal."
- b31e96ba420f 9.5.22 landed
- 348f15e22e94 9.6.18 landed
- 0a6c9c66da26 10.13 landed
- 63631ee64f84 12.3 landed
- 2fbdebc248ec 11.8 landed
- de9396326edc 13.0 landed
-
Back-patch log_newpage_range().
- e0dd086414f7 9.5.22 landed
- 14d2bb4941e6 9.6.18 landed
- 43434ed94d80 10.13 landed
- ae86e46c3b7b 11.8 landed
-
During heap rebuild, lock any TOAST index until end of transaction.
- a8f754aea014 9.6.18 landed
- 978da2a95597 9.5.22 landed
- 78a34c68920a 10.13 landed
- 88b3a6cd2623 12.3 landed
- 4433c6e8c0a5 11.8 landed
- e629a01f6973 13.0 landed
-
In log_newpage_range(), heed forkNum and page_std arguments.
- a5abec521c5d 12.3 landed
- d3e572855be1 13.0 landed
-
Back-patch src/test/recovery and PostgresNode from 9.6 to 9.5.
- 12034da6cc39 9.5.22 landed
-
Reduce pg_ctl's reaction time when waiting for postmaster start/stop.
- c61559ec3a41 10.0 cited
-
Accelerate end-of-transaction dropping of relations
- 279628a0a7cf 9.3.0 cited
-
Redesign the planner's handling of index-descent cost estimation.
- 31f38f28b00c 9.3.0 cited
-
Make TRUNCATE do truncate-in-place when processing a relation that was created
- cab9a0656c36 9.0.0 cited