Set right-links during sorted GiST index build.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 1 Oct 2020 08:10:43 +0000 (11:10 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 1 Oct 2020 08:10:43 +0000 (11:10 +0300)
This is not strictly necessary, as the right-links are only needed by
scans that are concurrent with page splits, and neither scans or page
splits can happen during sorted index build. But it seems like a good
idea to set them anyway, if we e.g. want to add a check to amcheck in
the future to verify that the chain of right-links is complete.

Author: Andrey Borodin
Discussion: https://www.postgresql.org/message-id/4D68C21F-9FB9-41DA-B663-FDFC8D143788%40yandex-team.ru

src/backend/access/gist/gistbuild.c

index 188e33642f3db009dbd5f5372e2aa3c44ab9ee50..28bc5855ad9fdef0d07d454bf7d38dcc16a92245 100644 (file)
@@ -540,6 +540,19 @@ gist_indexsortbuild_pagestate_flush(GISTBuildState *state,
        /* Re-initialize the page buffer for next page on this level. */
        pagestate->page = palloc(BLCKSZ);
        gistinitpage(pagestate->page, isleaf ? F_LEAF : 0);
+
+       /*
+        * Set the right link to point to the previous page. This is just for
+        * debugging purposes: GiST only follows the right link if a page is split
+        * concurrently to a scan, and that cannot happen during index build.
+        *
+        * It's a bit counterintuitive that we set the right link on the new page
+        * to point to the previous page, and not the other way round. But GiST
+        * pages are not ordered like B-tree pages are, so as long as the
+        * right-links form a chain through all the pages in the same level, the
+        * order doesn't matter.
+        */
+       GistPageGetOpaque(pagestate->page)->rightlink = blkno;
 }
 
 static void