Re: MarkBufferDirty Assert held LW_EXCLUSIVE lock fail when ginFinishSplit
Heikki Linnakangas <hlinnaka@iki.fi>
From: Heikki Linnakangas <hlinnaka@iki.fi>
To: feichanghong <feichanghong@qq.com>, Michael Paquier <michael@paquier.xyz>
Cc: pgsql-bugs <pgsql-bugs@lists.postgresql.org>
Date: 2024-01-22T16:01:03Z
Lists: pgsql-bugs
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix locking when fixing an incomplete split of a GIN internal page
- e6511fe649c5 12.18 landed
- e74c916657b5 13.14 landed
- f120c0872427 14.11 landed
- e43425f48154 15.6 landed
- b899e00e716b 16.2 landed
- 6a1ea02c491d 17.0 landed
-
Add backend support for injection points
- d86d20f0ba79 17.0 cited
Attachments
- v2-0001-Fix-locking-when-fixing-an-incomplete-split-of-a-.patch (text/x-patch) patch v2-0001
(Adding Michael for the fault-injection parts) On 22/01/2024 17:27, feichanghong wrote: > Thank you for your attention. > >> Thanks, I'll look into this. The fix seems fine at a quick glance, but >> I'll think about the performance aspect a bit more. From a performance point of view, this doesn't matter. Incomplete split are extremely rare. For convenience, though, I added a new function specifically for handling these "leftover" incomplete splits as opposed to finishing a split that you just made, which performs the lock-upgrade. See attached. I think that helps with readability, and makes it less likely that we'll forget the lock-upgrade in the future if the insertion code is refactored. > I apologize for the mistake in my patch: "if > GinPageIsIncompleteSplit(page)" is > missing a parenthesis, it should be "if (GinPageIsIncompleteSplit(page))" > >> Another way to create a scenario with incomplete splits, which doesn't >> involve any crashes or errors, would be to perform PITR to just >> between the insert and the finish-split records. But the >> fault-injection seems easier. > I agree it, fault-injection is easier than PITR. The attached patch contains a test case using the fault-injection facility. Michael, it was a pleasure to write this test with the injection points, compared to trying to set up PITR at just the right moment. Thank you! Since this is the first test that uses it, I didn't have any precedence to copy-paste; can you take a look and verify if this is how you imagined the facility to be used? -- Heikki Linnakangas Neon (https://neon.tech)