Hi!

On Wed, 7 Aug 2024 at 16:24, Heikki Linnakangas <hlinn...@iki.fi> wrote:
>
> Many resource managers set up a temporary memory context which is reset
> after replaying the record. It seems a bit silly for each rmgr to do
> that on their own, so I propose that we do it in a centralized fashion.
> The attached patch creates one new temporary context and switches to it
> for each rm_redo() call.
>
> I was afraid of the overhead of the MemoryContextReset between each WAL
> record since this is a very hot codepath, but it doesn't seem to be
> noticeable. I used the attached scripts to benchmark it.
> redobench-setup.sh sets up a base backup and about 5 GB of WAL. The WAL
> consists of just tiny logical decoding messages, no real page
> modifications. The idea is that replaying that WAL should make any
> per-record overhead stand out as much as possible, since there's no real
> work to do. Use redobench.sh to perform the replay. I am not seeing any
> measurable difference this patch, so I think we're good. But if we
> needed to optimize, we could e.g. have an inlined fastpath version of
> MemoryContextReset for the common case that the context is empty, or
> only reset it every 100 records or something.
>
> This leaves no built-in rmgrs with any rm_startup or rm_clenaup hooks.
> Extensions might still use them, and they seem like they might be
> useful, so I kept them.
>
> There was no natural place to document this, so I added a brief
> explanation of rm_redo in the RmgrData comment, and then tacked the
> information about the memory context there too. I also added a note in
> "Custom WAL Resource Managers" section of the docs to point out that
> this changed in v18.
>
> (Why am I doing this now? I was browsing through all the global
> variables for the multithreading work, and these "opCtx"s caught my eye.
> This is in no way critical for multithreading though.)
>
> --
> Heikki Linnakangas
> Neon (https://neon.tech)

+1 on the idea, since this simplifies RMGR API for extension developers.

Compiler warns about `src/backend/access/transam/xlogrecovery.c:1860`,
where we switch to maybe-uninitialized memory context. Lets assign
this to something.


--
Best regards,
Kirill Reshke


Reply via email to