> > The checksums patch also introduces another behavior into > > SetBufferCommitInfoNeedsSave, which is to write an XLOG_HINT WAL record > > if checksums are enabled (to avoid torn page hazards). That's only > > necessary for changes where the caller does not write WAL itself and > > doesn't bump the LSN of the data page. (There's a reason the caller > > can't easily write the XLOG_HINT WAL itself.) So, we could introduce > > another flag "needsWAL" that would control whether we write the > > XLOG_HINT WAL or not (only applies with checksums on, of course). > > That wouldn't work because it can't know the exact answer to that, but > the way the patch does this is already correct.
The name I chose was poor, but the flag should mean "the caller does not write WAL associated with this action". If that flag is true, and if checksums are enabled, then it would do an XLogInsert, which may write WAL (depending on the LSN check). That part of the patch is correct currently, but the problem is with updates to PD_ALL_VISIBLE. Let me try to explain again: Calls to PageSetAllVisible are not directly associated with a WAL action, but they are associated with a call to MarkBufferDirty and do have an exclusive content lock on the buffer. There's a torn page hazard there for checksums, because without any WAL action associated with the data page, there is no backup page. One idea might be to use SetBufferCommitInfoNeedsSave (which will write WAL if necessary) instead of MarkBufferDirty. But that is unsafe, because it might not actually mark the buffer dirty due to a race (documented in SetBufferCommitInfoNeedsSave). So that's why I wanted to refactor MarkBufferDirty/SetBufferCommitInfoNeedsSave, to separate the concept that it may need a WAL record from the concept that actually dirtying the page is optional. Another idea is to make the WAL action for visibilitymap_set have another item in the chain pointing to the heap buffer, and bump the heap LSN. Regards, Jeff Davis -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers