]> granicus.if.org Git - postgresql/commitdiff
Avoid some unnecessary block reads in WAL reader
authorMichael Paquier <michael@paquier.xyz>
Mon, 18 Feb 2019 00:52:02 +0000 (09:52 +0900)
committerMichael Paquier <michael@paquier.xyz>
Mon, 18 Feb 2019 00:52:02 +0000 (09:52 +0900)
When reading a new page internally and depending on the way the WAL
reader facility gets used by plugins, the current implementation of the
WAL reader may finish by reading a block multiple times while it is not
actually necessary as the requested data length may be equal to what has
been already read.  This can happen for any size, but is more likely to
happen at the end of a page.  This can cause performance penalties in
plugins which rely on the block reads to be purely sequential, zlib not
liking backward reads for example.  The new behavior also shaves some
cycles when doing recovery.

Author: Arthur Zakirov
Reviewed-by: Andrey Lepikhov, Michael Paquier, Grigory Smolkin
Discussion: https://postgr.es/m/2ddf4a32-517e-d6f4-d992-4a63b6035bfd@postgrespro.ru

src/backend/access/transam/xlogreader.c

index 69b6226f8f163e6a497033d5372a0797ef8d536e..cbc7e4e7eadc35a0c1740169927bb879a923f2f8 100644 (file)
@@ -536,7 +536,7 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen)
 
        /* check whether we have all the requested data already */
        if (targetSegNo == state->readSegNo && targetPageOff == state->readOff &&
-               reqLen < state->readLen)
+               reqLen <= state->readLen)
                return state->readLen;
 
        /*