Re: Logical replication 'invalid memory alloc request size 1585837200' after upgrading to 17.5
Amit Kapila <amit.kapila16@gmail.com>
From: Amit Kapila <amit.kapila16@gmail.com>
To: "Hayato Kuroda (Fujitsu)" <kuroda.hayato@fujitsu.com>
Cc: Masahiko Sawada <sawada.mshk@gmail.com>,
Duncan Sands <duncan.sands@deepbluecap.com>, "pgsql-bugs@lists.postgresql.org" <pgsql-bugs@lists.postgresql.org>
Date: 2025-05-26T11:18:56Z
Lists: pgsql-bugs
On Mon, May 26, 2025 at 2:52 PM Hayato Kuroda (Fujitsu) <kuroda.hayato@fujitsu.com> wrote: > > > If the above hypothesis is true, we need to consider another idea so > > that we can execute invalidation messages in both cases. > > The straightforward fix is to check the change queue as well when the transaction > has invalidation messages. 0003 implemented that. One downside is that traversing > changes can affect performance. Currently we iterates all of changes even a > single REORDER_BUFFER_CHANGE_INVALIDATION. I cannot find better solutions for now. > It can impact the performance for large transactions with fewer invalidations, especially the ones which has spilled changes because it needs to traverse the entire list of changes again at the end. The other idea would be to add new member(s) in ReorderBufferTXN to receive distributed invalidations. For adding the new member in ReorderBufferTXN: (a) in HEAD, it should be okay, (b) for backbranches, we may be able to add at the end, but we should check if there are any extensions using sizeof(ReorderBufferTxn) and if they are using what we need to do. I think the new member could be similar to existing members (uint32 ninvalidations; and SharedInvalidationMessage *invalidations;) or a separate change queue of only REORDER_BUFFER_CHANGE_INVALIDATION messages. The second one is worth considering because multiple transactions can distribute their invalidations to a single txn in chunks, which can be stored as separate changes, and the other benefit of the second one is lower risk of the need for a larger chunk of memory allocation due to repalloc. Also, it would be easy to consider its size via ReorderBufferChangeMemoryUpdate. -- With Regards, Amit Kapila.
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix cache-dependent test failures in logical decoding.
- 87819f766f37 13.22 landed
-
Fix re-distributing previously distributed invalidation messages during logical decoding.
- d87d07b7ad3b 18.0 landed
- 45c357e0e85d 17.6 landed
- b2ae077205e1 16.10 landed
- fc0fb77c550f 15.14 landed
- 983b3636259b 14.19 landed
- 1230be12f086 13.22 landed
-
Fix data loss in logical replication.
- 247ee94150b6 13.21 cited
- 4909b38af034 18.0 cited