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