Re: [HACKERS] WAL logging problem in 9.4.3?
Kyotaro HORIGUCHI <horiguchi.kyotaro@lab.ntt.co.jp>
Attachments
- v11-0001-TAP-test-for-copy-truncation-optimization.patch (text/x-patch)
At Thu, 4 Apr 2019 10:52:59 -0400, Robert Haas <robertmhaas@gmail.com> wrote in <CA+TgmoZE0jW0jbQxAtoJgJNwrR1hyx3x8pUjQr=ggenLxnPoEQ@mail.gmail.com> > On Wed, Apr 3, 2019 at 10:03 PM Kyotaro HORIGUCHI > <horiguchi.kyotaro@lab.ntt.co.jp> wrote: > > > * Insert log record, using delete or insert instead of update log > > > * when only one of the two buffers needs WAL-logging. If this were a > > > * HOT-update, redoing the WAL record would result in a broken > > > * hot-chain. However, that never happens because updates complete on > > > * a single page always use log_update. > > It makes sense grammatically, but I'm not sure I believe that it's Great to hear that! I rewrote it as the following. + * Insert log record. When we are not running WAL-skipping, always use + * update log. Otherwise use delete or insert log instead when only + * one of the two buffers needs WAL-logging. If this were a + * HOT-update, redoing the WAL record would result in a broken + * hot-chain. However, that never happens because updates complete on + * a single page always use log_update. + * + * Using delete or insert log in place of udpate log leads to + * inconsistent series of WAL records. But note that WAL-skipping + * happens only when we are updating a tuple in a relation that has + * been create in the same transaction. Once commited, the WAL records + * recovers the same state of the relation as the synced state at the + * commit. Or the maybe-broken relation due to a crash before commit + * will be removed in recovery. > sound technically. Even though it's only used in the non-HOT case, > it's still important that the CTID, XMIN, and XMAX fields are set > correctly during both normal operation and recovery. log_heap_delete()/log_heap_update() record the infomasks of the deleted tuple as is. Xmax is stored from the same variable. offnum is taken from the deleted tuple and buffer is registered and xlrec.flags is set to the same value. As the result Xmax, infomasks and ctid are restored to the same state by heap_xlog_xlog_delete(). I didn't add a comment about that. log_heap_insert()/log_heap_update() record the infomasks of the inserted tuple as is. Xmin/Cmin and ctid related info are handled the same way. But log_heap_insert() assumes that Xmax = invalid. But that happens only when another transaction can see it, which is not the case here. I added a command and assertion before calling log_heap_insert(). + * Coming here means that the old tuple is invisible and + * inoperable to another transaction. So xmax_new_tuple is + * expected to be InvalidTransactionId here. + */ + Assert (xmax_new_tuple == InvalidTransactionId); + recptr = log_heap_insert(relation, buffer, newtup, I noticed that I accidentally moved log_heap_new_cid stuff to log_heap_insert/delete(). I restored them. The attached v11 is the new version addressing the aboves and rebased. regards. -- Kyotaro Horiguchi NTT Open Source Software Center
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