Re: [HACKERS] Full page writes improvement, code update - Mailing list pgsql-patches

From Zeugswetter Andreas ADI SD
Subject Re: [HACKERS] Full page writes improvement, code update
Date
Msg-id E1539E0ED7043848906A8FF995BDA57901E7BEBE@m0143.s-mxs.net
Whole thread Raw
In response to Re: [HACKERS] Full page writes improvement, code update  (Koichi Suzuki <suzuki.koichi@oss.ntt.co.jp>)
Responses Re: [HACKERS] Full page writes improvement, code update
Re: [HACKERS] Full page writes improvement, code update
List pgsql-patches
> > Yup, this is a good summary.
> >
> > You say you need to remove the optimization that avoids the logging
of
> > a new tuple because the full page image exists.
> > I think we must already have the info in WAL which tuple inside the
> > full page image is new (the one for which we avoided the WAL entry
> > for).
> >
> > How about this:
> > Leave current WAL as it is and only add the not removeable flag to
> > full pages.
> > pg_compresslog then replaces the full page image with a record for
the
> > one tuple that is changed.
> > I tend to think it is not worth the increased complexity only to
save
> > bytes in the uncompressed WAL though.
>
> It is essentially what my patch proposes.  My patch includes
> flag to full page writes which "can be" removed.

Ok, a flag that marks full page images that can be removed is perfect.

But you also turn off the optimization that avoids writing regular
WAL records when the info is already contained in a full-page image
(increasing the
uncompressed size of WAL).
It was that part I questioned. As already stated, maybe I should not
have because
it would be too complex to reconstruct a regular WAL record from the
full-page image.
But that code would also be needed for WAL based partial replication, so
if it where too
complicated we would eventually want a switch to turn off the
optimization anyway
(at least for heap page changes).

> > Another point about pg_decompresslog:
> >
> > Why do you need a pg_decompresslog ? Imho pg_compresslog should
> > already do the replacing of the full_page with the dummy entry. Then

> > pg_decompresslog could be a simple gunzip, or whatever compression
was
> > used, but no logic.
>
> Just removing full page writes does not work.   If we shift the rest
of
> the WAL, then LSN becomes inconsistent in compressed archive logs
which
> pg_compresslog produces.   For recovery, we have to restore LSN as the

> original WAL.   Pg_decompresslog restores removed full page writes as
a
> dumm records so that recovery redo functions won't be confused.

Ah sorry, I needed some pgsql/src/backend/access/transam/README reading.

LSN is the physical position of records in WAL. Thus your dummy record
size is equal to what you cut out of the original record.
What about disconnecting WAL LSN from physical WAL record position
during replay ?
Add simple short WAL records in pg_compresslog like: advance LSN by 8192
bytes.

Andreas

pgsql-patches by date:

Previous
From: "Pavan Deolasee"
Date:
Subject: Re: Dead Space Map version 3 (simplified)
Next
From: Magnus Hagander
Date:
Subject: Re: [pgsql-patches] O_DIRECT support for Windows