From: | John Naylor <johncnaylorls(at)gmail(dot)com> |
---|---|
To: | Masahiko Sawada <sawada(dot)mshk(at)gmail(dot)com> |
Cc: | PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>, Nathan Bossart <nathandbossart(at)gmail(dot)com>, Andres Freund <andres(at)anarazel(dot)de>, Matthias van de Meent <boekewurm+postgres(at)gmail(dot)com>, Yura Sokolov <y(dot)sokolov(at)postgrespro(dot)ru> |
Subject: | Re: [PoC] Improve dead tuple storage for lazy vacuum |
Date: | 2023-12-08 04:37:17 |
Message-ID: | CANWCAZZRmjkTz1d+_dMDBUuFTQKF-qrEyPTdnkQ3SNhUAp1nTg@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On Fri, Dec 8, 2023 at 8:57 AM Masahiko Sawada <sawada(dot)mshk(at)gmail(dot)com> wrote:
> It's still unclear to me why the value doesn't need to contain the size.
>
> If I understand you correctly, in RT_GET(), the tree allocs a new
> memory and updates the slot where the value is embedded with the
> pointer to the allocated memory, and returns the pointer to the
> caller. Since the returned value, newly allocated memory, is still
> empty, the callner needs to copy the contents of the old value to the
> new value and do whatever else it needs to.
>
> If the value is already a single-leave value and RT_GET() is called
> with a larger size, the slot is always replaced with the newly
> allocated area and the caller needs to copy the contents? If the tree
> does realloc the value with a new size, how does the tree know the new
> value is larger than the existing value? It seems like the caller
> needs to provide a function to calculate the size of the value based
> on the length.
Right. My brief description mentioned one thing without details: The
caller would need to control whether to re-alloc. RT_GET would pass
the size. If nothing is found, the tree would allocate. If there is a
value already, just return it. That means both the address of the
slot, and the local pointer to the value (with embedded, would be the
same address). The caller checks if the array is long enough. If not,
call a new function that takes the new size, the address of the slot,
and the pointer to the old value. The tree would re-alloc, put the
alloc pointer in the slot and return the new local pointer. But as we
agreed, that is all follow-up work.
From | Date | Subject | |
---|---|---|---|
Next Message | Andrei Lepikhov | 2023-12-08 04:37:27 | Re: Assert failure on 'list_member_ptr(rel->joininfo, restrictinfo)' |
Previous Message | Tom Lane | 2023-12-08 04:10:45 | Re: micro-optimizing json.c |