On Sat, Dec 30, 2017 at 5:32 AM, Simon Riggs <si...@2ndquadrant.com> wrote: > So we can't completely remove xl_prev field, without giving up some > functionality. But we don't really need to store the 8-byte previous > WAL pointer in order to detect torn pages. Something else which can > tell us that the WAL record does not belong to current WAL segno would > be enough as well. I propose that we replace it with a much smaller > 2-byte field (let's call it xl_walid). The "xl_walid" (or whatever we > decide to call it) is the low order 16-bits of the WAL segno to which > the WAL record belongs. While reading WAL, we always match that the > "xl_walid" value stored in the WAL record matches with the current WAL > segno's lower order 16-bits and if not, then consider that as the end > of the stream. > > For this to work, we must ensure that WAL files are either recycled in > such a way that the "xl_walid" of the previous (to be recycled) WAL > differs from the new WAL or we zero-out the new WAL file. Seems quite > easy to do with the existing infrastructure.
I have some reservations about whether this makes the mechanism less reliable. It seems that an 8-byte field would have almost no chance of matching by accident even if the location was filled with random bytes, but with a 2-byte field it's not that unlikely. Of course, we also have xl_crc, so I'm not sure whether there's any chance of real harm... -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company