Re: Strange coding in _mdfd_openseg()

From: Thomas Munro <thomas(dot)munro(at)gmail(dot)com>
To: Kyotaro HORIGUCHI <horiguchi(dot)kyotaro(at)lab(dot)ntt(dot)co(dot)jp>
Cc: pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Strange coding in _mdfd_openseg()
Date: 2019-04-03 20:24:49
Message-ID: CA+hUKGJHX9q43g=aBSaQwbNLhLpqiGWHbzgPz8bt5ihWzAv-=g@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Wed, Apr 3, 2019 at 5:34 PM Kyotaro HORIGUCHI
<horiguchi(dot)kyotaro(at)lab(dot)ntt(dot)co(dot)jp> wrote:
> I may be missing something, but it seems possible that
> _mdfd_getseg calls it with segno > opensegs.
>
> | for (nextsegno = reln->md_num_open_segs[forknum];

Here nextsegno starts out equal to opensegs.

> | nextsegno <= targetseg; nextsegno++)

Here we add one to nextsegno...

> | ...
> | v = _mdfd_openseg(reln, forknum, nextsegno, flags);

... after adding one to opensegs. So they're always equal. This fits
a general programming pattern when appending to an array, the next
element's index is the same as the number of elements. But I claim
the coding is weird, because _mdfd_openseg's *looks* like it can
handle opening segments in any order, except that the author
accidentally wrote "<=" instead of ">=". In fact it can't open them
in any order, because we don't support "holes" in the array. So I
think it should really be "==", and it should be an assertion, not a
condition.

--
Thomas Munro
https://enterprisedb.com

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Jeff Janes 2019-04-03 20:42:14 Re: pg_upgrade: Pass -j down to vacuumdb
Previous Message legrand legrand 2019-04-03 20:22:24 Re: minimizing pg_stat_statements performance overhead