In talking to Teodor this week, I have written the attached C comment patch which improves our description of GiST's NSN and GistBuildLSN values.
-- Bruce Momjian <br...@momjian.us> https://momjian.us EDB https://enterprisedb.com The usefulness of a cup is in its emptiness, Bruce Lee
>From defd16776c8016179a87c3d32ed359570c62727d Mon Sep 17 00:00:00 2001 From: Bruce Momjian <br...@momjian.us> Date: Tue, 2 Mar 2021 11:38:14 -0500 Subject: [PATCH] gist squash commit --- src/backend/access/gist/README | 1 + src/include/access/gist.h | 15 +++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/backend/access/gist/README b/src/backend/access/gist/README index 8ca0cf78cc..25cab0047b 100644 --- a/src/backend/access/gist/README +++ b/src/backend/access/gist/README @@ -10,6 +10,7 @@ GiST stands for Generalized Search Tree. It was introduced in the seminal paper Jeffrey F. Naughton, Avi Pfeffer: http://www.sai.msu.su/~megera/postgres/gist/papers/gist.ps + https://dsf.berkeley.edu/papers/sigmod97-gist.pdf and implemented by J. Hellerstein and P. Aoki in an early version of PostgreSQL (more details are available from The GiST Indexing Project diff --git a/src/include/access/gist.h b/src/include/access/gist.h index aa5f1763dd..4b06575d98 100644 --- a/src/include/access/gist.h +++ b/src/include/access/gist.h @@ -51,13 +51,20 @@ #define F_HAS_GARBAGE (1 << 4) /* some tuples on the page are dead, * but not deleted yet */ -/* NSN - node sequence number, a special-purpose LSN */ +/* + * NSN (node sequence number) is a special-purpose LSN which is stored on each + * index page in GISTPageOpaqueData and updated only during page splits. By + * recording the parent's LSN in GISTSearchItem.parentlsn, it is possible to + * detect concurrent child page splits by checking if parentlsn < child's NSN, + * and handle them properly. The child page's LSN is insufficient for this + * purpose since it is updated for every page change. + */ typedef XLogRecPtr GistNSN; /* - * A bogus LSN / NSN value used during index build. Must be smaller than any - * real or fake unlogged LSN, so that after an index build finishes, all the - * splits are considered completed. + * A fake LSN / NSN value used during index builds. Must be smaller than any + * real or fake (unlogged) LSN generated after the index build completes so + * that all splits are considered complete. */ #define GistBuildLSN ((XLogRecPtr) 1) -- 2.20.1