Thread
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Don't release index root page pin in ginFindParents().
- 5a6937ec9d41 12.18 landed
- c859d688b18b 13.14 landed
- d900e74e0548 14.11 landed
- 4c73ec604844 15.6 landed
- f76b975d5887 16.2 landed
- 5c62ecf6ec3c 17.0 landed
-
Make ResourceOwners more easily extensible.
- b8bff07daa85 17.0 cited
-
Don't install ldap_password_func in meson
- e9f075f9a155 17.0 cited
-
Fix some regression tests for d3d55ce57136
- 9ba9c7074fa7 17.0 cited
-
Bug with GIN index over JSONB data: "ERROR: buffer 10112 is not owned by resource owner"
Jeff Janes <jeff.janes@gmail.com> — 2023-11-10T01:44:21Z
I was looking into a possible scalability problem with GIN indexes under concurrent insert, but instead I found an uncharacterized bug. One of the processes will occasionally throw an error "ERROR: buffer 10112 is not owned by resource owner Portal" where the buffer number changes from run to run. I've verified this with both 14.9 and 16.1, on ubuntu 22.04. I use an AWS m5.4xlarge machine, and haven't tried to verify it on anything else. I don't currently have any real hardware with enough CPUs to do a meaningful test. I've attached the "user data" file I feed to AWS to run the test, this one is for v14.9. The v16.1 is similar except I compile PostgreSQL myself (without JIT) rather than getting it from apt. I standup an ubuntu 22.04 m5.4xlarge machine with all the defaults, except changing the storage from 8GB to 80GB, and fed it the attached user data cloud init file. If you don't want to parse the meat out of the file, the core of the test is to run this command with some escalating level of concurrency in a loop. Each call just inserts one JSONB object with highly redundant keys (the same 10 keys present in every row) but a more distinctive value for each key. insert into j (j) select jsonb_object_agg(x::text, left(md5(random()::text),5)) from generate_series(1,10) f(x); I've never seen the error occur until the concurrency reaches at least 4, but sample size is too low for that to be definitive. Unless someone has some better idea, my next step will be to switch the column from jsonb to text[] and see if it exists there as well. I assume the synchronous_commit=off is needed because without it you couldn't accumulate enough trials to spot the bug, even though it would exist in that setting. I guess I could run the test on a machine with very fast SSD and leave synchronous_commit=on, but I'm not looking forward to the cost of renting a machine that can do that or figuring out how to configure it. I also haven't tried it with fastupdate on. I assume the test would not work because the pending list would grow without bound at high concurrencies (it would grow faster than a single-threaded cleaner could clean it) and so not seeing the bug would not mean it wasn't present. The test loops the insert for one minute, at each concurrency from 1 to 10, then starts over at -c 1 again. It seems like if you don't see the bug within the first 20 minutes (the first two 1-to-10 concurrency cycles) you are unlikely to see it at all. But that is more a hunch than a formal analysis. Cheers, Jeff
-
Re: Bug with GIN index over JSONB data: "ERROR: buffer 10112 is not owned by resource owner"
Junwang Zhao <zhjwpku@gmail.com> — 2023-11-10T03:42:08Z
On Fri, Nov 10, 2023 at 9:44 AM Jeff Janes <jeff.janes@gmail.com> wrote: > > I was looking into a possible scalability problem with GIN indexes under concurrent insert, but instead I found an uncharacterized bug. One of the processes will occasionally throw an error "ERROR: buffer 10112 is not owned by resource owner Portal" where the buffer number changes from run to run. > > I've verified this with both 14.9 and 16.1, on ubuntu 22.04. I use an AWS m5.4xlarge machine, and haven't tried to verify it on anything else. I don't currently have any real hardware with enough CPUs to do a meaningful test. > > I've attached the "user data" file I feed to AWS to run the test, this one is for v14.9. The v16.1 is similar except I compile PostgreSQL myself (without JIT) rather than getting it from apt. I standup an ubuntu 22.04 m5.4xlarge machine with all the defaults, except changing the storage from 8GB to 80GB, and fed it the attached user data cloud init file. > > If you don't want to parse the meat out of the file, the core of the test is to run this command with some escalating level of concurrency in a loop. Each call just inserts one JSONB object with highly redundant keys (the same 10 keys present in every row) but a more distinctive value for each key. > > insert into j (j) select jsonb_object_agg(x::text, left(md5(random()::text),5)) from generate_series(1,10) f(x); > > I've never seen the error occur until the concurrency reaches at least 4, but sample size is too low for that to be definitive. > > Unless someone has some better idea, my next step will be to switch the column from jsonb to text[] and see if it exists there as well. > > I assume the synchronous_commit=off is needed because without it you couldn't accumulate enough trials to spot the bug, even though it would exist in that setting. I guess I could run the test on a machine with very fast SSD and leave synchronous_commit=on, but I'm not looking forward to the cost of renting a machine that can do that or figuring out how to configure it. I also haven't tried it with fastupdate on. I assume the test would not work because the pending list would grow without bound at high concurrencies (it would grow faster than a single-threaded cleaner could clean it) and so not seeing the bug would not mean it wasn't present. > > The test loops the insert for one minute, at each concurrency from 1 to 10, then starts over at -c 1 again. It seems like if you don't see the bug within the first 20 minutes (the first two 1-to-10 concurrency cycles) you are unlikely to see it at all. But that is more a hunch than a formal analysis. > > Cheers, > > Jeff I can reproduce this by checking to e9f075f9a15593fe31c610e15cfc71a5fa281ede, but master seems ok since Heikki has some ResourceOwner related patch committed after that. -- Regards Junwang Zhao
-
Re: Bug with GIN index over JSONB data: "ERROR: buffer 10112 is not owned by resource owner"
Tom Lane <tgl@sss.pgh.pa.us> — 2023-11-10T04:31:02Z
Jeff Janes <jeff.janes@gmail.com> writes: > I was looking into a possible scalability problem with GIN indexes under > concurrent insert, but instead I found an uncharacterized bug. One of the > processes will occasionally throw an error "ERROR: buffer 10112 is not > owned by resource owner Portal" where the buffer number changes from run to > run. I am able to reproduce this in HEAD (8bfb231b4) on a not-that-big machine (M2 Mac Mini): pgbench: error: client 1 script 0 aborted in command 0 query 0: ERROR: buffer pin 0x1cab is not owned by resource owner Portal pgbench: error: Run was aborted; the above results are incomplete. FTR, I used the attached not-so-ubuntu-specific script, and a very vanilla assert-enabled build. However, it seems like there might be more than one bug. My first attempt died like this after a few minutes: TRAP: failed Assert("ref != NULL"), File: "bufmgr.c", Line: 2447, PID: 7177 0 postgres 0x0000000102caab74 ExceptionalCondition + 108 1 postgres 0x0000000102b46490 UnpinBuffer + 528 2 postgres 0x000000010282bae4 ginFinishSplit + 1700 3 postgres 0x00000001028368ac ginEntryInsert + 904 4 postgres 0x0000000102837194 gininsert + 472 5 postgres 0x00000001029bf77c ExecInsertIndexTuples + 552 6 postgres 0x00000001029ed0d4 ExecInsert + 1948 7 postgres 0x00000001029ebbfc ExecModifyTable + 1252 8 postgres 0x00000001029c0dc4 standard_ExecutorRun + 268 9 postgres 0x0000000102b86450 ProcessQuery + 160 10 postgres 0x0000000102b85afc PortalRunMulti + 396 11 postgres 0x0000000102b85478 PortalRun + 476 12 postgres 0x0000000102b8453c exec_simple_query + 1312 13 postgres 0x0000000102b82250 PostgresMain + 3452 That was while running a build of commit 9ba9c7074 from 25 October. After updating to current HEAD (8bfb231b4), I've not yet reproduced it. But I suspect that's just bad luck, because this doesn't look like anything we fixed in the last couple weeks. regards, tom lane -
Re: Bug with GIN index over JSONB data: "ERROR: buffer 10112 is not owned by resource owner"
Tom Lane <tgl@sss.pgh.pa.us> — 2023-11-13T02:42:27Z
I wrote: > Jeff Janes <jeff.janes@gmail.com> writes: >> I was looking into a possible scalability problem with GIN indexes under >> concurrent insert, but instead I found an uncharacterized bug. One of the >> processes will occasionally throw an error "ERROR: buffer 10112 is not >> owned by resource owner Portal" where the buffer number changes from run to >> run. > I am able to reproduce this in HEAD (8bfb231b4) on a not-that-big > machine (M2 Mac Mini): I have tracked down the cause of this: there is one code path in ginFindParents() that doesn't take the function's own advice to not release pin on the index's root page. The attached seems to fix it. AFAICS the bug goes clear back to the origin of GIN. > However, it seems like there might be more than one bug. My first > attempt died like this after a few minutes: > TRAP: failed Assert("ref != NULL"), File: "bufmgr.c", Line: 2447, PID: 7177 > ... > That was while running a build of commit 9ba9c7074 from 25 October. > After updating to current HEAD (8bfb231b4), I've not yet reproduced it. Nothing to see there: that is the same bug. The change in behavior is accounted for by the intervening commit b8bff07da, which re-ordered operations in bufmgr.c so that the lack of a resource manager entry would be noticed before hitting this Assert. I find it quite scary that, per the code coverage report, ginFindParents() isn't reached at all during our regression tests. And there are several other areas in ginbtree.c that aren't reached either. Even while running Jeff's test case, I can find no evidence that the freestack == false path in ginFinishSplit() is ever reached. There could be a pile of resource-mismanagement bugs similar to this one in there, and we'd never know it. Reaching this particular error requires a concurrent split of the index's root page, so it's surely not that easy to trigger. I wonder if there's anything we could do to make such cases more testable. regards, tom lane