Re: GIN pending list clean up exposure to SQL - Mailing list pgsql-hackers
From | Julien Rouhaud |
---|---|
Subject | Re: GIN pending list clean up exposure to SQL |
Date | |
Msg-id | 56A92EA2.9000906@dalibo.com Whole thread Raw |
In response to | Re: GIN pending list clean up exposure to SQL (Fujii Masao <masao.fujii@gmail.com>) |
Responses |
Re: GIN pending list clean up exposure to SQL
Re: GIN pending list clean up exposure to SQL |
List | pgsql-hackers |
On 27/01/2016 10:27, Fujii Masao wrote: > On Mon, Jan 25, 2016 at 3:54 PM, Jeff Janes <jeff.janes@gmail.com> > wrote: >> On Wed, Jan 20, 2016 at 6:17 AM, Fujii Masao >> <masao.fujii@gmail.com> wrote: >>> On Sat, Jan 16, 2016 at 7:42 AM, Julien Rouhaud >>> <julien.rouhaud@dalibo.com> wrote: >>>> On 15/01/2016 22:59, Jeff Janes wrote: >>>>> On Sun, Jan 10, 2016 at 4:24 AM, Julien Rouhaud >>>>> <julien.rouhaud@dalibo.com> wrote: >>>> >>>> All looks fine to me, I flag it as ready for committer. >>> >>> When I compiled the PostgreSQL with the patch, I got the >>> following error. ISTM that the inclusion of pg_am.h header file >>> is missing in ginfast.c. >> >> Thanks. Fixed. >> >>> gin_clean_pending_list() must check whether the server is in >>> recovery or not. If it's in recovery, the function must exit >>> with an error. That is, IMO, something like the following check >>> must be added. >>> >>> if (RecoveryInProgress()) ereport(ERROR, >>> >>> (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), >>> errmsg("recovery is in progress"), errhint("GIN pending list >>> cannot be cleaned up during recovery."))); >>> >>> It's better to make gin_clean_pending_list() check whether the >>> target index is temporary index of other sessions or not, like >>> pgstatginindex() does. >> >> I've added both of these checks. Sorry I overlooked your early >> email in this thread about those. >> >>> >>> + Relation indexRel = index_open(indexoid, >>> AccessShareLock); >>> >>> ISTM that AccessShareLock is not safe when updating the pending >>> list and GIN index main structure. Probaby we should use >>> RowExclusiveLock? >> >> Other callers of the ginInsertCleanup function also do so while >> holding only the AccessShareLock on the index. It turns out >> that there is a bug around this, as discussed in "Potential GIN >> vacuum bug" >> (http://www.postgresql.org/message-id/flat/CAMkU=1xALfLhUUohFP5v33RzedLVb5aknNUjcEuM9KNBKrB6-Q@mail.gmail.com) >> >> >> But, that bug has to be solved at a deeper level than this patch. >> >> I've also cleaned up some other conflicts, and chose a more >> suitable OID for the new catalog function. >> >> The number of new header includes needed to implement this makes >> me wonder if I put this code in the correct file, but I don't see >> a better location for it. >> >> New version attached. > > Thanks for updating the patch! It looks good to me. > > Based on your patch, I just improved the doc. For example, I added > the following note into the doc. > > + These functions cannot be executed during recovery. + Use > of these functions is restricted to superusers and the owner + > of the given index. > > If there is no problem, I'm thinking to commit this version. > Just a detail: + Note that the cleanup does not happen and the return value is 0 + if the argument is the GIN index built with <literal>fastupdate</> + option disabled because it doesn't have a pending list. It should be "if the argument is *a* GIN index" I find this sentence a little confusing, maybe rephrase like this would be better: - Note that the cleanup does not happen and the return value is 0 - if the argument is the GIN index built with <literal>fastupdate</> - option disabled because it doesn't have a pending list. + Note that if the argument is a GIN index built with <literal>fastupdate</> + option disabled, the cleanup does not happen and the return value is 0 + because the index doesn't have a pending list. Otherwise, I don't see any problem on this version. Regards. > Regards, > > > > -- Julien Rouhaud http://dalibo.com - http://dalibo.org
pgsql-hackers by date: