Re: Is this a problem in GenericXLogFinish()?
Amit Kapila <amit.kapila16@gmail.com>
From: Amit Kapila <amit.kapila16@gmail.com>
To: Michael Paquier <michael@paquier.xyz>
Cc: Robert Haas <robertmhaas@gmail.com>, Jeff Davis <pgsql@j-davis.com>, Alexander Lakhin <exclusion@gmail.com>, Heikki Linnakangas <hlinnaka@iki.fi>,
pgsql-hackers@postgresql.org
Date: 2023-11-02T06:46:54Z
Lists: pgsql-hackers
Attachments
- fix_hash_squeeze_wal_1.patch (application/octet-stream) patch
On Wed, Nov 1, 2023 at 12:54 PM Michael Paquier <michael@paquier.xyz> wrote: > > On Mon, Oct 30, 2023 at 03:54:39PM +0530, Amit Kapila wrote: > > On Sat, Oct 28, 2023 at 4:30 PM Michael Paquier <michael@paquier.xyz> wrote: > >> On Sat, Oct 28, 2023 at 03:45:13PM +0530, Amit Kapila wrote: > >> > Yes, we need it to exclude any concurrent in-progress scans that could > >> > return incorrect tuples during bucket squeeze operation. > >> > >> Thanks. So I assume that we should just set REGBUF_NO_CHANGE when the > >> primary and write buffers are the same and there are no tuples to > >> move. Say with something like the attached? > > > > What if the primary and write buffer are not the same but ntups is > > zero? Won't we hit the assertion again in that case? > > The code tells that it should be able to handle such a case, > It should be possible when we encounter some page in between the chain that has all dead items and write buffer points to some page after the primary bucket page and before the read buffer page. > so this > would mean to set REGBUF_NO_CHANGE only when we have no tuples to > move: > - XLogRegisterBuffer(1, wbuf, REGBUF_STANDARD); > + /* > + * A cleanup lock is still required on the write buffer even > + * if there are no tuples to move, so it needs to be registered > + * in this case. > + */ > + wbuf_flags = REGBUF_STANDARD; > + if (xlrec.ntups == 0) > + wbuf_flags |= REGBUF_NO_CHANGE; > + XLogRegisterBuffer(1, wbuf, wbuf_flags); > Why register wbuf at all if there are no tuples to add and it is not the same as bucketbuf? Also, I think this won't be correct if prevbuf and wrtbuf are the same and also we have no tuples to add to wbuf. I have attached a naive and crude way to achieve it. This needs more work both in terms of trying to find a better way to change the code or ensure this won't break any existing case. I have just run the existing tests. Such a fix certainly required more testing. -- With Regards, Amit Kapila.
Commits
-
Fix inconsistency with replay of hash squeeze record for clean buffers
- f56a9def71bb 17.0 landed
-
Set LSN for wbuf in _hash_freeovflpage() iff wbuf is modified.
- aa5edbe379d6 17.0 landed
-
Fix an uninitialized access in hash_xlog_squeeze_page().
- f66fcc5cd616 17.0 landed
-
Use REGBUF_NO_CHANGE at one more place in the hash index.
- 861f86beea1c 17.0 landed
-
Assert that buffers are marked dirty before XLogRegisterBuffer().
- 00d7fb5e2e39 17.0 landed
-
Fix bug in GenericXLogFinish().
- 04f0baa85865 11.22 landed
- 6dbd01b9fdad 12.17 landed
- 469d367bee2f 13.13 landed
- 6615bb95af2d 14.10 landed
- b9bb02620d4b 15.5 landed
- b8963e8a2854 16.1 landed
- ef74c7197c04 17.0 landed
-
Improve hash index bucket split behavior.
- 6d46f4783efe 10.0 cited