On Fri, Feb 23, 2018 at 11:02:19PM +0900, Michael Paquier wrote: > Tsunakawa-san has proposed upthread to fix the problem by zero-ing the > page read in the WAL receiver. While I agree that zeroing the page is > the way to go, doing so in the WAL receiver does not take care of > problems with the frontends. I don't have the time to test that yet as > it is late here, but based on my code lookups tweaking > ReadPageInternal() so as the page is zero'ed correctly should do it for > all the cases. This way, the checks happening after a page read would > fail because of the zero'ed fields consistently instead of the garbage > accumulated.
I have been playing more with that this morning, and trying to tweak the XLOG reader so as the fetched page is zeroed where necessary does not help much. XLogReaderState->EndRecPtr is updated once the last record is set so it is possible to use it and zero the rest of the page which would prevent a lookup. But this is actually not wise for performance: - The data after EndRecPtr could be perfectly valid, so you could zero data which could be reused later. - It is necessary to drop the quick-exit checks in PageReadInternal. The WAL receiver approach also has a drawback. If WAL is streamed at full speed, then the primary sends data with a maximum of 6 WAL pages. When beginning streaming with a new segment, then the WAL sent stops at page boundary. But if you stop once in the middle of a page then you need to zero-fill the page until the current segment is finished streaming. So if the workload generates spiky WAL then the WAL receiver can would a lot of extra lseek() calls with the patch applied, while all the writes would be sequential on HEAD, so that's not performant-wise IMO. Another idea I am thinking about would be to zero-fill the segments when recycled instead of being just renamed when doing InstallXLogFileSegment(). This would also have the advantage of making the segments ahead more compressible, which is a gain for custom backups, and the WAL receiver does not need any tweaks as it would write the data on a clean file. Zero-filling the segments is done only when a new segment is created (see XLogFileInit). Each approach has its own cost. Thoughts? -- Michael
signature.asc
Description: PGP signature