Received: from localhost (unknown [200.46.204.183]) by postgresql.org (Postfix) with ESMTP id 2C57C6500BD for ; Wed, 23 Jul 2008 17:08:28 -0300 (ADT) Received: from postgresql.org ([200.46.204.86]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 19647-07 for ; Wed, 23 Jul 2008 17:08:21 -0300 (ADT) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from sss.pgh.pa.us (sss.pgh.pa.us [66.207.139.130]) by postgresql.org (Postfix) with ESMTP id 6B82364FCD2 for ; Wed, 23 Jul 2008 17:08:23 -0300 (ADT) Received: from sss2.sss.pgh.pa.us (tgl@localhost [127.0.0.1]) by sss.pgh.pa.us (8.14.2/8.14.2) with ESMTP id m6NK8MOe008994; Wed, 23 Jul 2008 16:08:22 -0400 (EDT) To: Teodor Sigaev cc: Pgsql Hackers Subject: Re: [PATCHES] GIN improvements In-reply-to: <487A6E0C.3090600@sigaev.ru> References: <483FD205.4090904@sigaev.ru> <486BC501.6060605@sigaev.ru> <27880.1215810535@sss.pgh.pa.us> <487A6E0C.3090600@sigaev.ru> Comments: In-reply-to Teodor Sigaev message dated "Mon, 14 Jul 2008 01:05:16 +0400" MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0" Content-ID: <8964.1216843685.0@sss.pgh.pa.us> Date: Wed, 23 Jul 2008 16:08:21 -0400 Message-ID: <8993.1216843701@sss.pgh.pa.us> From: Tom Lane X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0 tagged_above=0 required=5 tests=none X-Spam-Level: X-Archive-Number: 200807/1089 X-Sequence-Number: 121349 ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset="us-ascii" Content-ID: <8964.1216843685.1@sss.pgh.pa.us> Teodor Sigaev writes: > Updated: http://www.sigaev.ru/misc/fast_insert_gin-0.9.gz Here is the GIN fast-insert patch back again. Changes: * Sync with CVS HEAD * Clean up documentation and some of the code comments * Fix up custom reloptions code * Suppress some compiler warnings I didn't get much further than that because I got discouraged after looking at the locking issues around the pending-insertions list. It's a mess: * shiftList() holds an exclusive lock on metapage throughout its run, which means that it's impossible for two of them to run concurrently. So why bother with "concurrent deletion" detection? * shiftList does LockBufferForCleanup, which means that it can be blocked for an indefinitely long time by a concurrent scan, and since it's holding exclusive lock on metapage no new scans or insertions can start meanwhile. This is not only horrid from a performance standpoint but it very probably can result in deadlocks --- which will be deadlocks on LWLocks and thus not even detected by the system. * GIN index scans release lock and pin on one pending-list page before acquiring pin and lock on the next, which means there's a race condition: shiftList could visit and delete the next page before we get to it, because there's a window where we're holding no buffer lock at all. I think this isn't fatal in itself, since presumably the data in the next page has been moved into the main index and we can scan it later, but the scan code isn't checking whether the page has been deleted out from under it. * It seems also possible that once a list page has been marked GIN_DELETED, it could be re-used for some other purpose before a scan-in-flight reaches it -- reused either as a regular index page or as a new list page. Neither case is being defended against. It might be that the new-list-page case isn't a problem, or it might not. * There is a bigger race condition, which is that after a scan has returned a tuple from a pending page, vacuum could move the index entry into the main index structure, and then that same scan could return that same index entry a second time. This is a no-no, and I don't see any easy fix. I haven't really finished reviewing this code, but I'm going to bounce it back to you to see if you can solve the locking problems. Unless that can be made safe there is no point doing any more work on this patch. regards, tom lane ------- =_aaaaaaaaaa0 Content-Type: application/octet-stream Content-ID: <8964.1216843685.2@sss.pgh.pa.us> Content-Description: fast_insert_gin-0.10.patch.gz Content-Transfer-Encoding: base64 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 ------- =_aaaaaaaaaa0--