On Tue, Feb 28, 2023 at 3:42 PM John Naylor
<john.nay...@enterprisedb.com> wrote:
>
>
> On Fri, Feb 24, 2023 at 12:50 PM Masahiko Sawada <sawada.m...@gmail.com> 
> wrote:
> >
> > On Wed, Feb 22, 2023 at 6:55 PM John Naylor
> > <john.nay...@enterprisedb.com> wrote:
> > >
> > > That doesn't seem useful to me. If we've done enough testing to reassure 
> > > us the new way always gives the same answer, the old way is not needed at 
> > > commit time. If there is any doubt it will always give the same answer, 
> > > then the whole patchset won't be committed.
>
> > My idea is to make the bug investigation easier but on
> > reflection, it seems not the best idea given this purpose.
>
> My concern with TIDSTORE_DEBUG is that it adds new code that mimics the old 
> tid array. As I've said, that doesn't seem like a good thing to carry forward 
> forevermore, in any form. Plus, comparing new code with new code is not the 
> same thing as comparing existing code with new code. That was my idea 
> upthread.
>
> Maybe the effort my idea requires is too much vs. the likelihood of finding a 
> problem. In any case, it's clear that if I want that level of paranoia, I'm 
> going to have to do it myself.
>
> > What do you think
> > about the attached patch? Please note that it also includes the
> > changes for minimum memory requirement.
>
> Most of the asserts look logical, or at least harmless.
>
> - int max_off; /* the maximum offset number */
> + OffsetNumber max_off; /* the maximum offset number */
>
> I agree with using the specific type for offsets here, but I'm not sure why 
> this change belongs in this patch. If we decided against the new asserts, 
> this would be easy to lose.

Right. I'll separate this change as a separate patch.

>
> This change, however, defies common sense:
>
> +/*
> + * The minimum amount of memory required by TidStore is 2MB, the current 
> minimum
> + * valid value for the maintenance_work_mem GUC. This is required to 
> allocate the
> + * DSA initial segment, 1MB, and some meta data. This number is applied also 
> to
> + * the local TidStore cases for simplicity.
> + */
> +#define TIDSTORE_MIN_MEMORY (2 * 1024 * 1024L) /* 2MB */
>
> + /* Sanity check for the max_bytes */
> + if (max_bytes < TIDSTORE_MIN_MEMORY)
> + elog(ERROR, "memory for TidStore must be at least %ld, but %zu provided",
> + TIDSTORE_MIN_MEMORY, max_bytes);
>
> Aside from the fact that this elog's something that would never get past 
> development, the #define just adds a hard-coded copy of something that is 
> already hard-coded somewhere else, whose size depends on an implementation 
> detail in a third place.
>
> This also assumes that all users of tid store are limited by 
> maintenance_work_mem. Andres thought of an example of some day unifying with 
> tidbitmap.c, and maybe other applications will be limited by work_mem.
>
> But now that I'm looking at the guc tables, I am reminded that work_mem's 
> minimum is 64kB, so this highlights a design problem: There is obviously no 
> requirement that the minimum work_mem has to be >= a single DSA segment, even 
> though operations like parallel hash and parallel bitmap heap scan are 
> limited by work_mem.

Right.

>  It would be nice to find out what happens with these parallel features when 
> work_mem is tiny (maybe parallelism is not even considered?).

IIUC both don't care about the allocated DSA segment size. Parallel
hash accounts actual tuple (+ header) size as used memory but doesn't
consider how much DSA segment is allocated behind. Both parallel hash
and parallel bitmap scan can work even with work_mem = 64kB, but when
checking the total DSA segment size allocated during these operations,
it was 1MB.

I realized that there is a similar memory limit design issue also on
the non-shared tidstore cases. We deduct 70kB from max_bytes but it
won't work fine with work_mem = 64kB.  Probably we need to reconsider
it. FYI 70kB comes from the maximum slab block size for node256.

Regards,

-- 
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com


Reply via email to