Re: BUG #17774: Assert triggered on brin_minmax_multi.c

Поиск
Список
Период
Сортировка
От Dmitry Dolgov
Тема Re: BUG #17774: Assert triggered on brin_minmax_multi.c
Дата
Msg-id 20230208100658.mz2kkeruoma6iqtw@ddolgov.remote.csb
обсуждение исходный текст
Ответ на Re: BUG #17774: Assert triggered on brin_minmax_multi.c  (John Naylor <john.naylor@enterprisedb.com>)
Ответы Re: BUG #17774: Assert triggered on brin_minmax_multi.c  (Dmitry Dolgov <9erthalion6@gmail.com>)
Re: BUG #17774: Assert triggered on brin_minmax_multi.c  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-bugs
> On Wed, Feb 08, 2023 at 04:26:49PM +0700, John Naylor wrote:
> On Mon, Feb 6, 2023 at 3:06 PM PG Bug reporting form <noreply@postgresql.org>
> wrote:
> > This assert() is not easily reproducible, but thought the backtraces may
> be
> > interesting.
> >
> > TRAP: FailedAssertion("(delta >= 0) && (delta <= 1)", File:
> > "brin_minmax_multi.c", Line: 2393, PID: 2922100)
>
> > #2  0x000055e143f0ae8b in ExceptionalCondition (
> >     conditionName=0x55e143f92604 "(delta >= 0) && (delta <= 1)",
> >     errorType=0x55e143f91ef4 "FailedAssertion",
> >     fileName=0x55e143f91ee0 "brin_minmax_multi.c", lineNumber=2393)
> >     at assert.c:69
> > No locals.
> > #3  0x000055e1437e8972 in brin_minmax_multi_distance_inet (
> >     fcinfo=0x7ffc448234f0) at brin_minmax_multi.c:2393
> >         delta = -2.3283064365386963e-10
> >         i = -1
> >         len = 4
> >         addra = 0x55e14ee95fc0 ""
> >         addrb = 0x55e14ee95fe0 ""
> >         ipa = 0x55e14d95a1e0
> >         ipb = 0x55e149a6fdc8
> >         lena = 0
> >         lenb = 32
>
> Thanks for the report! From the stack trace we can see that it computed a
> negative delta, coming from:
>
> /* Calculate the difference between the addresses. */
> delta = 0;
> for (i = len - 1; i >= 0; i--)
> {
>   unsigned char a = addra[i];
>   unsigned char b = addrb[i];
>
>   delta += (float8) b - (float8) a;
>   delta /= 256;
> }
> Assert((delta >= 0) && (delta <= 1));
>
> I wonder if it needs to be something like "delta += Abs((float8) b -
> (float8) a);".

The negative delta might be only a consequence. From what I see it's
called from build_distances, and the idea is to find the gaps between
the max value of the current interval and the min value of the next one,
so they should be ordered and delta should be always positive.

In fact, I've just reproduced it by randomly inserting some inets into
the test table, let me see if I can get a stable reproducer.



В списке pgsql-bugs по дате отправления:

Предыдущее
От: John Naylor
Дата:
Сообщение: Re: BUG #17774: Assert triggered on brin_minmax_multi.c
Следующее
От: Dmitry Dolgov
Дата:
Сообщение: Re: BUG #17774: Assert triggered on brin_minmax_multi.c