Re: [Patch] Optimize dropping of relation buffers using dlist
Amit Kapila <amit.kapila16@gmail.com>
From: Amit Kapila <amit.kapila16@gmail.com>
To: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Cc: k.jamison@fujitsu.com, "Tsunakawa,
Takayuki" <tsunakawa.takay@fujitsu.com>, Andres Freund <andres@anarazel.de>, Tom Lane <tgl@sss.pgh.pa.us>, Thomas Munro <thomas.munro@gmail.com>, Robert Haas <robertmhaas@gmail.com>, Tomas Vondra <tomas.vondra@2ndquadrant.com>,
pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2020-12-08T01:43:41Z
Lists: pgsql-hackers
On Tue, Dec 8, 2020 at 6:23 AM Kyotaro Horiguchi <horikyota.ntt@gmail.com> wrote: > > At Tue, 08 Dec 2020 09:45:53 +0900 (JST), Kyotaro Horiguchi <horikyota.ntt@gmail.com> wrote in > > At Mon, 7 Dec 2020 17:18:31 +0530, Amit Kapila <amit.kapila16@gmail.com> wrote in > > > Hmm, how is it possible if Insert is done before Truncate? The insert > > > should happen in old RelFileNode only. I have verified by adding a > > > break-in (while (1), so that it stops there) heap_xlog_insert and > > > DropRelFileNodesAllBuffers(), and both get the same (old) RelFileNode. > > > How have you verified what you are saying? > > > > You might be thinking of in-transaction sequence of > > Inert-truncate. What *I* mention before is truncation of a relation > > that smgrnblocks() has already been called for. The most common way > > to make it happen was INSERTs *before* the truncating transaction > > starts. What I have tried is Insert and Truncate in separate transactions like below: postgres=# insert into mytbl values(1); INSERT 0 1 postgres=# truncate mytbl; TRUNCATE TABLE After above, manually killed the server, and then during recovery, we have called heap_xlog_insert() and DropRelFileNodesAllBuffers() and at both places, RelFileNode is the same and I don't see any reason for it to be different. > > It may be a SELECT on a hot-standby. Sorry for the confusing > > expression. > > And ,to make sure, it is a bit off from the point of the discussion as > I noted. I just meant that the proposition that "smgrnblokcs() always > returns false for "cached" when it is called in > DropRelFileNodesAllBuffers()" doesn't always holds. > Right, I feel in some cases the 'cached' won't be true like if we would have done Checkpoint after Insert in the above case (say when the only WAL to replay during recovery is of Truncate) but I think that should be fine. What do you think? -- With Regards, Amit Kapila.
Commits
-
Fix size overflow in calculation introduced by commits d6ad34f3 and bea449c6.
- 519e4c9ee21a 14.0 landed
-
Optimize DropRelFileNodesAllBuffers() for recovery.
- bea449c635c0 14.0 landed
-
Optimize DropRelFileNodeBuffers() for recovery.
- d6ad34f3410f 14.0 landed
-
Cache smgrnblocks() results in recovery.
- c5315f4f4484 14.0 cited
-
Add a check to prevent overwriting valid data if smgrnblocks() gives a
- ffae5cc5a602 8.2.0 cited