Re: Opclass parameters of indexes lost after REINDEX CONCURRENTLY[

2021-10-31 Thread Michael Paquier
On Sat, Oct 30, 2021 at 09:26:35PM +0900, Michael Paquier wrote:
> Yeah, you are right that it would be better here to use
> get_attoptions() to grab a copy of each attribute's option directly
> from the catalogs.  We also do that for predicates and expressions.

While looking again at this one this morning, I have extended the
tests with more columns and some default values, then applied the
patch by using get_attoptions() to grab each attribute's options as of
add5cf2.  Predicates and expressions are grabbed through the syscache,
so that's just more consistent.
--
Michael


signature.asc
Description: PGP signature


Re: Opclass parameters of indexes lost after REINDEX CONCURRENTLY

2021-10-30 Thread Michael Paquier
On Sat, Oct 30, 2021 at 04:11:06AM -0700, Zhihong Yu wrote:
> Should datumCopy() be used inside the loop ? I saw the following
> in get_attoptions(Oid relid, int16 attnum):

Yeah, you are right that it would be better here to use
get_attoptions() to grab a copy of each attribute's option directly
from the catalogs.  We also do that for predicates and expressions.
--
Michael


signature.asc
Description: PGP signature


Re: Opclass parameters of indexes lost after REINDEX CONCURRENTLY

2021-10-30 Thread Zhihong Yu
On Sat, Oct 30, 2021 at 3:59 AM Zhihong Yu  wrote:

>
>
> On Sat, Oct 30, 2021 at 1:28 AM Michael Paquier 
> wrote:
>
>> Hi all,
>>
>> While reviewing the code for opclass parameters with indexes, I have
>> noticed that opclass parameters are lost after a concurrent reindex.
>> As we use a IndexInfo to hold the information of the new index when
>> creating a copy of the old one, it is just a matter of making sure
>> that ii_OpclassOptions is filled appropriately, but that was missed by
>> 911e702.
>>
>> Attached is a patch to fix the issue.  After a concurrent reindex, we
>> would not finish with a corrupted index, just with one rebuilt with
>> default opclass parameter values.
>>
>> Any objections or comments?
>> --
>> Michael
>>
> Hi,
>
> +   newInfo->ii_OpclassOptions = palloc0(sizeof(Datum) *
> +newInfo->ii_NumIndexAttrs);
>
> It seems we may not need to allocate these many entries (as shown by the
> concur_appclass_ind_2 example in the test).
> In the previous loop (starting line 1359), we can increment a counter
> which would finally tell us how many oldInfo->ii_OpclassOptions[i] is not
> NULL.
>
> Then that many entries can be allocated in the above code.
>
> Cheers
>
Hi,
Upon further look, my previous comment was premature. Please ignore that.

+   newInfo->ii_OpclassOptions[i] = oldInfo->ii_OpclassOptions[i];

Should datumCopy() be used inside the loop ? I saw the following
in get_attoptions(Oid relid, int16 attnum):

result = datumCopy(attopts, false, -1); /* text[] */

Cheers


Re: Opclass parameters of indexes lost after REINDEX CONCURRENTLY

2021-10-30 Thread Zhihong Yu
On Sat, Oct 30, 2021 at 1:28 AM Michael Paquier  wrote:

> Hi all,
>
> While reviewing the code for opclass parameters with indexes, I have
> noticed that opclass parameters are lost after a concurrent reindex.
> As we use a IndexInfo to hold the information of the new index when
> creating a copy of the old one, it is just a matter of making sure
> that ii_OpclassOptions is filled appropriately, but that was missed by
> 911e702.
>
> Attached is a patch to fix the issue.  After a concurrent reindex, we
> would not finish with a corrupted index, just with one rebuilt with
> default opclass parameter values.
>
> Any objections or comments?
> --
> Michael
>
Hi,

+   newInfo->ii_OpclassOptions = palloc0(sizeof(Datum) *
+newInfo->ii_NumIndexAttrs);

It seems we may not need to allocate these many entries (as shown by the
concur_appclass_ind_2 example in the test).
In the previous loop (starting line 1359), we can increment a counter which
would finally tell us how many oldInfo->ii_OpclassOptions[i] is not NULL.

Then that many entries can be allocated in the above code.

Cheers