RE: [Patch] Optimize dropping of relation buffers using dlist

tsunakawa.takay@fujitsu.com <tsunakawa.takay@fujitsu.com>

From: "tsunakawa.takay@fujitsu.com" <tsunakawa.takay@fujitsu.com>
To: "k.jamison@fujitsu.com" <k.jamison@fujitsu.com>
Cc: 'Thomas Munro' <thomas.munro@gmail.com>, Kyotaro Horiguchi <horikyota.ntt@gmail.com>, Amit Kapila <amit.kapila16@gmail.com>, Tom Lane <tgl@sss.pgh.pa.us>, Andres Freund <andres@anarazel.de>, Robert Haas <robertmhaas@gmail.com>, Tomas Vondra <tomas.vondra@2ndquadrant.com>, pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2020-10-29T02:08:02Z
Lists: pgsql-hackers
The patch looks almost good except for the minor ones:

(1)
+	for (i = 0; i < nnodes; i++)
+	{
+		RelFileNodeBackend rnode = smgr_reln[i]->smgr_rnode;
+
+		rnodes[i] = rnode;
+	}

You can write:

+	for (i = 0; i < nnodes; i++)
+		rnodes[i] = smgr_reln[i]->smgr_rnode;


(2)
+		if (!accurate || j >= MAX_FORKNUM ||

The correct condition would be:

+		if (j <= MAX_FORKNUM ||

because j becomes MAX_FORKNUM + 1 if accurate sizes for all forks could be obtained.  If any fork's size is inaccurate, j is <= MAX_FORKNUM when exiting the loop, so you don't need to test for accurate flag.


(3)
+		{
+			goto buffer_full_scan;
+			return;
+		}

return after goto cannot be reached, so this should just be:

+			goto buffer_full_scan;



Regards
Takayuki Tsunakawa

Commits

  1. Fix size overflow in calculation introduced by commits d6ad34f3 and bea449c6.

  2. Optimize DropRelFileNodesAllBuffers() for recovery.

  3. Optimize DropRelFileNodeBuffers() for recovery.

  4. Cache smgrnblocks() results in recovery.

  5. Add a check to prevent overwriting valid data if smgrnblocks() gives a